Nacos
Nacos
官网:https://nacos.io/zh-cn/docs/deployment.html
什么是 Nacos
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
Nacos 地图
- 特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
- 架构大图:通过清晰架构,让您快速进入 Nacos 世界
- 业务大图:利用当前特性可以支持的业务场景,及其最佳实践
- 生态大图:系统梳理 Nacos 和主流技术生态的关系
- 优势大图:展示 Nacos 核心竞争力
- 战略大图:要从战略到战术层面讲 Nacos 的宏观优势
部署Nacos
搭建Nacos注册中心
需要安装java jdk8.0以上版本才可以,我直接安装的jdk18,安装流程如下。
- 官网下载最新的jsk:https://www.oracle.com/java/technologies/downloads/#jdk18-windows
- 结合这两篇博文进行安装:
- https://blog.csdn.net/weixin_62529383/article/details/124055631
- https://blog.csdn.net/weixin_44084189/article/details/98966787
- 基本就是下载好,更改安装路径,一直下一步安装好,配置环境变量就行。
- 下载Nacos[https://github.com/alibaba/nacos/releases]
- 解压后配置持久化
- 创建一个数据库nacos_config,并执行红色框内的2个Sql脚本
- 修改配置文件
application.properties
,主要配置连接db
- 修改配置文件
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=PRC
db.user.0=nacos
db.password.0=nacos
- 进入nacos/bin目录下,输入cmd,执行
startup -m standalone
启动 - 通过http://localhost:8848/nacos验证,输入账号:nacos和密码:nacos登录后界面如下:
Docker部署
拉取镜像
docker pull nacos/nacos-server
运行镜像
docker run -d --name nacos -p 8848:8848 -p 9848:9848 -e PREFER_HOST_MODE=hostname -e MODE=standalone nacos/nacos-server
注意事项:docker 启动需要开启9848端口,增加1000偏移量,否则本地微服务注册会一直报错无法连接服务器!Nacos.V2.Exceptions.NacosException: Client not connected,current status: STARTING
.NET6接入Nacos
需要主要的几个地方:
- 本地的appsettings.json中的DataId、Group、Namespace需要Nacos服务器Nacos文件一样(Namespace、GroupName)
示例文件
Nuget添加nacos-sdk-csharp.AspNetCore、nacos-sdk-csharp.Extensions.Configuration
修改appsettings.json文件,内容如下:
{ "NacosConfig": { "Listeners": [ { "Optional": false, "DataId": "product", "Group": "DEFAULT_GROUP" } ], "Optional": false, "Namespace": "zhzt_website", "ServerAddresses": [ "http://localhost:8848/" ] } }
- 修改Program.cs文件,直接复制就可以用
// 注册服务到Nacos builder.Services.AddNacosAspNet(builder.Configuration); //默认节点Nacos // 添加配置中心 builder.Host.ConfigureAppConfiguration((context, builder) => { var config = builder.Build(); builder.AddNacosV2Configuration(config.GetSection("NacosConfig")); });
- 服务器创建名称空间,创建 命名空间ID :zhzt_website 命名空间名:zhzt_website 描述:官网
- 新增配置:dataid(命名空间里面有) group (默认的就行)和本地的一致,文件样本 Nacos自己的基本配置+自己的配置
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "MySqlConn": "Server=124.221.154.22;Database=db_Product;Uid=root;Pwd=111111;SslMode=none;" }, "CodeFirstSettings": { "Migrate": "true", "Backup": "true", "ModelPath": "Zhzt.Website.ProductModel" }, "SqlSugarSnowFlakeSettings": { "WorkerId": "1" }, "nacos": { "ServerAddresses": [ "http://localhost:8848" ], "DefaultTimeOut": 15000, "Namespace": "zhzt_website", "ListenInterval": 1000, "ServiceName": "ProductMicroservice", "GroupName": "DEFAULT_GROUP", "ClusterName": "DEFAULT", "RegisterEnabled": true, "InstanceEnabled": true, "Ephemeral": true, "ConfigUseRpc": true, "NamingUseRpc": true, "LBStrategy": "WeightRoundRobin" } }
Nacos添加配置文件
{
"nacos": {
"ServerAddresses": [ "http://localhost:8848" ],
"DefaultTimeOut": 15000,
"Namespace": "01786d05-61ed-4d81-9a31-698faf51aa96", // Please set the value of Namespace ID !!!!!!!!
"ListenInterval": 1000,
"ServiceName": "UserService",
"GroupName": "DEFAULT_GROUP",
"ClusterName": "DEFAULT",
"RegisterEnabled": true,
"InstanceEnabled": true,
"Ephemeral": true,
"ConfigUseRpc": true,
"NamingUseRpc": true,
"LBStrategy": "WeightRoundRobin" //WeightRandom WeightRoundRobin
}
}
添加Nacos依赖
<PackageReference Include="nacos-sdk-csharp.AspNetCore" Version="1.3.1" />
<PackageReference Include="nacos-sdk-csharp.Extensions.Configuration" Version="1.3.1" />
修改appsettings.json
文件
{
"NacosConfig": {
"Listeners": [
{
"Optional": false,
"DataId": "nacos-config",
"Group": "DEFAULT_GROUP"
}
],
"Optional": false,
"Namespace": "01786d05-61ed-4d81-9a31-698faf51aa96",
"ServerAddresses": [ "http://localhost:8848/" ]
}
}
修改Program.cs
文件
// 注册服务到Nacos
builder.Services.AddNacosAspNet(builder.Configuration); //默认节点Nacos
// 添加配置中心
builder.Host.ConfigureAppConfiguration((context, builder) =>
{
var config = builder.Build();
builder.AddNacosV2Configuration(config.GetSection("NacosConfig"));
});
启动项目
dotnet run --urls=http://*:8888 --ip 192.168.3.102 --port=8888
整合到Ocelot
引入依赖
<PackageReference Include="nacos-sdk-csharp.AspNetCore" Version="1.3.1" />
<PackageReference Include="nacos-sdk-csharp.Extensions.Configuration" Version="1.3.1" />
<PackageReference Include="Ocelot.Provider.Nacos" Version="1.2.2" />
修改配置文件
{
"NacosConfig": {
"Listeners": [
{
"Optional": false,
"DataId": "GatewayConfig",
"Group": "DEFAULT_GROUP"
}
],
"Optional": false,
"Namespace": "MiscroService",
"ServerAddresses": [ "http://192.168.3.102:8848/" ]
}
}
修改Program.cs文件
// 添加Ocelot对应Nacos扩展
builder.Services.AddOcelot().AddNacosDiscovery();
// 添加配置中心
builder.Host.ConfigureAppConfiguration((context, builder) =>
{
var config = builder.Build();
builder.AddNacosV2Configuration(config.GetSection("NacosConfig"));
});
Nacos添加配置文件
{
"Routes": [
{
"UpstreamPathTemplate": "/microservice/{url}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"DownstreamPathTemplate": "/api/{url}",
"DownstreamScheme": "http",
"UseServiceDiscovery": true,
"ServiceName": "OrderService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
],
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Type": "Nacos"
}
},
"nacos": {
"ServerAddresses": [ "http://192.168.3.102:8848" ],
"DefaultTimeOut": 15000,
"Namespace": "MiscroService",
"ListenInterval": 1500,
"ServiceName": "Gateway",
"GroupName": "DEFAULT_GROUP",
"ClusterName": "DEFAULT",
"RegisterEnabled": true,
"InstanceEnabled": true,
"ConfigUseRpc": true,
"NamingUseRpc": true,
"Ephemeral": true,
"LBStrategy": "WeightRoundRobin"
}
}