简单的介绍了SpringCloud中的Nacos。
Nacos注册中心
启动
startup.cmd -m standalone注册与发现
由于SpringCloud Commons定义了统一的接口规范
所以只需要改变引入的依赖和地址即可
- 在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:
<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>- 注释掉order-service和user-service中原有的eureka依赖。
- 添加nacos的客户端依赖
<!-- nacos客户端依赖 --><dependency> <groupId>com.alibaba.cloud</groupId> <arifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>- 修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址
spring: cloud: discovery: nacos: server-addr: localhost:8848 # nacos服务端地址- 启动并测试
- 总结
- Nacos服务搭建 - 下载安装包 - 解压 - 在bin目录下运行指令: startup.cmd -m standalone
- Nacos服务注册或发现 - 引入nacos.discovery依赖 - 配置nacos地址spring.cloud.discovery.nacos.server-addr
Nacos服务分级存储模型
xxxxxxxxxx6 1ribbon:2 eager-load:3 enabled: true # 开启饥饿加载4 clients: userservice # 指定对userservice这个服务饥饿加载5 - userservice16 - userservice2yaml
spring: cloud: nacos: server-addr: localhost:8848 # nacos服务端地址 discovery: cluster-name: HZ #配置集群名称,也就是机房位置,例如:HZ,杭州总结
- Nacos服务分级存储模型
- 一级是服务,例如userservice
- 二级是集群,例如杭州或上海
- 三级是实例,例如杭州机房的某台部署了userservice的服务器
- 如何设置实例的集群属性
- 修改application.yml文件,添加spring.cloud.nacos.discovery.cluster-name属性即可 心
那么如何设置orderservice也进行集群属性配置使得远程调用可以优先调用本地的集群?
- 1.修改order-service中的application.yml,设置集群
spring: cloud: nacos: server-addr: localhost:8848 # nacos服务端地址 discovery: cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州- 2.在order-service中设置负载均衡的IRule为NacosRule,这个规则会优先寻找与自己同集群的服务
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则- 3.注意将user-service的权重都设置为1
Nacos负载均衡的策略:先访问本地的集群,在本地的集群内随机负载均衡
那么如何进行根据权重负载均衡呢?
Nacos提供了权重配置来控制访问的频次
在Nacos页面进行权重配置即可
权重为0即为停止访问,可以用来停机进行版本升级,再小量的提升权重,放入小部分用户进行测试,若无问题则调整群众,进行一个平滑的升级
Nacos的环境隔离-namespace
环境隔离先从 namespace 入手:在 Nacos 的命名空间管理区域为开发、测试等环境分别建立空间,并记录各自的 ID。微服务通过 spring.cloud.nacos.discovery.namespace 指向目标空间,消费者与提供者必须处在相同的发现范围内才能互相发现。下方配置填写的是命名空间 ID,不是显示名称;cluster-name 表示服务实例的集群属性,不能替代 namespace 的环境隔离职责。
修改命名空间:修改order-service的application.yml,添加namespace:
spring: cloud: nacos: server-addr: localhost:8848 # nacos服务端地址 discovery: cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州 namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 #命名空间,填IDNacos环境隔离
- namespace用来做环境隔离
- 每个namespace都有唯一id
- 不同namespace下的服务不可见
Nacos注册中心细节
服务注册与发现可以拆成四件事:提供者登记实例,客户端维护实例健康信息,消费者订阅或获取服务列表,消费者再按规则选择实例调用。本文采用的 Nacos 客户端配置通过 discovery.ephemeral 区分临时与持久实例;两者的健康检测和失联后的处理方式应结合服务端版本与协议理解。排查时先核对 namespace、服务名、集群名和实例健康状态,再判断是否是发现或负载均衡问题,不要只看到实例记录仍在就认定它可接收业务流量。
非临时实例:yml中的discovery:ephemeral: false
1.Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
2.Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
Nacos配置管理
统一配置管理
需求:
- 配置更改热更新
如何管理:Nacos表单填写配置名称
- Data ID: 配置文件的id:[服务名称]-[profile].[后缀名]
- Group:分组:默认即可
- 格式:建议yaml
有个问题:Nacos的地址存于application.yml ,如何先读取到naocs地址呢?
有个bootstrap.yml优先级高于本地的配置文件,写在其中即可
本文的启动顺序是先读取引导配置,再连接 Nacos 获取远程配置,随后建立应用环境并创建业务对象。bootstrap.yml 提供连接地址、服务名、激活环境和后缀,客户端据此定位 Data ID;按文中的 userservice、dev、yaml 组合,对应的环境配置名为 userservice-dev.yaml。还需核对配置所属的 namespace 与 Group。该说明针对文中启用 bootstrap 的旧版集成方式,升级时应先核对配置加载机制,不能假设仅新增同名文件就必然生效。
配置步骤如下
- 1.引入Nacos的配置管理客户端依赖:
<!-- nacos配置管理依赖 --><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>- 2.在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml:
spring: application: name : userservice #服务名称 profiles: active: dev #开发环境,这里是dev cloud: nacos: server-addr: localhost:8848 #Nacos地址 config: file-extension: yaml #文件后缀名中间的三项配置即为Data ID
==将配置交给Nacos管理的步骤==
- 1.在Nacos中添加配置文件
- 在微服务中引入nacos的config依赖
- 在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件
==如何进行热更新==
热更新先确认配置发布到了应用实际读取的 namespace、Group 与 Data ID,再检查客户端是否收到配置变更。对于通过 @Value 注入的运行参数,本文配合 @RefreshScope 让相关对象在刷新后重新取值;发布配置与业务对象实际使用新值是两个环节。验证时应读取应用暴露的相关行为或参数,不要仅凭配置中心内容已保存就认定所有对象都已经刷新。
另一种方式是用 @ConfigurationProperties 把同一前缀下的配置绑定到配置对象,并让业务代码读取该对象。能否动态重新绑定还取决于该对象是否正确注册、客户端刷新机制和具体版本,不能把注解本身视为热更新开关。可以只调整一个可观察的业务参数,再检查后续请求是否读取新值;连接池、启动结构等配置不一定支持在线变更,应单独确认其生命周期与重建要求。
Nacos配置更改后,微服务可以实现热更新,方式:
通过@Value注解注入,结合@RefreshScope来刷新
通过@ConfigurationProperties注入
自动刷新注意事项:
- 不是所有的配置都适合放到配置中心,维护起来比较麻烦
- 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置
共享配置
- 微服务会从nacos读取的配置文件:
- [服务名]-[spring.profile.active].yaml,环境配置
- [服务名].yaml,默认配置,多环境共享
- 优先级:
- [服务名]-[环境].yaml >[服务名].yaml >本地配置
Nacos集群
原理示意:多个 Nacos 节点组成集群,按部署方案通过代理提供入口,配置数据使用共享的 MySQL 持久化存储。数据库连线只表示配置存储,不表示所有服务注册信息都写入 MySQL;节点互联、客户端协议和代理端口还需按实际版本配置。
集群搭建步骤:
- 搭建MySQL集群并初始化数据库表
- 下载解压nacos
- 修改集群配置(节点信息)、数据库配置
- 分别启动多个nacos节点
- nginx反向代理