MoneyTree.ServiceDiscovery 1.0.6

MoneyTree.ServiceDiscovery 服务注册发现

📋 概述

MoneyTree.ServiceDiscovery 提供微服务自动注册与发现能力,支持 Consul、Kubernetes、Nacos、Aspire 四种注册中心后端,内置健康检查和优雅注销机制。

属性 说明
NuGet 包 MoneyTree.ServiceDiscovery(基础) / MoneyTree.ServiceDiscovery.Aspire(Aspire 适配器)
外部依赖 MoneyTree.CoreMoneyTree.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.ConfigureMoneyTreeServiceDiscovery(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.ConfigureMoneyTreeServiceDiscovery(sd =>
{
    sd.WithServiceName("OrderService")
      .UseKubernetes("production");
});

Nacos 配置

builder.Services.ConfigureMoneyTreeServiceDiscovery(sd =>
{
    sd.WithServiceName("OrderService")
      .UseNacos(
          address: "http://nacos:8848",
          @namespace: "production",
          group: "ORDER_GROUP")
      .WithHealthCheck("/health");
});

Aspire 配置(需要安装 MoneyTree.ServiceDiscovery.Aspire 包)

// Program.cs — Aspire 编排环境下,服务注册由编排层自动管理
builder.Services.AddAspireServiceDiscovery();  // 注册 Aspire 提供者
builder.Services.ConfigureMoneyTreeServiceDiscovery(sd =>
{
    sd.WithServiceName("OrderService")
      .UseAspire();  // 使用 Aspire 内置服务发现
});

注意:Aspire 模式下 IServiceRegistry 为 NoOp——服务注册和健康检查由 Aspire 编排层自动管理,无需应用层主动注册。服务发现通过 Microsoft.Extensions.ServiceDiscovery 解析端点。


📖 使用示例

通过属性注入使用服务发现

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.ConfigureMoneyTreeServiceDiscovery(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

Version Downloads Last updated
1.0.6 1 7/21/2026
1.0.3 1 7/12/2026