尽管大多数人通常不需要,但这些指南展示了配置 .NET 可插拔组件的高级方法。
This is the multi-page printable view of this section. Click here to print.
Dapr 可插拔组件 .NET SDK 的高级用法
1 - .NET Dapr 可插拔组件中的多个服务
可插拔组件可以托管多种类型的多个组件。您可能需要这样做:
- 为了最小化集群中运行的边车数量
- 为了分组可能共享库和实现的相关组件,例如:
- 一个既作为通用状态存储公开的数据库,和
- 允许更特定操作的输出绑定。
每个 Unix 域套接字可以管理对每种类型的一个组件的调用。要托管相同类型的多个组件,您可以将这些类型分散到多个套接字上。SDK 将每个套接字绑定到一个"服务",每个服务由一种或多种组件类型组成。
注册多个服务
每次调用 RegisterService() 都会将一个套接字绑定到一组已注册的组件,其中每个服务可以注册每种类型的组件中的一个。
var app = DaprPluggableComponentsApplication.Create();
app.RegisterService(
"service-a",
serviceBuilder =>
{
serviceBuilder.RegisterStateStore<MyDatabaseStateStore>();
serviceBuilder.RegisterBinding<MyDatabaseOutputBinding>();
});
app.RegisterService(
"service-b",
serviceBuilder =>
{
serviceBuilder.RegisterStateStore<AnotherStateStore>();
});
app.Run();
class MyDatabaseStateStore : IStateStore
{
// ...
}
class MyDatabaseOutputBinding : IOutputBinding
{
// ...
}
class AnotherStateStore : IStateStore
{
// ...
}
配置多个组件
配置 Dapr 以使用托管组件与任何单个组件相同 - 组件 YAML 引用关联的套接字。
#
# 此组件使用与套接字 `state-store-a` 关联的状态存储
#
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: state-store-a
spec:
type: state.service-a
version: v1
metadata: []
#
# 此组件使用与套接字 `state-store-b` 关联的状态存储
#
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: state-store-b
spec:
type: state.service-b
version: v1
metadata: []
后续步骤
- 了解有关组件生命周期的更多信息
- 了解有关应用程序环境的更多信息
- 了解有关使用可插拔组件 .NET SDK 的更多信息:
2 - .NET Dapr 可插拔组件的应用环境
.NET Dapr 可插拔组件应用可以像 ASP.NET 应用一样配置依赖注入、日志和配置值。DaprPluggableComponentsApplication 暴露了一组与 WebApplicationBuilder 相似的配置属性。
依赖注入
注册到服务的组件可以参与依赖注入。在创建组件时,组件构造函数中的参数将被注入,前提是这些类型已在应用中注册。你可以通过 DaprPluggableComponentsApplication 暴露的 IServiceCollection 注册它们。
var app = DaprPluggableComponentsApplication.Create();
// 将 MyService 注册为 IService 的单例实现。
app.Services.AddSingleton<IService, MyService>();
app.RegisterService(
"<service name>",
serviceBuilder =>
{
serviceBuilder.RegisterStateStore<MyStateStore>();
});
app.Run();
interface IService
{
// ...
}
class MyService : IService
{
// ...
}
class MyStateStore : IStateStore
{
// 在创建状态存储时注入 IService。
public MyStateStore(IService service)
{
// ...
}
// ...
}
警告
不建议使用IServiceCollection.AddScoped()。此类实例的生命周期绑定到单个 gRPC 方法调用,这与单个组件实例的生命周期不匹配。日志
.NET Dapr 可插拔组件可以使用标准 .NET 日志机制。DaprPluggableComponentsApplication 暴露了一个 ILoggingBuilder,可以通过它进行配置。
注意
与 ASP.NET 一样,日志记录器服务(例如ILogger<T>)已预先注册。var app = DaprPluggableComponentsApplication.Create();
// 清除默认日志记录器并设置新的日志记录器。
app.Logging.ClearProviders();
app.Logging.AddConsole();
app.RegisterService(
"<service name>",
serviceBuilder =>
{
serviceBuilder.RegisterStateStore<MyStateStore>();
});
app.Run();
class MyStateStore : IStateStore
{
// 在创建状态存储时注入日志记录器。
public MyStateStore(ILogger<MyStateStore> logger)
{
// ...
}
// ...
}
配置值
由于 .NET 可插拔组件基于 ASP.NET 构建,它们可以使用其标准配置机制,并默认使用同一组预先注册的提供程序。DaprPluggableComponentsApplication 暴露了一个 IConfigurationManager,可以通过它进行配置。
var app = DaprPluggableComponentsApplication.Create();
// 清除默认配置提供程序并添加新的提供程序。
((IConfigurationBuilder)app.Configuration).Sources.Clear();
app.Configuration.AddEnvironmentVariables();
// 在启动时获取配置值。
const value = app.Configuration["<name>"];
app.RegisterService(
"<service name>",
serviceBuilder =>
{
serviceBuilder.RegisterStateStore<MyStateStore>();
});
app.Run();
class MyStateStore : IStateStore
{
// 在创建状态存储时注入配置。
public MyStateStore(IConfiguration configuration)
{
// ...
}
// ...
}
后续步骤
- 了解组件生命周期的更多信息
- 了解多服务的更多信息
- 了解如何使用可插拔组件 .NET SDK:
3 - .NET Dapr 可插拔组件的生命周期
有两种方式注册组件:
- 组件作为单例运行,其生命周期由 SDK 管理
- 组件的生命周期由可插拔组件决定,可根据需要为多实例或单例
单例组件
_按类型_注册的组件是单例:一个实例将为与该 socket 关联的该类型的所有已配置组件提供服务。当该类型仅存在单个组件且在 Dapr 应用程序之间共享时,此方法最佳。
var app = DaprPluggableComponentsApplication.Create();
app.RegisterService(
"service-a",
serviceBuilder =>
{
serviceBuilder.RegisterStateStore<SingletonStateStore>();
});
app.Run();
class SingletonStateStore : IStateStore
{
// ...
}
多实例组件
可以通过传递"工厂方法"来注册组件。对于与该 socket 关联的该类型的每个已配置组件,都会调用此方法。该方法返回要与该组件关联的实例(无论是否共享)。当同一类型的多个组件可能使用不同的元数据集进行配置,或需要将组件操作彼此隔离时,此方法最佳。
工厂方法将接收上下文,例如已配置的 Dapr 组件的 ID,可用于区分组件实例。
var app = DaprPluggableComponentsApplication.Create();
app.RegisterService(
"service-a",
serviceBuilder =>
{
serviceBuilder.RegisterStateStore(
context =>
{
return new MultiStateStore(context.InstanceId);
});
});
app.Run();
class MultiStateStore : IStateStore
{
private readonly string instanceId;
public MultiStateStore(string instanceId)
{
this.instanceId = instanceId;
}
// ...
}
后续步骤
- 了解有关应用程序环境的更多信息
- 了解有关多个服务的更多信息
- 了解有关使用可插拔组件 .NET SDK 的更多信息: