# 一、配置
# 下载安装
自我感觉哈,Nacos 注册中心的使用比 Eureka 注册中心要简单一些。简要说明一下 Nacos 注册中心的配置以及使用:首先需要安装 Nacos,这里为了方便使用,在本地安装了 Nacos。去 Nacos 官方网址去下载 Nacos
window 下载 zip 版本,linux 下载 tar 版本。当前推荐下载安装 2.1.1 稳点版本 。(注意路径不能存在中文)下载解压后
在 conf 目录下中找到 application.properties 可配置端口号,默认端口号为 8848 然后打开 bin 目录,bin 目录下为执行脚本,在当前目录下执行 cmd 打开命令行窗口,执行 startup.cmd -m standlone 可单模式下启动,集群配置后面再搞吧。
随后我们可以访问给的网址,我们输入账号密码即可登录可视化工具,账号密码初始值都为:nacos。
# 服务配置
我们在 idea 中继续来配置服务。我们需要在父工程中引入管理依赖:
<!--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> |
然后再其服务模块中引入:
<dependency> | |
<groupId>com.alibaba.cloud</groupId> | |
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> | |
</dependency> |
之后,我们再服务模块的 application.yml 文件中配置:
# 配置 nacos | |
spring: | |
cloud: | |
nacos: | |
server-addr: localhost:8848 # nacos 服务地址,其实默认的也是 localhost:8848 |
启动项目,我们打开 nacos 可视化界面中,查看服务:
可见,我们的配置成功了。
# 二、Nacos 服务分级存储模型
# 概念
一个服务可包含多个实例服务 --> 集群 --> 实例
服务跨集群调用问题服务调用尽可能选择本地集群的服务,跨集群调用延迟较高本地集群不可访问时,再去访问其它集群。因为本地访问速度相对较快。
# 服务集群配置:
1、修改 application.yml,添加如下内容:
# 配置 nacos | |
spring: | |
cloud: | |
nacos: | |
server-addr: localhost:8848 # nacos 服务地址 | |
discovery: | |
cluster-name: JS # 配置集群地址 (可自定义) |
2、可在 nacos 控制台查看
Nacos 服务分级存储模型
- 一级是服务,例如 userservice
- 二级是集群,例如杭州或上海
- 三级是实例,例如杭州机房的某台部署了 userservice 的服务器
如何设置实例的集群属性
- 修改 application.yml 文件,添加 spring.cloud.nacos.discovery.cluster-name 属性即可
# 服务集群属性配置:
我们可以在集群为 XZ 的配置多个实例,在集群为 LYG 的配置一个实例作为服务者,我们在一个消费者,当前消费者在 LYG, 我们如何能做到让消费者访问服务优先访问 LYG 集群内的实例而不访问集群为 XZ 的实例呢?这时我们就需要在消费者中配置 Nacos 的服务访问规则。(设置负载均衡的 IRule 为 NacosRule,这个规则优先会寻找与自己同集群的服务)
# 配置服务访问规则 | |
userservice: # 消费者服务 | |
ribbon: | |
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule |
这里的配置并非全局配置,只针对 userservice 服务有效,访问的是同一个集群下的实例,但如果当前集群下有多个实例,则按照随机的方式来访问。如果当前集群下的服务全部宕机,当前消费者还是得访问其他集群下的服务,但是这样会报一个警告。为跨集群访问,以便运维人员来重启服务。
# NacosRule 负载均衡策略
- 优先选择同集群服务实例列表
- 本地集群找不到提供者,才去其它集群寻找,并且会报警告
- 确定了可用实例列表后,再采用随机负载均衡挑选实例
# 三、Naco 权重负载均衡
实际部署中会出现这样的场景:服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求 Nacos 提供了权重配置来控制访问频率,权重越大则访问频率越高。那么,我们如何来配置权重呢?简单的是,这一步根部不需要写代码就可以来实现,因为运维人员他们可以在 nacos 控制台来进行配置权重。
# 配置


权重范围是 0~1 ,权重为 0 的,就相当于等于停机了,用户请求无法访问到当前服务上来,配置为 1,使用请求都能打过来,相较于其他的服务,1 是最大的才能满足所以请求都打到本台服务上来。
# 总结:(实例的权重控制)
- Nacos 控制台可以设置实例的权重值,0~1 之间
- 同集群内的多个实例,权重越高被访问的频率越高
- 权重设置为 0 则完全不会被访问
# 四、环境隔离 - namespace
# 配置

复制命名空间的 ID
在代码中配置:
spring: | |
cloud: | |
nacos: | |
server-addr: localhost:8848 # nacos 服务地址 | |
discovery: | |
cluster-name: XZ # 配置集群名称 | |
namespace: fe5ad009-268c-46e7-8d90-968f160e850c # dev 环境 |
重启服务后,观察控制台:
可发现在 dev 命名空间中存在该服务了。继续访问的话,报错 500
报错为:没有可用服务,相当于两个服务被隔离起来,要相访问必须在同一个命名空间下。
# 总结:(Nacos 环境隔离)
- 每个 namespace 都有唯一 id
- 服务设置 namespace 时要写 id 而不是名称
- 不同 namespace 下的服务互相不可见
# Nacos 和 Eureka 的区别以及共同点
# Nacos 与 eureka 的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
# Nacos 与 Eureka 的区别
- Nacos 支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos 支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos 集群默认采用 AP 方式,当集群中存在非临时实例时,采用 CP 模式;Eureka 采用 AP 方式
Nacos 配置非临时实例:
spring: | |
cloud: | |
nacos: | |
discovery: | |
ephemeral: false # 设置为非临时实例 |
