目录
认识Nacos
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的动态服务发现、配置管理和服务管理平台,也是 Spring Cloud Alibaba 生态中的核心组件。它同时具备 “服务注册中心” 和 “配置中心” 双重功能,解决了微服务架构中服务发现、配置动态更新、服务治理等核心问题,因功能全面、易用性强、高可用设计而被广泛采用。
相比 Eureka单一功能的注册中心,Nacos 的核心优势在于:
功能合一:同时支持服务注册发现和配置管理,无需集成多个组件。
AP/CP 双模切换:可根据业务场景灵活切换一致性模型(AP 保证可用性,CP 保证一致性)。
高可用设计:支持集群部署,通过 Raft 协议保证数据一致性,避免单点故障。
动态配置:配置实时推送,无需重启服务即可生效,支持多环境、多版本管理。
服务治理:内置健康检查、负载均衡、服务元数据管理等能力。
易用性:提供可视化控制台,操作简单,且与 Spring Cloud、Dubbo 等框架无缝集成。
安装启动Nacos
下载地址 https://github.com/alibaba/nacos/releases/tag/2.2.3
下载后将压缩包解压
目录介绍:
bin:Nacos启停脚本 (.sh为Linux的启停脚本,.cmd为windows的启停脚本)
conf: Nacos配置文件
target: 存放 Nacos 应用的 jar 包
修改单机模式
Nacos 默认启动方式为集群,启动前需要修改配置为单机模式
使用记事本打开startup.cmd,然后将cluster修改为standalone
启动Nacos
进入bin目录下,双击startup.cmd即可。
访问Nacos主页,出现以下界面,表示Nacos启动成功http://127.0.0.1:8848/nacos
Nacos核心概念:
Namespace:命名空间,常用来做环境隔离(dev/test/prod)。
Group:组,进一步的逻辑分组(如
DEFAULT_GROUP
、crm-group
)。Service:服务名(如
customer-service
)。Cluster:同一服务下的子集群标签(如 分地域
beijing
/shanghai
)。Instance:具体一个实例(IP:Port + 元数据)。
Metadata:实例标签/权重/版本号等键值,常用于灰度与路由。
Ephemeral(临时实例):默认;靠客户端心跳维持存活,掉线自动摘除。
Persistent(持久实例):不靠心跳,由服务端健康检查;适用于非 JVM/非 SDK 客户端或希望服务端「更强一致管理」的场景。
Nacos核心功能特点
Nacos是Spring Cloud Alibaba的组件,Spring Cloud Alibaba遵循Spring Cloud中定义的服务注册, 服
务发现规范. 因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。
主要差异在于:
Eureka需要自己搭建⼀个服务,Nacos不用自己搭建服务,组件已经准备好了,只需启动即可。对应依赖和配置不同
服务注册与发现
下述配置演示过程基于微服务流量分发核心:Spring Cloud 负载均衡解析-CSDN博客
Nacos的使用流程:
1.引|入spring-cloud-alibaba的依赖
2.引入Nacos相关的依赖
3.修改配置
4.远程调用
5.测试
引入spring-cloud-alibaba依赖
在父工程的pom文件中的 <dependencyManagement> 中引⼊Spring Cloud Alibaba的依赖:
<properties>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
注意: Spring Boot 和Spring Cloud的版本是有⼀定对应关系的,Spring Cloud Alibaba也遵循Spring Cloud 的标准, 在引⼊依赖时,⼀定要确认各个版本的对应关系。
Spring Cloud Alibaba 和Spring Cloud版本对应关系,版本在⼀定范围内可以⾃由选择。
参考官⽅⽂档:https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain/
在order-service和product-service中引入nacos依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在order-service和product-service中修改配置
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.0:8848
spring:
application:
name: product-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.0:8848
启动服务 启动两个服务, 观察Nacos的管理界面, 发现order-service 和product-service 都注册在Nacos上了。
测试接⼝: http://127.0.0.1:8080/order/1
负载均衡
生产环境相对是比较恶劣的,我们需要对服务的流量进行更加精细的控制,Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等。
服务线下
当某⼀个节点上接口的性能较差时,我们可以第⼀时间对该节点进行下线。
点击下线后, 再次请求接口,会发现该服务没有请求进来了,再次单击上线, 该节点会继续收到请求。
权重配置
通过配置实例权重(0-100),权重越高的实例接收请求比例越高,适用于机器性能差异场景(需开启Nacos负载均衡策略)
开启负载均衡策略
由于Spring Cloud LoadBalance组件自身有负载均衡配置方式,所以不支持Nacos的权重属性配置,我们需要开启Nacos的负载均衡策略,让权重配置生效。
#开启nacos的负载均衡策略
spring:
cloud:
loadbalancer:
nacos:
enabled: true
同集群优先访问
Nacos把同⼀个机房内的实例,划分为⼀个集群,所以同集群优先访问,在⼀定程度上也可以理解为同机房优先访问。微服务架构中,⼀个服务通常有多个实例共同提供服务,这些实例可以部署在不同的机器上,这些机器可以分布在不同的机房。
微服务访问时, 应尽量访问同机房的实例,当本机房内实例不可用时,才访问其他机房的实例,因为通常情况下因同⼀个机房的机器属于⼀个局域网,局域网访问速度更快⼀点。(要使该生效也需开启Nacos负载均衡策略)
配置集群名称
spring:
cloud:
nacos:
discovery:
server-addr: 110.41.51.65:10020
cluster-name: SH #集群名称:上海集群
健康检查
Nacos作为注册中心,需要感知服务的健康状态,才能为服务调用方提供良好的服务。
Nacos 中提供了两种健康检查机制:
客户端主动上报机制:
客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态,默认心跳间隔5秒。
nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除。
服务器端反向探测机制:
nacos主动探知客户端健康状态,默认间隔为20秒。
健康检查失败后实例会被标记为不健康,不会被立即删除。
Nacos 中的健康检查机制不能主动设置,健康检查机制是和 Nacos 的服务实例类型强相关的。
Nacos的服务实例(注册的节点)分为临时实例和非临时实例:
临时实例: 如果实例宕机超过⼀定时间,会从服务列表剔除, 默认类型。
非临时实例: 如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
Nacos对临时实例,采取的是 客户端主动上报机制, 对非临时实例,采取服务器端反向探测机制。
永久实例配置
spring:
cloud:
nacos:
discovery:
ephemeral: false #设置为⾮临时实例
环境隔离
企业开发中,⼀个服务一般会分为开发环境,测试环境和生产环境。
开发环境:开发⼈员用于开发的服务器,是最基础的环境,⼀般日志级别设置较低,可能会开启⼀些调试信息。
测试环境:测试⼈员用来进行测试的服务器,是开发环境到生产环境的过渡环境。
生产环境:正式提供对外服务的环境,通常关掉调试信息。
通常情况下,这几个环境是不能互相通信的,Nacos提供了namespace(命名空间)来实现环境的隔离,不同的namaspace的服务不可见
新增命名空间:
修改配置
spring:
cloud:
nacos:
discovery:
namespace: 51152a13-7911-49e3-bbdc-16fd5670a257
配置中心
Nacos 既是注册中心,也是配置中心。
配置中心就是对这些配置项进行统⼀管理,通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件,提高效率的同时, 也降低了出错的风险。
服务启动时, 从配置中心读取配置项的内容,进行初始化。配置项修改时,通知微服务,实现配置的更新加载。
在Nacos控制台添加配置项
注意:服务管理的命名空间 ≠ 配置管理的命名空间
引入相关依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.***之后版本需要引⼊**bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
配置bootstrap.properties
微服务启动前,需要先获取nacos中配置,并与application.yml配置合并,在微服务运行之前,Nacos要求必须使用 bootstrap.properties 或者使用bootstrap.yml 配置文件来配置Nacos Server 地址。
spring:
application:
name: product-service
cloud:
nacos:
config:
server-addr: 110.41.51.65:10020
注意:
spring.application.name 需要和nacos配置管理的Data ID⼀致。
spring.cloud.nacos.config.server-addr 为Nacos Server的地址
编写程序
@RequestMapping("/config")
@RefreshScope //配置进行热更新
@RestController
public class NacosController {
@Value("${nacos.test.num:0}") //读取配置
private Integer nacosNum;
@RequestMapping("/get")
public Integer get() {
return nacosNum;
}
}
启动程序, 访问接口: http://127.0.0.1:9090/config/get
修改nacos配置
再次访问链接:
Nacos与Eureka区别
-
功能
Nacos除了服务发现和注册之外, 还提供了配置中心, 流量管理和DNS服务等功能。
-
CAP理论
Eureka遵循AP原则,Nacos可以切换AP和CP模式,默认AP。
Nacos 根据配置识别CP或者AP模式,如果注册Nacos的Client的节点是临时节点,那么Nacos对这个Client节点的效果就是AP,反之是CP,AP和CP可以同时混合存在。
-
服务发现
Eureka:基于拉模式,Eureka Client会定期从Server拉取服务信息,有缓存,默认每30秒拉取⼀次。
Nacos:基于推送模式,服务列表有变化时实时推送给订阅者,服务端和客户端保持心跳连接。