MoneyTree.ServiceDiscovery 1.0.3
MoneyTree.ServiceDiscovery 服务注册发现
📋 概述
MoneyTree.ServiceDiscovery 提供微服务自动注册与发现能力,支持 Consul、Kubernetes、Nacos 三种注册中心后端,内置健康检查和优雅注销机制。
| 属性 | 说明 |
|---|---|
| NuGet 包 | MoneyTree.ServiceDiscovery |
| 外部依赖 | MoneyTree.Core、MoneyTree.Configuration |
| 定位 | 微服务自动注册与发现 |
🏗️ 项目文件结构
MoneyTree.ServiceDiscovery/
├── MoneyTree.ServiceDiscovery.csproj
├── GlobalUsings.cs
├── Abstractions/
│ ├── IServiceRegistry.cs # 服务注册接口
│ └── IServiceDiscovery.cs # 服务发现接口
├── Core/
│ ├── ServiceDiscoveryOptions.cs # 服务发现配置选项
│ ├── ServiceRegistration.cs # 服务注册信息模型
│ ├── ServiceRegistry.cs # 服务注册实现
│ └── ServiceDiscoveryProvider.cs # 服务发现提供者
├── Providers/
│ ├── ConsulServiceRegistry.cs # Consul 注册实现
│ ├── ConsulServiceDiscovery.cs # Consul 发现实现
│ ├── KubernetesServiceDiscovery.cs # K8s 服务发现实现
│ └── NacosServiceRegistry.cs # Nacos 注册实现
├── HealthChecks/
│ └── ServiceHealthCheck.cs # 服务健康检查
└── Extensions/
├── ServiceDiscoveryBuilder.cs # 流畅配置构造器
└── ServiceDiscoveryExtensions.cs # DI 注册扩展
🔌 注册中心支持
| 提供者 | 适用场景 | 特点 |
|---|---|---|
| Consul | Docker/虚拟机部署 | 成熟稳定,社区活跃,支持健康检查和 Key/Value 存储 |
| Kubernetes | K8s 原生服务发现 | 零额外组件,利用 K8s Service/DNS 机制 |
| Nacos | 国内微服务生态 | 服务发现 + 配置中心一体化 |
🚀 快速开始
Consul 配置
// Program.cs
using MoneyTree.ServiceDiscovery.Extensions;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMoneyTreeServiceDiscovery(sd =>
{
sd.WithServiceName("OrderService")
.WithInstanceId("order-service-001")
.UseConsul("http://consul:8500")
.WithHealthCheck("/health", intervalSeconds: 15)
.WithTag("version", "2.0.0")
.WithTag("environment", "production");
});
var app = builder.Build();
app.Run();
Kubernetes 配置
builder.Services.AddMoneyTreeServiceDiscovery(sd =>
{
sd.WithServiceName("OrderService")
.UseKubernetes("production");
});
Nacos 配置
builder.Services.AddMoneyTreeServiceDiscovery(sd =>
{
sd.WithServiceName("OrderService")
.UseNacos(
address: "http://nacos:8848",
@namespace: "production",
group: "ORDER_GROUP")
.WithHealthCheck("/health");
});
📖 使用示例
通过属性注入使用服务发现
public class PaymentService
{
[Inject] public ServiceDiscoveryProvider Discovery { get; private set; } = default!;
// 获取健康服务地址
public async Task<string?> GetOrderServiceAddressAsync()
{
var addresses = await Discovery.GetHealthyServiceAddressesAsync("OrderService");
return addresses.FirstOrDefault();
}
// 随机获取健康实例并调用
public async Task CallOrderServiceAsync(string orderId)
{
var service = await Discovery.GetRandomHealthyServiceAsync("OrderService");
if (service is null)
{
throw new InvalidOperationException("没有可用的订单服务实例");
}
var url = $"{service.GetFullAddress()}/api/orders/{orderId}";
// 发起 HTTP 调用...
}
}
🏁 完整启动配置示例
using System.Reflection;
using MoneyTree.ServiceDiscovery.Extensions;
var builder = WebApplication.CreateBuilder(args);
// 配置中心
builder.Services.AddMoneyTreeConfigurationCenter(c =>
{
c.WithServerAddress("https://config.mycompany.com")
.WithAppId("order-service")
.WithEnvironmentName("production");
});
// 服务注册发现
builder.Services.AddMoneyTreeServiceDiscovery(sd =>
{
sd.WithServiceName("OrderService")
.UseConsul("http://consul:8500")
.WithHealthCheck("/health")
.WithTag("version", "2.0.0");
});
// 其他 MoneyTree 模块...
builder.Services.AddMoneyTreeEFCore<AppDbContext>(db =>
db.UsePostgreSql(builder.Configuration.GetConnectionString("Default")!));
builder.Services.AddMoneyTreeAutoInjection(options =>
options.ScanFromAssembly(Assembly.GetExecutingAssembly()));
var app = builder.Build();
app.UseMoneyTreeDefaults();
app.Run();
🔧 高级配置
Consul 客户端独立配置
如需独立配置 Consul 客户端(不使用框架封装):
builder.Services.AddSingleton<IConsulClient>(sp =>
{
return new ConsulClient(config =>
{
config.Address = new Uri("http://consul:8500");
config.Token = "your-consul-acl-token"; // ACL Token(可选)
config.Datacenter = "dc1"; // 数据中心(可选)
config.WaitTime = TimeSpan.FromSeconds(30); // 长轮询超时
});
});
🏷️ 服务标签
标签用于服务实例的元数据标记,便于路由和筛选:
| 标签键 | 示例值 | 说明 |
|---|---|---|
version |
2.0.0 |
服务版本号 |
environment |
production |
部署环境 |
region |
cn-south |
部署区域 |
weight |
100 |
负载权重 |
Showing the top 20 packages that depend on MoneyTree.ServiceDiscovery.
| Packages | Downloads |
|---|---|
|
MoneyTree.ServiceDefaults
MoneyTree Framework 服务默认配置。快速落地项目的默认入口,集成弹性策略 + 健康检查 + 可选遥测/服务发现。
|
1 |
|
MoneyTree.ServiceDiscovery.Aspire
MoneyTree 服务发现的 Aspire 适配器。将 .NET Aspire 内置服务发现接入 MoneyTree IServiceDiscovery 统一抽象,支持 UseAspire() 一键切换。
|
1 |
.NET 10.0
- MoneyTree.Core (>= 1.0.3)
- Consul (>= 1.8.0)
- KubernetesClient (>= 19.0.2)
- Microsoft.AspNetCore.Hosting.Server.Abstractions (>= 2.3.11)
- Microsoft.AspNetCore.Http.Abstractions (>= 2.3.11)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.9)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.9)
- Microsoft.Extensions.Http (>= 10.0.9)