# Nacos
Air.Cloud.Modules.Nacos 是 Air.Cloud 对 Nacos 的服务治理模块实现,提供服务注册发现、配置中心键值操作和远程配置加载能力。
# 配置加载摘要
WebInjectInNacos() 与 HostInjectInNacos() 在挂载远程配置后,都会通过 AppRealization.Output.Print 输出一条不含配置值的摘要。摘要包含 Nacos 服务端地址、dataId、group、namespace 和有效配置项数量;启用公共配置时,服务和公共 dataId 会汇总在同一条摘要中,避免重复统计。
示例:
配置加载 | 加载到配置: 来源:Nacos; 地址:http://127.0.0.1:8848/; 配置定位:dataId=order.json, common.json; group=DEFAULT_GROUP; namespace=public; 有效配置项:18个
配置值、连接字符串、密码、Token 均不会写入该日志。由于监听项为可选项,有效配置项:0个 表示本次读取未发现有值的键,不应视为已成功取得业务配置。
# 所属 Standard
| Standard | 模块实现 | 说明 |
|---|---|---|
IServerCenterStandard | NacosServerCenterDependency | 基于 Nacos Naming 的服务注册、服务列表查询和实例详情查询 |
IKVCenterStandard | NacosKVCenterDependency | 基于 Nacos Config 的配置读写删除能力 |
提示
Nacos Config 没有与 Consul KV 完全一致的目录前缀枚举语义。模块把 IKVCenterStandard.Key 映射为 Nacos dataId,把 Value 映射为配置内容;QueryAsync(prefix) 会把传入值当作具体 dataId 查询。
# 包名
Air.Cloud.Modules.Nacos
# 配置节点
配置节点名称为:
NacosServiceOptions
| 配置项 | 说明 | 默认值 |
|---|---|---|
ServerAddresses | Nacos 服务端地址列表 | 空 |
ServerAddress | Nacos 单节点地址,会并入 ServerAddresses | 空 |
Namespace | Nacos 命名空间 | 空,使用 public |
ContextPath | Nacos 上下文路径 | nacos |
UserName / Password | Nacos 鉴权账号和密码 | 空 |
ConfigGroup | 配置中心默认分组 | DEFAULT_GROUP |
ServiceGroup | 服务发现默认分组 | DEFAULT_GROUP |
ConfigTimeoutMs | 配置读取超时,单位毫秒 | 5000 |
ServiceName | 当前服务名称 | 空 |
ServiceAddress | 当前服务地址 | 空 |
ClusterName | 实例集群名称 | DEFAULT |
Weight | 实例权重 | 1 |
Ephemeral | 是否临时实例 | true |
ConfigDataId | 服务配置 dataId | appsettings.{Environment}.json |
EnableCommonConfig | 是否加载公共配置 | true |
CommonConfigDataId | 公共配置 dataId | appsettings.Common.{Environment}.json |
# 配置示例
{
"Environment": "Production",
"NacosServiceOptions": {
"ServerAddress": "http://127.0.0.1:8848/",
"Namespace": "",
"ConfigGroup": "DEFAULT_GROUP",
"ServiceGroup": "DEFAULT_GROUP",
"ServiceName": "order-service",
"ServiceAddress": "http://127.0.0.1:5295",
"ConfigDataId": "order-service.json",
"EnableCommonConfig": true,
"CommonConfigDataId": "common.json"
}
}
# 注册模块
在普通依赖注入场景中直接注册模块:
using Air.Cloud.Modules.Nacos.Extensions;
builder.Services.AddNacosModule(builder.Configuration);
注册后可通过 Air.Cloud 标准接口使用:
public class DemoService
{
private readonly IServerCenterStandard _serverCenter;
private readonly IKVCenterStandard _kvCenter;
public DemoService(IServerCenterStandard serverCenter, IKVCenterStandard kvCenter)
{
_serverCenter = serverCenter;
_kvCenter = kvCenter;
}
}
# 服务注册
await _serverCenter.RegisterAsync(new NacosServerCenterServiceRegisterOptions
{
ServiceName = "order-service",
ServiceKey = "order-service-1",
ServiceAddress = "http://127.0.0.1:5295",
GroupName = "DEFAULT_GROUP",
ClusterName = "DEFAULT",
HealthCheckRoute = "/health"
});
查询服务:
var services = await _serverCenter.QueryAsync<NacosServerCenterServiceOptions>();
var detail = await _serverCenter.GetAsync("order-service");
# 配置中心
写入配置:
await _kvCenter.AddOrUpdateAsync("order-service.json", "{\"Feature\":{\"Flag\":\"on\"}}");
读取配置:
var item = await _kvCenter.GetAsync<NacosKvCenterServiceInformation>("order-service.json");
删除配置:
await _kvCenter.DeleteAsync("order-service.json");
# 远程配置加载
Web 应用可以使用:
using Air.Cloud.Modules.Nacos.Extensions;
var builder = WebApplication.CreateBuilder(args);
var app = builder.WebInjectInNacos();
app.Run();
通用主机可以使用:
builder.Host.HostInjectInNacos();
远程配置加载使用 ConfigDataId 和 CommonConfigDataId 两个 dataId,默认开启变更监听。需要和 Nacos 服务端中实际发布的配置 dataId、group 保持一致。
# 测试
单元测试:
dotnet test test/Air.Cloud.UnitTest/Air.Cloud.UnitTest.csproj --filter "FullyQualifiedName~Modules.Nacos" -m:1
集成测试默认关闭真实 Nacos 访问。需要验证真实 Nacos 时,在 test/Air.Cloud.IntegrationTest/appsettings.json 中配置:
{
"NacosIntegration": {
"RunNacosTests": true,
"Address": "http://127.0.0.1:8848/",
"ConfigGroup": "DEFAULT_GROUP",
"ServiceGroup": "DEFAULT_GROUP",
"KeyPrefix": "air-cloud-it"
}
}
然后运行:
dotnet test test/Air.Cloud.IntegrationTest/Air.Cloud.IntegrationTest.csproj --filter "FullyQualifiedName~Modules.Nacos" -m:1
# HealthCheckRoute 与日志过滤
NacosServiceOptions 支持配置 HealthCheckRoute:
{
"NacosServiceOptions": {
"ServerAddress": "http://127.0.0.1:8848/",
"ServiceName": "order-service",
"ServiceAddress": "http://127.0.0.1:5295",
"HealthCheckRoute": "/health"
}
}
服务注册时,如果 NacosServerCenterServiceRegisterOptions.HealthCheckRoute 为空,模块会使用 NacosServiceOptions.HealthCheckRoute。如果注册参数中传入了 HealthCheckRoute,以注册参数为准。
AddNacosModule() 会把 NacosServiceOptions.HealthCheckRoute 写入 Air.Cloud 日志过滤插件的忽略列表。服务注册时传入的健康检查路由也会在规范化后写入忽略列表。
默认只过滤 Information 及以下级别,并保留 Warning、Error、Critical。默认分类范围包括 ASP.NET Core 的请求开始/结束日志和 ResponseCaching 中间件日志,业务 logger 不会因为当前请求路径命中健康检查地址而被过滤。
← Consul RedisCache →