ASP.NET Core服务发现组件Microsoft.Extensions.ServiceDiscovery扩展实战
实现Consul服务注册发现集成方案
随着Aspire preview5版本的发布,微软推出的服务发现组件Microsoft.Extensions.ServiceDiscovery也同步更新。该组件通过标准接口为微服务架构提供服务注册发现能力。
官方默认支持Config、DNS和YARP三种服务发现方式,基本使用方式如下:
builder.Services.AddServiceDiscovery();
builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
{
client.BaseAddress = new("http://todo");
});
builder.Services.ConfigureHttpClientDefaults(static http =>
{
// 全局启用服务发现
http.UseServiceDiscovery();
});
服务配置可在appsettings.json中进行定义:
"Services": {
"todo": {
"http": ["http://localhost:5124"]
}
}
扩展Consul服务发现的核心在于实现两个关键接口:
IServiceEndPointProvider- 服务端点提供接口IServiceEndPointProviderFactory- 服务端点工厂接口
核心代码结构示例如下:
internal class ConsulServiceEndPointProvider : IServiceEndPointProvider, IHostNameFeature
{
public async ValueTask PopulateAsync(IServiceEndPointBuilder endPoints, CancellationToken cancellationToken)
{
// 从Consul获取服务实例列表
}
}
internal class ConsulServiceEndPointProviderFactory : IServiceEndPointProviderFactory
{
public bool TryCreateProvider(ServiceEndPointQuery query, out IServiceEndPointProvider? resolver)
{
// 创建Consul服务端点实例
}
}
服务注册流程包括:
- 添加服务发现核心组件:
services.AddServiceDiscoveryCore() - 注册服务发现工厂:
services.AddSingleton<IServiceEndPointProviderFactory...> - 构建服务发现管道:
.AddConsulServiceEndpointProvider()
完整实现已在GitHub开源(https://github.com/vipwan/Biwen.Microsoft.Extensions.ServiceDiscovery.Consul),并通过NuGet包实现便捷引用。
测试显示在成功集成Consul服务发现后,系统能正确识别注册中心的服务实例并实现负载均衡调用。

