Nacos注册中心
nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件.相比Eureka功能更加丰富,在国内较受欢迎.
服务的注册与发现
-
在父工程中添加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>
-
在各个服务中添加nacos的客户端依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
修改各个服务配置文件,添加nacos地址:
spring: cloud: nacos: server-addr: localhost:8848 # nacos服务地址,默认8848
-
在Nacos安装目录的bin文件夹中启动Nacos,打开管理台查看内容
Nacos服务分级存储模型
服务→集群→实例
服务集群调用问题
- 服务调用尽可能选择本地集群服务,跨集群调用延迟较高
- 本地集群不可访问时,再去访问其他集群
配置实例(服务)集群属性
-
修改服务配置文件
spring: cloud: nacos: server-addr: localhost:8848 # nacos服务地址 discovery: cluster-name: BJ #集群名称
-
在Nacos控制台可以看到集群变化
NacosRule负载均衡
为了请求者能优先请求本地集群中的服务,需要修改请求者服务的配置:
-
将上述配置同样添加在请求者配置文件中
-
将请求者的负载均衡规则配置修改为com.alibaba.cloud.nacos.ribbon.NacosRule #优先访问本地集群,集群中进行随机访问
userservice: #被请求服务名 ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
跨集群访问时,会产生一个警告信息
-
被请求者权重配置都设置为1
服务实例的权重设置
实际部署中会出现:
- 服务器设备性能存在差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
- 在Nacos控制台可以设置实例的权重值,选中实例后面的编辑按钮,在权重一栏设置数字,数字越低,访问频率越低.(权重值在0∽1之间)
- 在服务维护或者升级时,就可以将权重设置为0,服务将不会再响应请求
环境隔离-namespace
Nacos服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离.
可以根据环境变化来做隔离,如生产环境,测试环境
配置命名空间
-
Nacos控制台可以创建命名空间
-
修改实例(服务)配置文件,添加namespace
spring: cloud: discovery: namespace: 4d6ce343-9e1b-44df-a90f-2cf2b6b3d177 # 命名空间ID
服务间不可以跨命名空间访问,报错提示:No instance available for userservice
- namespace用来做环境隔离
- 每个namespace都有唯一的id
- 不同namespace下的服务不可见
Nacos和Eureka对比
nacos注册中心细节分析
Nacos相比于Eureka,对服务的提供者进行健康检测,它将实例分为临时实例和非临时实例.
- 临时实例:采用心跳检测,与Eureka相同
- 非临时实例:nacos主动询问,如无响应,会将实例保存,等待其恢复
spring:
cloud:
discovery:
ephemeral:false #是否为临时实例
服务消费者
- Eureka每隔三十秒检测一次,服务列表更新不及时
- Nacos在定时检测的同时,会在服务提供者异常时,主动推送变更通知给消费者,消费者立即更新服务信息
总结:
- 相同点
- 都支持服务注册与服务拉取
- 都支持服务提供者心跳方式做健康检测
- 区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群存在非临时实例时,采用CP模式;Eureka采用AP方式