Nacos注册中心
一、引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
二、Nacos服务分级存储模型
- Nacos服务分为三级:
- 一级是服务,例如user-service.
- 二级是集群,例如杭州或者上海。
- 三级是实例,例如杭州机房的某台部署了user-serivce的服务器。
Nacos以机房划分集群。

服务跨集群调用问题:
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高。
只有当本地集群不可访问时,才去访问其他集群。
- 如何设置实例的集群属性:
- 修改application.yaml文件,添加spring.cloud.nacos.discovery.cluster-name属性即可。
- 跨服务调用order-service -> user-service。设置负载均衡的Rule为NacosRule。
userService: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则将user-service的权重都设置为1.
NacosRule负载均衡策略:
- 优先选择同集群服务实例列表。
- 本地集群找不到提供者,才去其他集群寻找,并且会报警告cross-cluster
- 确定了可用实例列表后,再采用随机负载均衡挑选实例。
- 加权负载均衡,实例的权重控制:
- Nacos控制台可以设置实例的权重值,0~1之间。
- 同集群内的多个实例,权重越高,被访问的概率就越大。
- 权重设置为0则完全不会被访问。
- 环境隔离Namespace:
- 每个namespace都有唯一ID。
- 不同namespace下的服务不可见。
- 在application.yaml中配置命名空间。
spring: cloud: nacos: discovery: namespace: 49h945j-ru49jr957 #命名空间ID
- 注册到Nacos中的实例分为临时实例和非临时实例。默认都是临时实例。配置非临时实例
spring: cloud: nacos: discovery: ephemeral: false #true:临时实例。 false:非临时实例
三、Nacos注册中心细节分析

- 服务提供者注册服务信息到Nacos注册中心。
- 服务消费者从Nacos注册中心定时拉取服务。默认是30s拉取一次。服务消费者将拉取到的服务列表缓存到本地。
- 服务消费者从服务列表缓存中按照负载均衡策略挑选一个服务提供者进行远程调用。
- 服务提供者的临时实例,采用心跳检测方法做健康检测,主动将心跳发送给Nacos注册中心。临时实例不可用之后,在Nacos控制台的服务列表中不可见。
- Nacos会主动询问服务提供者的非临时实例,校验服务的可用状态。非临时实例不可用之后,在Nacos控制台的服务列表中仍然可见。
- 如果Nacos发现服务状态有变化,会立即推送变更消息给服务消费者,消费者更新服务列表缓存。
四、Nacos与Eureka的对比
- Nacos与Eureka的共同点:
- 都支持服务注册与服务拉取。
- 都支持服务提供者心跳方式做健康检测。
- Nacos与Eureka的不同点:
- Nacos支付服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式。
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除。
- Nacos支持服务列表变更的消息推送,服务列表更新更及时。
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式。Eureka采用AP方式。

浙公网安备 33010602011771号