一、Nacos简要介绍
1.1Nacos和Eureka区别
|------|----------------------------------------------|------------------------------------------------------------|
| 对比 | Eureka | Nacos |
| CAP | 仅支持AP | 及支持CP也支持AP |
| 健康检查 | 客户端心跳续约(客户端上报),15s 没收到心跳标记失效,自我保护机制,不会立刻剔除实例 | 两种模式:临时实例客户端心跳;持久实例服务端主动探测 (TCP/HTTP),及时摘除不健康实例 |
| 持久化 | 默认内存存储,重启丢失;可选磁盘快照持久化 | 支持两种实例:临时实例不持久化;持久实例写入数据库 / 磁盘持久保存;同时兼任配置中心,配置数据持久化到 MySQL |
1.2Nacos的优势
- Nacos不仅实现了服务注册功能,同时也支持配置中心功能,两大核心功能集于一身,大大满足了用户的需求,同时也减少了使用多个组件带来的麻烦和繁琐;
- Nacos提供了客户端页面,便于我们进行开发和使用;
- Nacos是一个可运行的独立服务器软件,不用想Eureka一样需要自己实现服务,使用Nacos只需安装软件包,执行脚本就可以直接运行,非常方便;
- Nacos适配SpringCloudAlibaba生态,在国内项目广泛使用,社区活跃;
- Nacos提供的功能比Eureka更多,且更加强大,详细请看上文-Nacos和Eureka区别;
1.3服务注册和服务发现主要概念
服务注册:服务将自己的信息(如:url)注册在Nacos服务中心上,并保持实时更新,其他服务可以从Nacos上获取该服务的信息,调用该服务提供的接口,实现远程调用。
服务发现:当服务需要调用另一个服务的接口的时候,可以进行服务发现,从Nacos服务中心获取对方的地址,根据地址调用对方的接口,进行远程调用。
例如:订单服务+商品服务
订单服务和商品服务都是两个独立的微服务,当订单服务需要根据订单id获取订单信息,再根据订单信息中的商品id获取商品信息的时候,由于双方都是独立的服务,订单服务无法直接调用商品服务的接口,就需要进行远程调用,传统的远程调用实现比较复杂,并且订单服务的url是写死的,如果订单服务的url发生改变,那远程调用的代码也需要进行修改,而在实际业务开发中,修改代码之后需要重新进行打包部署,过程十分繁琐并且容易出现失误,而服务发现可以动态获取商品服务的url,即使对方发生改变也可以同步获得。
二、Nacos服务注册主要操作(基于Ubuntu系统的云服务器)
2.1如何使用Nacos
2.1.1 Ubuntu 云服务器安装启动 Nacos(单机模式)
单机模式指的是Nacos服务安装在一台服务器上,使用单机模式启动Nacos服务
- 下载安装包
下载地址点击跳转:http:// https://github.com/alibaba/nacos/releases/tag/2.2.3
-
上传软件包到Linux某个目录中
-
解压安装包
unzip nacos-server-2.2.3.zip
#如果第一次使用,未安装unzip命令, 需要安装⼀下
apt-get install unzip -
单机模式启动
#进入nacos/bin目录,具体目录以安装存放目录为主
cd user/nacos.bin
#启动Naocs服务
bash startup.sh -m standalone
注意:Nacos安装前需要先安装JDK

启动成功后会显示Nacos的日志存放在/root/user/nacos/logs/start.out这个文件中,我们可以查看Nacos是否启动成功

2.1.2 访问 Nacos 后台页面
Nacos服务启动成功之后,可以通过http://服务器ip:Nacos端口号/nacos进行访问(Nacos默认端口号为8848)
重点:访问之前需要在服务器开放Nacos的端口号:如果Nacos的端口号为8848,则需要同时开放8848,8948,8949

进入Nacos网页表示Nacos启动成功
2.2Nacos的配置信息
Nacos的配置信息存放在nacos/conf目录下,我们可以查看并且修改Nacos的配置信息
以修改Nacos的端口号为例:
#进入conf目录
cd user/nacos/conf
#打开application.properties文件
vi application.properties
#单击i进入编辑模式
i
#修改端口号为10020
#点击ESC退出编辑模式
#输入:wq退出并保存修改
:wq
注意:修改Nacos的端口号之后,需要开放端口号!
2.3实操:基于订单服务实现Nacos
-
服务使用Nacos需要添加相对于的依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> -
配置文件:Nacos启动成功之后,服务需要通过配置才能注册在Nacos上,下面简单介绍服务如何配置Nacos
-
订单服务
server:
port: 8080 #服务端口号
spring:
application:
name: order-service # 服务名,Nacos配置中心DataId默认就是 order-service.yaml
cloud:
nacos:
# 服务注册发现
discovery:
server-addr: 121.199.35.34:10020 #服务器ip+Nacos端口号 -
商品服务
server:
port: 9090 #和订单服务端口号不能一样
spring:
application:
name: product-service
cloud:
nacos:
discovery:
server-addr: 121.199.35.34:10020 -
启动服务,查看服务是否有注册到Nacos上

- 修改远程调用的代码,先前我们远程调用的url是写死的,现在我们进行修改,将原来写的url改成product服务的服务名,这样order服务发起远程调用的时候就可以根据这个服务名称从Nacos获得product的地址,并将请求发送给product-service的接口。
原来代码:
public orderInfo getOrderInfo(Integer id){
orderInfo orderInfo = orderMapper.selectOrderInfoById(id);
String url="http://127.0.0.1:9090/product/"+orderInfo.getProductId();
productInfo productInfo = restTemplate.getForObject(url, productInfo.class);
orderInfo.setProductInfo(productInfo);
return orderInfo;
}
修改后:
public orderInfo getOrderInfo(Integer id){
orderInfo orderInfo = orderMapper.selectOrderInfoById(id);
String url="http://product-service/product/"+orderInfo.getProductId();
productInfo productInfo = restTemplate.getForObject(url, productInfo.class);
orderInfo.setProductInfo(productInfo);
return orderInfo;
}
三、权重配置
3.1分配权重
权重作用:负载均衡策略可以同时开启多个服务器分担请求流量,当Nacos注册了多个客户端时,Nacos如何把这些流量是分配给客户端的?这就是分配权重的作用:大量流量时,Nacos服务中心将流量按不同的比例分配给客户端。
例如:假设我们有三台服务器,我们将三台服务器的权重均设为1,当有多个请求时,就会平均分给这三个服务器去接受,这就是分配权重。
⚠️注意:分配权重不是一定按照设置的比例均等分配,而是大致按照这个比例分配给客户端,流量越多,权重分配就越明显。当只有一台服务注册时,注册中心就只会把服务转发给这个服务。(默认权重为1)
配置方式:例:注册三个product-service服务到Nacos上,端口号分别为9090,9091,9092;将9090权重设置为1,将9091权重设置为0.1。当order-service发送大量请求给product-service时,可以观察到,大部分请求都转发给9090,而9091只收到特别少的请求。
添加配置,开启loadBancaned
spring:
cloud:
loadbalancer:
nacos:
enabled: true

3.2同集群优先
在中大型公司,一般会有不同地区的分公司,这些公司的机房中部署一些同样的服务器,将在同一个机房的服务器看成一个集群,那一个相同的服务就部署在了很多不同集群的服务器中,例如:order-service部署在A集群和B集群,product-service也部署在A集群和B集群,同集群优先指的是:当A集群的order-service发送请求给product-service时,Nacos会优先将请求转发给同样在A集群的product-service。如果A集群的product-service下线,才会转发给B集群的product-service处理。
同样,同集群优先需要实现loadBanlanced负载均衡(默认集群为default)
分别将两个product-service集群修改为NJ和BJ,将ord-service的集群修改成NJ,连续发送请求给product-service,查看响应结果。
spring.cloud.nacos.discovery.cluster-name=集群名称


发送请求


可以看到集群为BJ的服务没有收到请求,集群为NJ的服务收到请求。集群为NJ的product-service下线,BJ集群的product-service又可以接收到请求。
四、健康检查
4.1服务下线
强制下线(粗暴下线)
- 操作:直接
kill -9 PID、服务器宕机、进程崩溃,没有任何通知 - 流程:
- 服务进程直接被杀,来不及通知注册中心
- 注册中心不知道服务已经挂了,还保留该实例
- 调用方(消费者)还会继续把请求转发给这个死掉的实例 → 报错
- 直到注册中心健康检查失败,才剔除实例(有窗口期,这段时间会产生失败请求)
- 缺点:会出现一段时间请求失败,业务报错
- 适用:进程卡死无法正常关闭的紧急场景
优雅下线(推荐生产使用)
- 操作:
kill PID(不带 - 9),或者 SpringBoot 内置优雅关闭、Nacos 主动注销 - 流程:
- 收到关闭信号,先停止接收新请求
- 等待正在处理中的旧请求执行完毕(等待超时时间可配置)
- 主动向注册中心发送注销请求,告诉注册中心我要下线了
- 注册中心立刻把该实例从服务列表剔除
- 消费者刷新本地服务列表,不再往这个实例发请求
- 等待现有请求处理完成后,再关闭线程池、释放资源,退出进程
- 优点:不会出现请求丢失 / 报错,平滑停机,适合版本发布、迭代更新
- 缺点:需要等待存量请求,关闭耗时更长
4.2健康检查
|-------------|------|
| 实例类型 | 健康检查 |
| 临时实例(默认) | 主动上报 |
| 非临时实例(永久实例) | 反向侦查 |
概念:
-
临时实例:该服务下线,Nacos会主动删除
-
非临时实例:即使服务下线Nacos也不会删除该实例
-
主动上报: 临时实例主动上报健康情况给注册中心,当实例没有发送时,注册中心会发送一个心跳包给服务,如果服务未响应,Nacos也不会立即删除,而是等一段时间才会删除。
-
反向侦查:注册中心会主动侦查永久实例的健康情况,若实例未回应,Nacos不会删除实例,而是将其标记为非健康状态,等到服务重新上线再修改成健康状态。
-
临时实例和非临时实例的转换:两者可以进行转化,但若是注册在Nacos上的非临时实例要转换成永久实例,必须要先关闭Nacos服务,删除文件,修改之后再重启服务。
spring.cloud.nacos.discovery.ephemeral: false #非临时实例
五、环境隔离
5.1 环境分类:Namespace、Group、Service 三级隔离(很多新手分不清这三者层级关系) 5.2 环境隔离操作:后台创建 namespace,yaml 指定 namespace 5.3 环境隔离意义:开发 / 测试 / 生产环境隔离,互不干扰
5.1环境分类
在现实业务环境中,一般分为开发环境dev,测试环境,正式环境prod。
5.2环境隔离操作
现在Nacos上创建空间



spring.cloud.nacos.discovery.nameSpace: 空间id
5.3环境隔离意义
- Namespace(命名空间):最高层级强隔离,不同命名空间服务 / 配置互不可见;用于区分开发、测试、生产环境。
- Group(分组):同命名空间内逻辑隔离;用来对同名服务分组,实现灰度发布、版本隔离。
- Cluster(集群) :同命名空间 + 同分组内的机房 / 可用区划分;实例互相可见,负载均衡优先同集群调用,减少跨机房延迟,实现机房容灾。
总结:
1.Nacos是一个结合服务注册和配置中心的独立服务器软件,功能强大,便于开发人员使用;
2.Nacos注册中心动态实现了远程调用,减少后期运维成本;
3.Nacos健康检查分为主动汇报和反向侦查,注意已注册的临时实例不能直接修改成永久实例,需要先停掉Nacos服务并删除nacos ⽬录下 /data/protocol/raft 信息;
4.NameSpace是最高层级的环境隔离,处于不同命名空间的服务是互补可见的,但若是处于不同集群的服务,当该集群的服务下线时,可以调用其他集群的服务!
5.开启权重分配和集群都需要基于负载均衡策略!
拓展:Nacos 除了服务注册,还可以做配置中心(本文不展开,后续单独写一篇 Nacos 配置管理)


