目录
引言
- Nacos 是阿里巴巴的产品,现在是 SpringCloud 中的一个组件
- 相比于 Eureka 其功能更加丰富,在国内受欢迎程度高
关于 Nacos 配置与安装可点击下方链接进行跳转
Nacos 服务注册发现
- 此处我们将尝试把 order-server 和 user-server 服务注册到 Nacos 中
1) 在项目父工程的 pom.xml 文件中添加 spring-cloud-alibaba 依赖
<!-- nacos 的管理依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
- 版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本
- 版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本
- 版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本
2)在 order-service 和 user-service 中的 pom.xml 中添加 Nacos 客户端依赖
<!-- nacos客户端依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- 在添加 Nacos 依赖之前,如果存在 Eureka 依赖,我们需要将 Eureka 依赖注释掉
3)修改 order-service 和 user-service 中的 application.yml 文件,添加 Nacos 地址
spring: cloud: nacos: server-addr: localhost:8848 # nacos 服务地址
- 在修改 application.yml 文件之前,如果存在 Eureka 地址,我们任需将 Eureka 地址注释掉
4)重新启动 user-service 和 order-service,进入 Nacos 管理平台查看
5)点击 userservice 详情,查看如下图所示的服务详情
Nacos 服务分级存储模型
服务跨集群调用问题
- 服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
- 本地集群不可访问时,再去访问其他集群
服务集群属性配置
- 假设此处我们按下图所示,给 user-service 分配集群
1)修改 user-service 中的 application.yml,添加下方所示内容
spring: cloud: nacos: server-addr: localhost:8848 # nacos 服务地址 discovery: cluster-name: HZ # 集群名称,HZ 代指杭州
2)重新启动 UserApplication 和 UserApplication(2) 这两个实例
3)修改 user-service 中的 application.yml,将 cluster-name 修改为 CS
spring: cloud: nacos: server-addr: localhost:8848 # nacos 服务地址 discovery: cluster-name: CS # 集群名称,CS 代指长沙
4)重新启动 UserApplication(3) 这个实例
5)进入 Nacos 管理平台,点击查看 userservice 服务详情
小总结
- Nacos 服务分级存储模型
- 服务为一级,例如 user-service
- 集群为二级,例如 杭州 或 长沙
- 实例为三级,例如 长沙机房的某台部署了 user-service 的服务器
配置 Nacos 负载均衡策略
- 在配置 Nacos 负载均衡策略之前,我们首先测试 Nacos 的默认负载均衡策略
1)在 order-service 中的 application.yml 添加配置集群信息
spring: cloud: nacos: server-addr: localhost:8848 # nacos 服务端地址 discovery: cluster-name: HZ # 配置集群名称,也就是机房位置
2)重新启动 OrderApplication 实例
3)在浏览器输入对应 url,查询 101、102、103 号订单
4)查看控制台中的 user-service 日志
- 观察上图日志,我们可以了解到 Nacos 默认的负载均衡策略就是 轮询
- 101、102、103 订单分别在 UserApplication、UserApplication(2)、UserApplication(3) 这三个实例中被轮询
- 如果我们需要配置 Nacos 服务优先访问本地集群呢?
- 让 order-service 优先访问本地,即杭州集群中的 UserApplication 实例
1)在 order-service 中的 application.yml 文件中添加下方信息
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
2)重新启动 OrderApplication 实例
3)在浏览器输入对应 url,查询 101、102、103 号订单
4)查看控制台中的 user-service 日志
- 观察上图,处于长沙集群的 8083端口 UserApplication(3) 并未接收到 order-service 的请求
注意:
- 此处 Nacos 为随机访问 user-service 的实例
- 即 Nacos 优先选择本地集群,随后在本地集群中采用随机方式进行负载均衡
5)我们终止运行杭州集群中的两个 UserApplication 实例
6)在浏览器输入对应 url,查询 101 号订单
7)查看控制台中的 order-service 和 user-service 日志
- 此处的 order-service 日志打印了一个警告
- 警告内容 ——> 一次跨集群访问发生了!本想访问 杭州集群,却访问了 长沙集群
- 同时我们也可以看到长沙集群的 UserApplication(3) 实例打印的日志信息中,出现了对 101 订单用户信息的查询日志
- 即当本地集群无法访问时,Nacos 便会去尝试访问其他集群
小总结
- 有关 NacosRule 的负载均衡策略
- 优先选择同集群服务实例列表
- 本地集群找不到提供者,才去其它集群寻找,并且会报警告
- 确定了可用实例列表后,再采取随机负载均衡挑选实例
设置 Nacos 服务实例权重
- Nacos 会根据权重进行负载均衡
实例:
- 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
解决方案:
- 通过 Nacos 设置权重来控制访问频率,权重越大,则访问频率越高
1)选中 Nacos 管理平台 ——> 服务列表 ——> 服务详情 ——> 编辑按钮
2)此时我们便可以修改指定实例的权重值
- 此处我们将 8081 端口实例的权重修改为 0.1,同时测试可以发现 8081 被访问到的概率大大降低
注意:
- 当我们将某一实例权重设置为 0 时,此时该实例将不会接收任何请求
小总结
- Nacos 管理平台可以设置实例的权重值,0~1 之间
- 同集群内的多个实例,权重越高被访问的频率越高
- 权重设置为 0,则完全不会被访问
实例理解
- 假设此时我们需要对某一服务进行版本升级,该服务有 8081 和 8082 两个实例
解决方案:
- 我们可以先将 8081 的权重设为 0,然后再针对 8081 进行停机和版本升级,升级完成之后再重启
- 8081 升级完成之后,其权重先调小点,放出少量用户进来做测试,看功能和请求是否正常
- 如果没啥问题,便可针对 8081 的权重进行扩大,转而针对 8082 进行版本升级
- 由此我们便可在用户无感知的前提下,完成对服务的版本更新,十分的平滑和优雅
namespace 环境隔离
- Nacos 中服务存储和数据存储的最外层都是一个名为 namespace 的东西
- namespace 常用于最外层隔离
- 此处我们假设想要创建一个生产环境,并将 order-service 放入新创建的生产环境中
1)在 Nacos 管理平台中点击命名空间
2)点击新建命名空间,根据需求创建命名空间
3)观察新创建的命名空间
- 此时我们新创建的命名空间会自动生成一个 命名空间 ID
4)修改 order-service 的 application.yml,添加 namespace 和 命名空间 ID
spring: cloud: nacos: discovery: namespace: c7e49b09-f9a2-487c-8582-db31d4f5add0 # dev 环境
5)重新启动 OrderApplication,观察 Nacos 管理平台
- 此时我们的 order-service 成功放入到新创建的生产环境中
6)在浏览器输入对应 url,查询 101 号订单
- 此时将无法查询到订单号 101 的用户信息
- 因为 user-service 和 order-service 在不同的 namespace 下
小总结
- 每个 namespace 都有唯一 id
- 服务设置 namespace 时要写 id 而不是名称
- 不同 namespace 下的服务互相不可见
Nacos 注册中心细节分析
Nacos 与 Eureka 的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
Nacos 与 Eureka 的区别
- Nacos 支持服务端主动检测提供者状态:临时实例采取用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos 支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos 集群默认采用 AP 方式,当集群中存在非临时实例时,采用 CP 模式,Eureka 采用 AP 模式
临时实例 与 非临时实例配置
- 服务注册到 Nacos 时,可以选择注册为临时实例或非临时实例,通过下面的配置来设置
- 如果未添加下方配置信息,将默认注册为临时实例
spring: cloud: nacos: discovery: ephemeral: false # 设置为非临时实例
实例理解
- 此处我们想将 order-server 配置为非临时实例,即将下图的 true 改为 false
1)在 OrderApplication 的 pom.xml 中添加上述配置,随后直接重启 OrderAppliction
2)再次查看 Nacos 管理平台,观察临时实例是否变为 false
- 由上图可知,order-service 成功被注册为 非临时实例