C# 多个微服务的一个文件启动
对于许多微服务,您如何看待单个文件启动实现?我有许多具有相同配置的微服务,如果我有一个具有特定配置的微服务,那么我将实施一个特定的启动。这取决于您的所有服务是否存在于一个存储库中,您可以创建共享项目,并在每个服务中使用。如果您有每个服务的存储库,最好的解决方案是创建私有nuget提要并在那里发布共享包,然后为每个服务添加私有nuget提要并使用它 我通常在微服务项目中使用这种方法 通常,您应该确定您的服务共享功能的程度。比方说,您的所有微服务都使用Grpc作为通信框架。在这种情况下,注册依赖注入模块以提供配置和服务以启用公共Grpc逻辑的公共启动是完全有效的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作为通信框架。在这种情况下,注册依赖注入
但是,您应该始终允许公共启动的实现者在启动后附加自己的逻辑。也许你可以建立一个共同的基础,但允许您的实现者覆盖它并向其附加自定义逻辑。您可以有一个公共启动,它提供每个微服务所需的非常基本的连接,然后可以通过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,但是,它们仍然使用帮助程序库拥有自己的启动文件,并且在需要时在其上添加任何特定需求。