Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个微服务的一个文件启动_C#_Asp.net Core_.net Core_Asp.net Core Mvc_Microservices - Fatal编程技术网

C# 多个微服务的一个文件启动

C# 多个微服务的一个文件启动,c#,asp.net-core,.net-core,asp.net-core-mvc,microservices,C#,Asp.net Core,.net Core,Asp.net Core Mvc,Microservices,对于许多微服务,您如何看待单个文件启动实现?我有许多具有相同配置的微服务,如果我有一个具有特定配置的微服务,那么我将实施一个特定的启动。这取决于您的所有服务是否存在于一个存储库中,您可以创建共享项目,并在每个服务中使用。如果您有每个服务的存储库,最好的解决方案是创建私有nuget提要并在那里发布共享包,然后为每个服务添加私有nuget提要并使用它 我通常在微服务项目中使用这种方法 通常,您应该确定您的服务共享功能的程度。比方说,您的所有微服务都使用Grpc作为通信框架。在这种情况下,注册依赖注入

对于许多微服务,您如何看待单个文件启动实现?我有许多具有相同配置的微服务,如果我有一个具有特定配置的微服务,那么我将实施一个特定的启动。

这取决于您的所有服务是否存在于一个存储库中,您可以创建共享项目,并在每个服务中使用。如果您有每个服务的存储库,最好的解决方案是创建私有nuget提要并在那里发布共享包,然后为每个服务添加私有nuget提要并使用它

我通常在微服务项目中使用这种方法

通常,您应该确定您的服务共享功能的程度。比方说,您的所有微服务都使用Grpc作为通信框架。在这种情况下,注册依赖注入模块以提供配置和服务以启用公共Grpc逻辑的公共启动是完全有效的


但是,您应该始终允许公共启动的实现者在启动后附加自己的逻辑。也许你可以建立一个共同的基础,但允许您的实现者覆盖它并向其附加自定义逻辑。

您可以有一个公共启动,它提供每个微服务所需的非常基本的连接,然后可以通过ServiceCollection和HostBuilder上的扩展方法提供添加的功能,这些扩展方法可以通过共享库公开。我们在微服务机箱中采用了tat方法。

我的解决方案,如果它服务于任何人:

带基的类抽象

public abstract class BaseStartup
{
    #region Constructors

    protected BaseStartup(IConfiguration configuration, IWebHostEnvironment environment)
    {
        Configuration = configuration;
        Environment = environment;
    }

    #endregion

    protected IConfiguration Configuration { get; }

    protected IWebHostEnvironment Environment { get; }

    public virtual void ConfigureServices(IServiceCollection services)
    {
        services.AddHealthCheck(Configuration);
        services.AddExpressiveAnnotations();
        services.AddConsul(Configuration, Environment);
        services.AddApiClients(Configuration);
        services.AddConsulConfiguration(Configuration, Environment);
        services.AddHttpContextAccessor();
        services.AddControllers();
        services.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true));
        services.AddDbContextBaseContext(Configuration);
        services.AddScrutorServiceAndRepository();
    }

    public virtual void Configure(IApplicationBuilder app)
    {
        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseAuthorization();
        app.UseSwagger(Environment, Configuration);
        app.UseEndpointWithHealthService();
    }
}
以及微服务的启动:

/// <summary>
/// Principal class for configuration app from net core
/// </summary>
public class Startup : BaseStartup
{
    /// <summary>
    /// Constructor of Startup
    /// </summary>
    /// <param name="configuration"></param>
    /// <param name="environment"></param>
    public Startup(IConfiguration configuration, IWebHostEnvironment environment) : base(configuration, environment)
    {
    }


    /// <summary>
    /// IoC of .NET Core for inject dependecy injection 
    /// </summary>
    /// <param name="services"></param>
    public override void ConfigureServices(IServiceCollection services)
    {
        base.ConfigureServices(services);
        services.AddSwagger(configuration: Configuration,
                            assemblyName: Assembly.GetExecutingAssembly().GetName().Name,
                            baseDirectory: AppContext.BaseDirectory);
        services.AddAutoMapper(typeof(TsrAutoMapperConfig).GetTypeInfo().Assembly);

    }

    /// <summary>
    /// Principal method load all configuration and runing the app
    /// </summary>
    /// <param name="app"></param>
    public override void Configure(IApplicationBuilder app)
    {
        app.UseDeveloperExceptionPage(Environment);
        app.UseLogActivityMiddleware(nameof(ApiIngestTSR));
        app.UseLogExceptionMiddleware(Environment, nameof(ApiIngestTSR));
        base.Configure(app);
    }
}
//
///来自net core的配置应用程序的主体类
/// 
公共类启动:BaseStartup
{
/// 
///启动构造器
/// 
/// 
/// 
公共启动(IConfiguration配置,IWebHostEnvironment环境):基础(配置,环境)
{
}
/// 
///注入依赖注入的.NET内核的IoC
/// 
/// 
公共覆盖无效配置服务(IServiceCollection服务)
{
基本配置服务(服务);
services.AddSwagger(配置:配置,
assemblyName:Assembly.GetExecutionGassembly().GetName().Name,
baseDirectory:AppContext.baseDirectory);
AddAutoMapper(typeof(TsrAutoMapperConfig.GetTypeInfo().Assembly);
}
/// 
///主体方法加载所有配置并运行应用程序
/// 
/// 
公共覆盖无效配置(IApplicationBuilder应用程序)
{
app.usedeveloperceptionpage(环境);
app.UseLogActivityMiddleware(名称为(APIIgestSR));
app.UseLogExceptionMiddleware(环境,名称(APIIgestSR));
基本配置(app);
}
}

也许您想将所有公共逻辑提取到一个共享库中,并在所有项目中使用它?在.NET中,你总是想考虑可重用的组件,而不是可重用的代码文件。是的,我有一个具有功能的项目,但我希望开发人员的意见如果是一个好的实践,或者他们认为这个技术会引起一些问题,我没有想到,.NET没有真正提供任何方式来“共享”。跨多个项目编写代码文件,我不确定如何实现单文件启动实现。如果你的计划是在所有项目中复制同一个文件,那么你并没有真正共享任何东西。在我看来,每个MicroService都应该照顾好自己。更新一个服务启动不应影响另一个服务启动。然而,我们确实使用帮助程序库来进行一些默认连接,因为每个微服务都使用NServiceBus(例如)和相同的MessageQueue,但是,它们仍然使用帮助程序库拥有自己的启动文件,并且在需要时在其上添加任何特定需求。