首页 > 解决方案 > 无论如何在运行时向服务提供者添加服务?还是重建它?在 .NET 5.0 或 .NET core 3+ 上

问题描述

我有一个关于微服务架构设计的多租户应用程序。

我想注入 X 数量的服务,具体取决于运行的租户数量。

 public void ConfigureServices(IServiceCollection services)
    {
        // ... OTHER DI

        services.AddHttpClient("TenantsService")
            .AddTypedClient<ITenantServiceClient>(c => new TenantServiceClient(new TenantServiceClientSettings()
            {
                AccessKey = Configuration["TenantsService:ApiKey"],
                BaseUrl = new Uri(Configuration["TenantsService:Url"])
            }, c)); 

        foreach (var tenant in TenantsToRegister)
        {
            services
                .AddGraphQLServer($"{tenant.Name}");
        }

        ...

    }

如果我在应用程序启动时有租户列表,上面的代码就可以工作。但我需要从另一个微服务请求该列表。有了这个约束,我需要构建服务提供者才能获得该列表。同时,我需要服务提供者构建之前的列表来注入我需要的服务。

我看到的唯一选择是在运行时添加服务,但我不确定是否可行。

标签: .net.net-coregraphqlhotchocolate

解决方案


你有一个问题......你试图在多租户环境中垂直扩展。你会用 10 个租户做什么?100?单个节点上的单个进程需要大量内存(如果您 100% 确定您将拥有其中的一些,则可能不是这种情况),没有任何水平扩展的机会

我认为您可以从相同的图像为每个租户创建服务,但不同的配置和 api 网关/负载均衡器取决于...某些东西...(标头、查询参数、用户 ID 等)。它可能需要一些基础设施投资,但在未来不会是一个痛苦

如果您真的想从 http 客户端加载租户信息,然后为每个租户添加 HC gql 服务器,我建议您编写自己的IConfiguration提供程序。

这是 Consul 集成,它与您需要https://github.com/wintoncode/Winton.Extensions.Configuration.Consul具有相同的 http 往返。它添加自定义配置源并在启动时加载它

之后,您只需在启动时从配置中映射您的租户信息


推荐阅读