You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.6 KiB
5.6 KiB
LINGYUN.Abp.Dapr
Dapr 集成基础模块, 实现dapr文档中的命名单例DaprClient
See: https://docs.dapr.io/developing-applications/sdks/dotnet/dotnet-client/dotnet-daprclient-usage
功能特性
- 支持创建默认和具名DaprClient实例
- 支持配置HTTP和gRPC端点
- 支持自定义JSON序列化选项
- 支持Dapr API Token认证
- 支持gRPC通道配置
- 支持DaprClient实例配置和构建配置的扩展
- 支持多个Dapr Sidecar连接
- 支持自定义DaprClient行为
配置选项
{
"Dapr": {
"Client": {
"DaprApiToken": "your-api-token", // 可选,Dapr API Token
"HttpEndpoint": "http://localhost:3500", // 可选,HTTP端点
"GrpcEndpoint": "http://localhost:50001", // 可选,gRPC端点
"JsonSerializerOptions": { // 可选,JSON序列化选项
"PropertyNamingPolicy": "CamelCase",
"PropertyNameCaseInsensitive": true,
"WriteIndented": true,
"DefaultIgnoreCondition": "WhenWritingNull"
},
"GrpcChannelOptions": { // 可选,gRPC通道选项
"Credentials": "Insecure",
"MaxReceiveMessageSize": 1048576,
"MaxSendMessageSize": 1048576
}
}
}
}
配置使用
模块按需引用:
[DependsOn(typeof(AbpDaprModule))]
public class YouProjectModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// 创建一个DaprClient
context.Services.AddDaprClient();
// 创建一个具名DaprClient
context.Services.AddDaprClient("__DaprClient");
// 配置DaprClient选项
Configure<DaprClientFactoryOptions>(options =>
{
options.HttpEndpoint = "http://localhost:3500";
options.GrpcEndpoint = "http://localhost:50001";
options.DaprApiToken = "your-api-token";
// 添加DaprClient配置动作
options.DaprClientActions.Add(client =>
{
// 配置DaprClient实例
});
// 添加DaprClientBuilder配置动作
options.DaprClientBuilderActions.Add(builder =>
{
// 配置DaprClientBuilder
});
});
}
}
高级用法
1. 配置DaprClient
public override void ConfigureServices(ServiceConfigurationContext context)
{
// 配置具名DaprClient
context.Services.AddDaprClient("CustomClient", builder =>
{
// 配置HTTP端点
builder.UseHttpEndpoint("http://localhost:3500");
// 配置gRPC端点
builder.UseGrpcEndpoint("http://localhost:50001");
// 配置API Token
builder.UseDaprApiToken("your-api-token");
// 配置JSON序列化选项
builder.UseJsonSerializerOptions(new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
PropertyNameCaseInsensitive = true
});
// 配置gRPC通道选项
builder.UseGrpcChannelOptions(new GrpcChannelOptions
{
MaxReceiveMessageSize = 1024 * 1024,
MaxSendMessageSize = 1024 * 1024
});
});
}
2. 使用DaprClient
public class YourService
{
private readonly IDaprClientFactory _daprClientFactory;
public YourService(IDaprClientFactory daprClientFactory)
{
_daprClientFactory = daprClientFactory;
}
public async Task InvokeMethodAsync()
{
// 使用默认客户端
var defaultClient = _daprClientFactory.CreateClient();
// 使用具名客户端
var namedClient = _daprClientFactory.CreateClient("CustomClient");
// 调用服务方法
var response = await defaultClient.InvokeMethodAsync<OrderDto>(
HttpMethod.Get,
"order-service", // 目标服务ID
"api/orders/1", // 方法路径
new { id = 1 } // 请求参数
);
// 发布事件
await defaultClient.PublishEventAsync(
"pubsub", // Pub/sub组件名称
"order-created", // 主题名称
response // 事件数据
);
// 保存状态
await defaultClient.SaveStateAsync(
"statestore", // 状态存储组件名称
"order-1", // 键
response // 值
);
// 获取状态
var state = await defaultClient.GetStateAsync<OrderDto>(
"statestore", // 状态存储组件名称
"order-1" // 键
);
}
}
3. 自定义DaprClient行为
public class CustomDaprClientBehavior
{
public void Configure(DaprClient client)
{
// 配置自定义行为
}
}
// 在模块中注册
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<DaprClientFactoryOptions>(options =>
{
options.DaprClientActions.Add(client =>
{
new CustomDaprClientBehavior().Configure(client);
});
});
}
注意事项
- DaprClient实例是线程安全的,建议使用单例模式
- 具名DaprClient可以有不同的配置,适用于需要连接不同Dapr Sidecar的场景
- 配置更改后需要重新创建DaprClient实例才能生效
- gRPC通道配置需要注意性能和资源消耗
- JSON序列化选项会影响所有使用该DaprClient的请求
- API Token应该通过安全的配置管理系统管理
- 建议为不同的微服务使用不同的具名DaprClient
- 在生产环境中应该适当配置超时和重试策略