【问题标题】:One file startup for a many microservices一个文件启动多个微服务
【发布时间】:2020-06-16 17:01:28
【问题描述】:

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

【问题讨论】:

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

标签: c# asp.net-core .net-core asp.net-core-mvc microservices


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我通常将这种方法用于微服务项目。

    通常,您应该弄清楚您的服务在多大程度上共享功能。假设您所有的微服务都使用 Grpc 作为通信框架。在这种情况下,有一个共同的启动是完全有效的,您可以在其中注册依赖注入模块,这些模块提供配置和服务以启用通用 Grpc 逻辑。

    但是,您应该始终允许常见 Startup 的实施者附加自己的逻辑。也许您可以只创建一个公共基础,但允许您的实现者覆盖它并向其附加自定义逻辑。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        类抽象与 Base

        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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-13
          • 1970-01-01
          • 2019-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-05
          相关资源
          最近更新 更多