文章目录
- [认识 Nacos](#认识 Nacos)
- [Nacos 安装](#Nacos 安装)
- [使用 Nacos 完成服务注册](#使用 Nacos 完成服务注册)
- [Nacos 服务分级存储模型](#Nacos 服务分级存储模型)
- [集群负载均衡策略 NacosRule](#集群负载均衡策略 NacosRule)
- 根据权重负载均衡
- [Nacos 环境隔离(命名空间)](#Nacos 环境隔离(命名空间))
- [Nacos 和 Eureka 的区别](#Nacos 和 Eureka 的区别)
认识 Nacos
Nacos 是阿里巴巴的产品,现在是 SpringCloud 中的一个组件。相比Eureka 功能更加丰富(服务注册与发现、分布式配置),在国内受欢迎程度较高。
Nacos 安装
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
注意 Linux 和 Mac 解压时,要使用 tar -xvf
命令解压(不能手动)
shell
tar -xvf nacos-server-1.4.1.tar.gz
![](https://file.jishuzhan.net/article/1723338056720715777/c0cc29b557dd3db01b480963bf4aca41.webp)
![](https://file.jishuzhan.net/article/1723338056720715777/1cbb3bd268cf7ed53e465cccef177355.webp)
![](https://file.jishuzhan.net/article/1723338056720715777/93e3e379f22e3fdedeb24e2e560e8e67.webp)
解压完成后通过如下命令启动 nacos(进入到 nacos/bin
目录下[linux])
shell
sh startup.sh -m standalone
然后访问地址 http://localhost:8848/nacos/#/login ,出现如下界面代表安装成功
![](https://file.jishuzhan.net/article/1723338056720715777/f712e8dbcd907f40ab4d1db753b62a77.webp)
默认账号和密码都是 nacos
使用 Nacos 完成服务注册
- 在 cloud-demo 父工程中添加
spring-cloud-alilbaba
的管理依赖:
xml
<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>
-
注释掉 order-service 和 user-service 中原有的 eureka 依赖。
-
添加 nacos 的客户端依赖:
xml
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 修改 user-service&order-service 中的
application.yml
文件,注释 eureka 地址,添加 nacos 地址:
yaml
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务地址
- 启动并测试:
![](https://file.jishuzhan.net/article/1723338056720715777/97b5d8b9346cf2d7ac3becf18ee3662f.webp)
可以发现服务成功注册到 nacos 中
Nacos 服务分级存储模型
![](https://file.jishuzhan.net/article/1723338056720715777/bb34abdfebeaa7726332fad6392a1550.webp)
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
本地集群不可访问时,再去访问其它集群
集群具有容灾的作用
![](https://file.jishuzhan.net/article/1723338056720715777/6551d7990f16585d7e1f1cf31ea827d7.webp)
配置实例的集群属性
yaml 文件中配置为 HZ 集群将 userservice1 / userservice2 实例启动
![](https://file.jishuzhan.net/article/1723338056720715777/50774c60f88913e0c4f20aa712e867a1.webp)
yaml
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务地址
discovery:
cluster-name: HZ
yaml 文件中配置为 SH 集群将 userservice3 实例启动
yaml
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务地址
discovery:
cluster-name: SH
可以看到 userservice 有 2 个集群,3 个实例
![](https://file.jishuzhan.net/article/1723338056720715777/6b8586a47b61585c76e61b17155aae43.webp)
HZ 集群 和 SH 集群
![](https://file.jishuzhan.net/article/1723338056720715777/9d188712c67d7da38c9779bde4ba4ef3.webp)
总结:
![](https://file.jishuzhan.net/article/1723338056720715777/63d93d78d45db947b824ad5394806abc.webp)
集群负载均衡策略 NacosRule
我们现在要做的是让 orderservice 远程调用 userservice 时,优先选择本地集群,所以需要给 orderservice 配置集群
orderservice
的 yaml 配置文件中
yaml
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务地址
discovery:
cluster-name: HZ # 集群名称
- 在 order-service 中设置负载均衡的 IRule 为 NacosRule,这个规则优先会寻找与自己同集群的服务:
yaml
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
上述配置是当 orderservice 访问 userservice 服务时生效
当同集群要访问的服务挂掉时,则会访问其它集群的服务
![](https://file.jishuzhan.net/article/1723338056720715777/e0294c4fb78e5f7125ef5bbf40804179.webp)
根据权重负载均衡
实际部署中会出现这样的场景:
- 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
![](https://file.jishuzhan.net/article/1723338056720715777/e18bd70cfca5ec2210db8f94bc61c531.webp)
总结:
![](https://file.jishuzhan.net/article/1723338056720715777/0315e26a2c090490b4e868d669fbcf90.webp)
Nacos 环境隔离(命名空间)
Nacos中服务存储和数据存储的最外层都是一个名为 namespace 的东西,用来做最外层隔离
![](https://file.jishuzhan.net/article/1723338056720715777/0a9acd7aae17c58d3b5e46b6ce5dfee7.webp)
- 在 Nacos 控制台可以创建 namespace,用来隔离不同环境
![](https://file.jishuzhan.net/article/1723338056720715777/e17f1cb4a8255ae5b7ff06405cf164a4.webp)
- 然后填写一个新的命名空间信息:
![](https://file.jishuzhan.net/article/1723338056720715777/fe8f25b0e14ea9d5dc9d43954c9d359c.webp)
- 保存后会在控制台看到这个命名空间的
id
:
![](https://file.jishuzhan.net/article/1723338056720715777/bf8f4e7e7bf5f027d8207ecb281948c6.webp)
- 修改
order-service
的application.yml
,添加namespace
:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
application:
name: orderservice # 微服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务地址
discovery:
cluster-name: HZ # 集群名称
namespace: 52a45462-a6cf-4d9d-9627-110d4896d696 # dev命令空间 ID
![](https://file.jishuzhan.net/article/1723338056720715777/70385774b4b3d27ea037114adc8a535f.webp)
- 重启 order-service 后,再来查看控制台:
![](https://file.jishuzhan.net/article/1723338056720715777/48629f3733b12e50671a2ef4d3e1f6f8.webp)
- 此时访问 order-service,因为
namespace
不同,会导致找不到 userservice,控制台会报错:
![](https://file.jishuzhan.net/article/1723338056720715777/9263beef11faeeed561efc4632aa4149.webp)
![](https://file.jishuzhan.net/article/1723338056720715777/45e1b8453a5d511083b6111e20fd96bd.webp)
Nacos 和 Eureka 的区别
nacos注册中心细节分析
Nacos 中将实例分为临时实例与非临时实例
![](https://file.jishuzhan.net/article/1723338056720715777/1f1890c0d56f169010290303f486291c.webp)
临时实例和非临时实例
服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置(ephemeral
):
yaml
spring:
nacos:
server-addr: localhost:8848 # nacos 服务地址
discovery:
cluster-name: HZ # 集群名称
namespace: 52a45462-a6cf-4d9d-9627-110d4896d696 # dev命令空间 ID
ephemeral: false # 是否是临时实例
临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会
![](https://file.jishuzhan.net/article/1723338056720715777/c36a0846b76da2ad9eafc8599aaf0163.webp)
![](https://file.jishuzhan.net/article/1723338056720715777/0a0acddd09c71045f3ef05012cca5d28.webp)
- Nacos 与 eureka 的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
- Nacos 与 Eureka 的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式