是否有在运行时将服务添加到服务提供商?还是重建它?在.NET 5.0或.NET核心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}");
}
...
}

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

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

从架构的角度来看,我建议使用"真实的";为每个租户提供服务。例如,启动一个docker或每个租户的应用程序流程。就像以前的答案一样(感谢塞吉(。

如果您真的想在同一过程中为每个租户启动一个新的GraphQLServer,那么我会这样做:关于dotnet fiddle 的完整示例

services
.AddHttpClient("TenantsService")
.AddTypedClient<ITenantServiceClient>(c => 
new TenantServiceClient(new TenantServiceClientSettings
{
AccessKey = "THE KEY", // Configuration["TenantsService:ApiKey"], 
BaseUrl = new Uri("https://the-uri-you-need.com") // new Uri(Configuration["TenantsService:Url"])
}, c));

// build a temporary service provider before, with all services added until now.
var tempServiceProvider = services.BuildServiceProvider();
// resolve the tenant service and query for tenants
var tenantsToRegister = tempServiceProvider.GetRequiredService<ITenantServiceClient>().GetTenants();
// register needed tenants
foreach (var tenant in tenantsToRegister)
{
services.AddGraphQLServer($"{tenant}");
}

当然,必须添加围绕对ITenantServiceClient的调用的整个错误处理,但这只是为了演示目的。这里的特殊之处在于中间IServiceProvider,它使您能够使用全套DI来查询租户,但之后可以添加所需的DI。

但是:这也是在启动时,运行时不能添加其他服务器。

更新这是更新的dotnet fiddle(感谢joao figueira(

您有问题。。。您正在尝试在多租户环境中进行垂直扩展。你会和10个租户做什么?100?对于单个节点上的单个进程来说,这是一个巨大的ram(如果你100%确定你会有一些(,而没有任何机会横向扩展

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

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

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

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

最新更新