Nacos的使用详解
目录
一 Nacos服务发现
1.安装
2.使用
二 Nacos负载均衡
1.服务下线:
2.权重配置(非严格):
3.同集群优先访问
三 Nacos健康检查
1.两种健康检查机制:
2.Nacos的服务实例类型:
3.配置非临时实例:
四 Nacos的环境隔离
1.环境:
2.隔离:
3.实现:
五 Nacos配置中心使用
1.应用场景:
2.使用:
六 Nacos配置中心详解
1.命名空间:
2.DataID:
3.常见问题:
七 服务部署
1.修改配置,进行本地测试
2.打包,上传服务器
3.重启nacos
4.测试
八 Eureka和Nacos的区别
1.功能
2.CAP原则
3.服务发现
一 Nacos服务发现
1.安装
地址:https://github.com/alibaba/nacos/releases/tag/2.2.3
(1)下载,解压缩
(2)单机情况需要修改startup.cmd/startup.sh--MODE="standalone"
(3)默认端口号8848
若端口号被占用
①杀死8848端口号(cmd)
netstat -ano | findstr 8848 taskkill /pid 进程号 /f②config目录下修改application.properties
server.port=其他端口号(4)启动startup.cmd/startup.sh,访问IP:端口号/nacos
Linux下启动nacos命令:
bash startup.sh -m standalone2.使用
(1)引入SpringAlibaba的依赖
<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>(2)引入Nacos相关依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>使用过程中需要使用负载均衡,因此把它对应的依赖也加上
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency>(3)配置Nacos配置
spring: application: name: product-service cloud: nacos: discovery: server-addr: 对应Nacos的ip和端口号(4)修改远程调用代码
①将对应请求的uri改为应用名
②给restTemplate对象加上负载均衡
(5)测试
3.常见问题:
(1)UnkownHostException--通常是没有引入负载均衡依赖导致找不到当前服务
(2)服务注册失败--版本对应问题,SpringAlibaba,SpringCloud,SpringBoot的版本对应问题
二 Nacos负载均衡
1.服务下线
应用场景:当我们发现某个服务存在问题,应该先止损,再排查问题
Nacos支持我们不改动代码直接对服务进行上线下线
2.权重配置(非严格)
(1)应用场景:当机器或服务刚刚上线时,不能确定其是否存在问题,不能对其加大流量,需要控制其流量
(2)启用:如果当前使用的是其他框架的负载均衡策略,此时Nacos的负载均衡策略无法生效,此时要让Nacos的负载均衡策略生效需要引入配置
#开启nacos的负载均衡策略 spring: cloud: loadbalancer: nacos: enabled: true(3)常见问题:
集群环境下修改权重可能会报错
Nacos会记录上次启动的ip,当ip不一致的,Nacos找不到leader时,此时就会报错
解决方案:
删除Nacos根目录下的data文件文件夹下的protocol文件夹即可(用于记录IP的)
3.同集群优先访问
(1)概念:Nacos把同一机房的实例称为一个集群,因此同集群优先访问也可以认为是同机房优先访问
(2)使用场景:一个应用通常会部署在多个地方的机房中,我们通常更希望当前应用请求的时候能优先访问在同一个机房/地方的应用
(3)实现:
配置集群名称
spring: application: name: product-service cloud: nacos: discovery: server-addr: 对应Nacos的ip和端口号 cluster-name: SH #集群名称: 上海集群 spring.cloud.nacos.discovery.cluster-name=BJ注意:2,3的实现都需要开启Nacos的负载均衡策略
三 Nacos健康检查
1.两种健康检查机制
客户端主动上报机制:客户端每隔5秒以心跳上报的形式进行告知服务器,服务器15秒未收到心跳包实例会记录状态为不健康,30秒未收到心跳包就手动删除
服务器端反向探测机制:服务器主动探测客户端的健康状况,间隔20秒,如果健康探测失败,实例会被标记为不健康,不会立即被删除
注:Nacos的健康检查机制不能主动设置,而是与Nacos的实例类型强相关
2.Nacos的服务实例类型
临时实例:采用客户端主动上报机制,超过时间未上报就进行删除
非临时实例(永久实例):采用服务器反向探测机制
注:默认都是临时实例,非临时实例需要进行配置
3.配置非临时实例
spring: cloud: nacos: discovery: ephemeral: false # 设置为⾮临时实例存在问题:可能会设置失败
原因:Nacos记录上次启动改实例的ip和端口号以及实例类型,不允许临时实例转换为非临时实例,也不允许非临时实例转为临时实例
解决方案:仍为删除Nacos根目录下data文件夹的protocol文件夹
具体:
①停止Nacos进程
②删除Nacos根目录下data文件夹的protocol文件夹
③重启Nacos
四 Nacos的环境隔离
1.环境
开发环境
测试环境
预发布环境
发布环境
注:预发布环境和发布环境都是正式环境,通常配置和连接的数据库是一样,区别是预发布环境不对外公开
2.隔离
开发环境只能访问开发环境,测试环境只能访问测试环境,不同环境之间不能互相访问
3.实现
(1)创建环境:命名空间中进行添加
(2)给实例配置对应的环境(使用环境ID)
spring: cloud: nacos: discovery: namespace: 环境ID五 Nacos配置中心使用
1.应用场景
当一个应用需要更改配置的时候,此时就需要在多台机器上重新部署,此时会麻烦而且容易遗漏
可以利用Nacos对配置进行管理
2.使用
(1)添加配置
Data ID要配置的应用名保持一致
注:此处的环境与
(2)引入依赖
引入Nacos Config依赖
<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.yml
微服务启动之后,会先读取nacos配置(bootstrap.yml),再加载application.yml,再将二者进行合并
spring: application: name: product-service cloud: nacos: config: server-addr: 注册中心的ip:端口号注:配置中心和服务发现使用的可能不是同一个中心,因此需要单独进行配置
(3)修改配置文件
修改完配置后要立即生成需要在对应的Controller类上添加@RefreshScope(配置热更新-配置实时生效)
注:服务管理的命名空间不等于配置管理的命名空间
六 Nacos配置中心详解
前提:服务发现(服务管理)的配置都是在application.yml里进行的,配置中心(配置管理)的配置都是在bootstrap.yml里进行的
1.命名空间
(1)作用:指定当前配置从哪个空间读取,默认为public
(2)对应yml配置:
spring: application: name: product-service cloud: nacos: config: server-addr: 注册中心的ip:端口号 namespace: 环境ID2.DataID
(1)完整格式:
${prefix}-${spring.profiles.active}.${file-extension}对应关系:
①prefix:默认是spring.application.name的值,也可以通过spring.cloud.nacos.config.prefix进行配置
②spring.profiles.active:为spring.profiles.active的值,当其为空的时候dataId会变成
${prefix}.${file-extension}具体配置:
spring: profiles: active: dev③file-extension:通过spring.cloud.nacos.config.file-extension来进行配置,目前只支持yaml和properties两种类型
spring: cloud: nacos: config: server-addr: 127.0.0.1:8848 file-extension:properties(2)匹配规则:
dataId与bootstrap.yml配置的匹配得越多,就优先匹配和使用哪个
例如:
3.常见问题
(1)读取不到配置--检查配置文件
①检查dataId有没有拼写错误
②配置文件写得是否有错误,格式是否正确
③检查对应的命名空间
④未引入依赖(bootstrap依赖)
对应错误:No spring.config.import property has been defined
原因:2020年后bootstrap被禁用了,但是我们Nacos的配置我们需要先读取bootstrap.yml,再与application.yml合并,因此不引入依赖不能用bootstrap报错
(2)Nacos Service地址错误
七 服务部署
1.修改配置,进行本地测试
注:没法在.yml里直接写@profile.name@
解决:在build依赖里添加
<resources> <resource> <directory>src/main/resources</directory><filtering>true</filtering> <includes> <incLude>**/**</include> </includes> </resource> </resources>2.打包,上传服务器
nohup java -jar product-service.jar --server.port=9091 >logs/product-service-9091.log &3.重启nacos
4.测试
八 Eureka和Nacos的区别
1.功能
Nacos除了提供服务发现,还提供了配置管理和DNS服务
2.CAP原则
Eureka使用AP原则
Nacos可以AP与CP进行切换,默认是AP,根据配置查看当前是临时节点,则为AP,反之则为CP,二者可以混合存在
3.服务发现
Eureka基于拉模式,定期从Service拉去服务信息
Nacos基于推送模式,只要服务列表有变化,其就会把变化推送给订阅者(客户端为订阅者)
