目录
Nacos 简介
Nacos(Dynamic Naming and Configuration Service)
Nacos 安装
下载安装包
Windows
解压
目录介绍:
修改单机模式
启动 Nacos
Linux
解压
单机模式启动
Nacos 快速上手
服务注册和发现
Nacos 负载均衡
服务下线
权重配置
开启 Nacos 负载均衡策略
同集群优先访问
给实例配置集群名称(分配实例到集群)
Nacos 健康检查
两种健康检查机制
客户端主动上报机制
反向探测机制
Nacos 服务实例类型
配置⼀个服务实例为永久实例
常⻅问题
Nacos 环境隔离
创建 Namespace
配置 namespace
Nacos配置中心
为什么需要配置中心
快速上⼿
添加配置
新建配置项
获取配置
设置命名空间
Data Id
让服务加载以 dev 为后缀的配置文件
服务部署
Nacos 与 Eureka 的区别
Nacos 简介
2018年6⽉, Eureka 2.0宣布闭源 (但是1.X版本仍然为活跃项⽬) ,同年 7 ⽉份,阿⾥ Nacos 宣布开源.并快速成为国内最受关注开源产品.作为 Eureka 的替代, Nacos 已经成为了国内开发者的⾸选,⽬前 Nacos Star 已经突破 28 K(Eureka 12 K)
Nacos(Dynamic Naming and Configuration Service)
在最初开源时,Nacos 选择进⾏内部三个产品合并统⼀开源( Configserver ⾮持久注册中⼼,VIPServer 持久化注册中⼼,Diamond 配置中⼼). 定位为:⼀个更易于构建云原⽣应⽤的动态服务发现,配置管理和服务管理平台.所以 Nacos 是⼀个注册中⼼组件,但它⼜不仅仅是注册中⼼组件. 截⾄⽬前, Nacos ⼏乎⽀持了所有的主流语⾔,⽐如 Java, Go, C++, Nodejs, Python, Scala等
官⽹:https://nacos.io/
仓库:https://github.com/alibaba/nacos
Nacos 安装
学习阶段采⽤单机安装即可.以下内容都是单机版
下载安装包
⽬前官⽅推荐的稳定版本为 2.2.3,咱们课程中也是⽤ 2.2.3
下载地址 https://github.com/alibaba/nacos/releases/tag/2.2.3
其他版本下载链接:下载链接:https://github.com/alibaba/nacos/releases
Windows
解压
把压缩包解压到任意⾮中⽂的⽬录下,解压后的目录如下
目录介绍:
bin:Nacos 启停脚本
• startup.cmd :windows 平台的启动脚本
• startup.sh :Linux 平台的启动脚本
• shutdown.cmd :windows 平台的停⽌脚本
• shutdown.sh : Linux 平台的停⽌脚本
conf: Nacos 配置⽂件
target: 存放 Nacos 应⽤的 jar 包
修改单机模式
注意如果不修改,那么我们学习的时候没有处于集群环境下就会报错
Nacos 默认启动⽅式为集群,启动前需要修改配置为单机模式.
1. 使⽤记事本打开 startup.cmd
2. Line 26 左右,修改启动模式
set MODE="cluster"
改为
set MODE="standalone"
如下图所⽰:
启动 Nacos
启动⾮常简单,进⼊bin⽬录下,双击 startup.cmd 即可
访问Nacos主⻚,出现以下界⾯,表⽰Nacos启动成功
http://127.0.0.1:8848/nacos
Linux
解压
上传提前下载好的安装包到服务器上某个⽬录
解压安装包
unzip nacos-server-2.2.3.zip
如果第⼀次使⽤,未安装 unzip 命令,需要安装⼀下
apt-get install unzip
单机模式启动
在 Linux 上可以不要修改配置文件为单机模式,可以直接通过命令设置单机模式启动
进⼊ nacos/bin ⽬录,输⼊命令:
bash startup.sh -m standalone
上述命令为 Ubuntu 系统的命令 ,nacos安装前需要先安装JDK,CenterOS使⽤:
sh startup.sh -m standalone
注意:启动成功后就可以去访问 IP:8848/nacos Nacos 主页了,但要记得把服务器的 8848 端口开放。
Nacos 快速上手
Nacos 是Spring Cloud Alibaba 的组件,Spring Cloud Alibaba 遵循 Spring Cloud 中定义的服务注册,服务发现规范.因此使⽤ Nacos 和使⽤ Eureka 对于微服务来说,并没有太⼤区别.
主要差异在于:
• Eureka需要⾃⼰搭建⼀个服务,Nacos 不⽤⾃⼰搭建服务,组件已经准备好了,只需启动即可.
• 对应依赖和配置不同
首先要想使用 Nacos,得先做到以下几步:
1.引入 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/zhcn/docs/2022.0.0.0/overview/version-explain/ 版本在⼀定范围内可以⾃由选择.
2.引入 Nacos 相关的依赖
在 order-service 和 product-service 中引⼊ nacos 依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
如果要想使用 @LoadBalanced 负载均衡就需要引入 LoadBalanced 负载均衡的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
服务注册和发现
修改配置
因为 order-service 和 product-service 需要将服务注册到 Nacos 上,并且要在 Nacos 上查找服务,所以需要在 order-service 和 product-service 的配置文件中要配置 Nacos 注册中心的地址
# 设置服务名称
spring:application:name: product-service
# 设置 nacos 服务器地址cloud:nacos:discovery: server-addr: 127.0.0.1:8848
给 order-service 和 product-service 服务配置了 nacos 的服务器地址以及服务名称后,启动项目,便自动的将服务注册到了 nacos 服务器上。(前提是要启动了 nacos 服务器)
Nacos 负载均衡
⽣产环境相对是⽐较恶劣的,我们需要对服务的流量进⾏更加精细的控制.Nacos ⽀持多种负载均衡策略,包括权重,同机房,同地域,同环境等.
服务下线
当某⼀个节点上接⼝的性能较差时,我们可以第⼀时间对该节点进⾏下线.
操作步骤:
找到对应的服务名称,点击详情
找到出现问题的机器,点击下线(下线以后通过 RestTemplate 发来的请求就不会被发送到该机器)
也可以在同样的位置点击上线,机器就会恢复能接收到请求
权重配置
除了下线之外,我们也可以配置这个节点的流量权重
操作步骤:找到对应节点 -> 编辑 -> 在弹出的窗⼝修改权重值
开启 Nacos 负载均衡策略
有可能我们设置权重以后发现没有效果。这是由于 Spring Cloud LoadBalance 组件⾃⾝有负载均衡配置⽅式,所以不⽀持 Nacos 的权重属性配置.我们需要开启 Nacos 的负载均衡策略,让权重配置⽣效
可以通过该文档查看官方提出的解决方案:如何解决MSE Nacos上修改服务实例的权重不生效问题_微服务引擎(MSE)-阿里云帮助中心 (aliyun.com)
#开启nacos的负载均衡策略
spring.cloud.loadbalancer.nacos.enabled=truespring:cloud:loadbalancer:nacos:enabled: true
配置后便发现权重成功生效。
常见问题:修改权重时,可能会报错:
报错信息:caused:errCode:500,errMsg:do metadata operation failed;caused: com.alibaba.nacos.consistency.exception.ConsistencyException: The Raft Group [naming_instance_metadata] did not find the Leader node;caused: The Raft Group [naming_instance_metadata] did not find the Leader node;
原因: Nacos 采⽤ raft 算法来计算 Leader, 并且会记录前⼀次启动的集群地址,当服务器 IP 改变时会导 致 raft 记录的集群地址失效, 导致选 Leader 出现问题.(⽹络环境发⽣变化时,IP 地址也会发⽣变化) 解决办法:删除 Nacos 根⽬录下 data ⽂件夹下的 protocol ⽂件夹即可.
同集群优先访问
注意:要想同集群优先访问生效还得开启 Nacos 负载均衡策略
Nacos 把同⼀个机房内的实例,划分为⼀个集群.所以同集群优先访问,在⼀定程度上也可以理解为同机房优先访问.微服务架构中,⼀个服务通常有多个实例共同提供服务,这些实例可以部署在不同的机器上,这些机器可 以分布在不同的机房,⽐如 product-service:
实例1:分布在上海机房
实例2:分布在上海机房
实例3:分布在北京机房
实例4:分布在北京机房
微服务访问时,应尽量访问同机房的实例.当本机房内实例不可⽤时,才访问其他机房的实例.
⽐如 order-service 在上海机房, product-service 在北京和上海机房都有实例,那我们希望可以优先访问上海机房,如果上海机房没有实例,或者实例不可⽤,再访问北京机房的实例.通常情况下,因为同⼀个机房的机器属于⼀个局域⽹,局域⽹访问速度更快⼀点.
给实例配置集群名称(分配实例到集群)
为服务配置集群名称
spring:cloud:nacos:discovery:cluster-name: SH #集群名称: 上海集群
重启服务:观察 Nacos 控制台, SH 集群下多了⼀个实例
复制 product-service 启动配置,添加 VM Option 设置 9091 端⼝号的实例,机房为 BJ
-Dserver.port=9091 -Dspring.cloud.nacos.discovery.cluster-name=BJ
设置 9092 端⼝号的实例,机房为 BJ
-Dserver.port=9091 -Dspring.cloud.nacos.discovery.cluster-name=BJ
为 order-service 配置集群名称:SH
spring:cloud:nacos:discovery:cluster-name: SH #集群名称: 上海集群
此时 order-service 服务和 9090 端口的 product-service 服务都在 SH 集群,而 9091 和 9092 端口的 product-service 服务 在 BJ 集群,所以 order-service 服务会优先访问 9090 端口的 product-service 服务
如果把 9090 端⼝的实例进⾏下线(SH集群), 再次访问接⼝,观察⽇志,发现 9091 端⼝和 9092 端⼝的实例收到了请求
Nacos 健康检查
两种健康检查机制
Nacos 作为注册中⼼,需要感知服务的健康状态,才能为服务调⽤⽅提供良好的服务.Nacos 中提供了两种健康检查机制:
客户端主动上报机制
• 客户端通过⼼跳上报⽅式告知服务端(nacos注册中⼼)健康状态,默认⼼跳间隔5秒;
• nacos 会在超过15秒未收到⼼跳后将实例设置为不健康状态,超过30秒将实例删除服务器端
反向探测机制
• nacos 主动探知客户端健康状态,默认间隔为20秒.
• 健康检查失败后实例会被标记为不健康,不会被⽴即删除.
Nacos 中的健康检查机制不能主动设置,健康检查机制是和 Nacos 的服务实例类型强相关的.
Nacos 服务实例类型
Nacos 的服务实例(注册的节点)分为临时实例和⾮临时实例.
• 临时实例:如果实例宕机超过⼀定时间,会从服务列表剔除,默认类型.
• ⾮临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例
Nacos 对临时实例,采取的是客户端主动上报机制,对⾮临时实例,采取服务器端反向探测机制.
配置⼀个服务实例为永久实例
spring:cloud:nacos:discovery:ephemeral: false # 设置为⾮临时实例
重启实例后,临时实例变为 false ,说明成为了非临时实例
常⻅问题
Nacos 服务实例类型不允许改变
设置服务实例类型,重新启动实例 Nacos 可能会报错
原因:Nacos 会记录每个服务实例的 IP 和端⼝号,当发现 IP 和端⼝都没有发⽣变化时,Nacos 不允许⼀个服务实例类型发⽣变化,⽐如从临时实例,变为⾮临时实例,或者从⾮临时实例,变成临时实例.
解决办法:1. 停掉nacos 2. 删除 nacos⽬录下 /data/protocol/raft 信息,⾥⾯会保存应⽤实例的元数据信息.
服务正常,Nacos 健康检查失败
现象: 服务正常,但是 Nacos 显⽰健康状态为 false
解决办法参考:如何解决Nacos持久化实例HTTP/TCP的健康检查不通过问题_微服务引擎(MSE)-阿里云帮助中心 (aliyun.com)
Nacos 环境隔离
企业开发中,⼀个服务会分为开发环境,测试环境和⽣产环境.
1. 开发环境:开发⼈员⽤于开发的服务器,是最基础的环境.⼀般⽇志级别设置较低,可能会开启⼀些 调试信息.
2. 测试环境:测试⼈员⽤来进⾏测试的服务器,是开发环境到⽣产环境的过渡环境.
3. ⽣产环境:正式提供对外服务的环境,通常关掉调试信息.通常情况下,这⼏个环境是不能互相通信的.Nacos 提供了namespace(命名空间)来实现环境的隔离.不同的 namaspace 的服务不可⻅.
创建 Namespace
默认情况下,所有服务都在同⼀个 namespace ,名为 public
点击命名空间 - > 新建命名空间 -> 设置命名空间的属性
配置 namespace
namespace 创建完成后,对服务进⾏配置,将服务添加到相应的环境。
spring:cloud:nacos:discovery:namespace: 命名空间ID
此时服务会被添加到另一个环境中,无法使用其他环境的服务。
Nacos配置中心
除了注册中⼼和负载均衡之外,Nacos 还是⼀个配置中⼼,具备配置管理的功能. Namespace 的常⽤场景之⼀是不同环境的配置区分隔离.例如开发测试环境和⽣产环境的配置隔离.
为什么需要配置中心
当前项⽬的配置都在代码中,会存在以下问题:
1. 配置⽂件修改时,服务需要重新部署.微服务架构中,⼀个服务可能有成百个实例,挨个部署⽐较⿇烦,且容易出错.
2. 多⼈开发时,配置⽂件可能需要经常修改,使⽤同⼀个配置⽂件容易冲突.
配置中⼼就是对这些配置项进⾏统⼀管理.通过配置中⼼,可以集中查看,修改和删除配置,⽆需再逐个修改配置⽂件.提⾼效率的同时,也降低了出错的⻛险.
1. 服务启动时,从配置中⼼读取配置项的内容,进⾏初始化.
2. 配置项修改时,通知微服务,实现配置的更新加载.
快速上⼿
通过以下操作,我们来感受下 Nacos 配置中⼼的使⽤
参考⽂档:Nacos Spring Cloud 快速开始
添加配置
在 Nacos 控制台添加配置项
注意:配置管理的命名空间和服务列表的命名空间是隔离的,两个是分别设置的.默认是 public 也就是服务管理命名空间配置 ≠ 配置管理的命名空间
新建配置项
说明:
1. Data ID设置为项⽬名称
2. 配置内容的数据格式,⽬前只⽀持 properties 和 yaml 类型
3. 设置配置内容
获取配置
引⼊ Nacos Config 依赖(bootstrap)
<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
(告诉服务,配置中心所在的位置)(因为配置中心和服务的注册和发现的位置可能不同,所以是分别配置的,并且配置中心所在的位置必须在 bootstrap.properties 配置文件中设置)
# 配置的 ID
spring.application.name=product-service
# 配置的 IP 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
或者使⽤ bootstrap.yml
spring:application:name: product-servicecloud:nacos:config:server-addr: 127.0.0.1:8848
spring.application.name 需要和 nacos 配置管理的 Data ID⼀致 spring.cloud.nacos.config.server-addr 为 Nacos Server 的地址
配置中⼼和注册中⼼的配置是隔离的
Nacos 配置中⼼: spring.cloud.nacos.config.server-addr
Nacos 注册中⼼: spring.cloud.nacos.discovery.server-addr
配置完以后通过代码从配置中心获取配置:
package com.bite.product.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Created with IntelliJ IDEA.* Description:* User: wuyulin* Date: 2024-09-21* Time: 13:17*/
@RestController
// 配置进⾏热更新(配置中心的配置改了以后,能够自动更新为新配置)
@RefreshScope
public class NacosController {//通过 Value 从配置中心获取配置@Value("${nacos.config}")private String nacosConfig;@RequestMapping("/getConfig")public String getConfig(){return "从 nacos 配置中心获取到配置项 nacos.config:"+nacosConfig;}
}
• @Value 读取配置
• @RefreshScope 配置进⾏热更新
nacos.config 是配置的 key 值,通过 key 获得 value 值
访问接口即可获取配置
设置命名空间
Nacos 配置管理的命名空间和服务列表的命名空间是分别设置的.默认是 public ,Nacos 命名空间配置依然在 bootstrap.properties 中进⾏配置
spring.cloud.nacos.config.namespace=命名空间 ID
对应 bootstrap.yml 配置
spring:cloud:nacos:config:namespace: 命名空间 ID
命名空间的ID,如下图所⽰:
如果设置命名空间后,项⽬启动时,会从该命名空间下找对应的配置项.
Data Id
Data Id 格式介绍
在 Nacos Spring Cloud 中, dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
• prefix 默认为 spring.application.name 的值, 也可以通过配置项 spring.cloud.nacos.config.prefix 来配置.
• spring.profiles.active 即为当前环境对应的 profile.当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${fileextension}
• file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。⽬前只⽀持 properties 和 yaml 类型.默认为 properties
微服务启动时,会从 Nacos 读取多个配置⽂件:
1. ${prefix}-${spring.profiles.active}.${file-extension} 如:product-service-dev.properties
2. ${prefix}.${file-extension} ,如:product-service.properties
3. ${prefix} 如 product-service
三个⽂件的优先级为: product-service-dev.properties > product-service.properties >product-service
让服务加载以 dev 为后缀的配置文件
spring.profiles.active=dev
新增 product-service-dev.properties 和 product-service.properties 配置文件,此时有
此时访问会发现优先访问 product-service-dev.properties 中的配置
将该配置删除再访问,访问的是 product-service.properties 中的配置
符合上述所说的优先级
服务部署
我们一般会根据开发环境设置多个配置文件,参考:Spring 多平台配置文件
在配置多个配置文件后,可能再次运行项目会报错,大概率是因为程序没有读取 bootstrap.properties 配置文件。可以在 pom.xml 在添加如下设置:
提现程序要加载 src/main/resources 路径下所有的配置文件
<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></resource></resources></build>
Nacos 与 Eureka 的区别
共同点:
• 都⽀持服务注册和服务拉取
区别:
1. 功能 Nacos 除了服务发现和注册之外,还提供了配置中⼼,流量管理和DNS服务等功能.
2. CAP理论 Eureka 遵循 AP 原则,Nacos 可以切换 AP 和 CP 模式,默认 AP. Nacos 根据配置识别 CP 或者 AP 模式.如果注册 Nacos 的 Client 的节点是临时节点,那么 Nacos 对这个 Client 节点的效果就是AP, 反之是 CP. AP 和 CP 可以同时混合存在.
3. 服务发现 Eureka:基于拉模式. Eureka Client 会定期从 Server 拉取服务信息,有缓存,默认每30秒拉取⼀次.
Nacos:基于推送模式.服务列表有变化时实时推送给订阅者,服务端和客户端保持⼼跳连接.