文章目录
- 认识 Nacos
- Nacos 安装
- 使用 Nacos 完成服务注册
- Nacos 服务分级存储模型
- 集群负载均衡策略 NacosRule
- 根据权重负载均衡
- Nacos 环境隔离
- 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
命令解压(不能手动)
tar -xvf nacos-server-1.4.1.tar.gz
解压完成后通过如下命令启动 nacos(进入到 nacos/bin
目录下[linux])
sh startup.sh -m standalone
然后访问地址 http://localhost:8848/nacos/#/login ,出现如下界面代表安装成功
默认账号和密码都是 nacos
使用 Nacos 完成服务注册
- 在 cloud-demo 父工程中添加
spring-cloud-alilbaba
的管理依赖:
<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 的客户端依赖:
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 修改 user-service&order-service 中的
application.yml
文件,注释 eureka 地址,添加 nacos 地址:
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务地址
- 启动并测试:
可以发现服务成功注册到 nacos 中
Nacos 服务分级存储模型
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
本地集群不可访问时,再去访问其它集群
集群具有容灾的作用
配置实例的集群属性
yaml 文件中配置为 HZ 集群将 userservice1 / userservice2 实例启动
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务地址
discovery:
cluster-name: HZ
yaml 文件中配置为 SH 集群将 userservice3 实例启动
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务地址
discovery:
cluster-name: SH
可以看到 userservice 有 2 个集群,3 个实例
HZ 集群 和 SH 集群
总结:
集群负载均衡策略 NacosRule
我们现在要做的是让 orderservice 远程调用 userservice 时,优先选择本地集群,所以需要给 orderservice 配置集群
orderservice
的 yaml 配置文件中
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务地址
discovery:
cluster-name: HZ # 集群名称
- 在 order-service 中设置负载均衡的 IRule 为 NacosRule,这个规则优先会寻找与自己同集群的服务:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
上述配置是当 orderservice 访问 userservice 服务时生效
当同集群要访问的服务挂掉时,则会访问其它集群的服务
根据权重负载均衡
实际部署中会出现这样的场景:
- 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
总结:
Nacos 环境隔离
Nacos中服务存储和数据存储的最外层都是一个名为 namespace 的东西,用来做最外层隔离
- 在 Nacos 控制台可以创建 namespace,用来隔离不同环境
- 然后填写一个新的命名空间信息:
- 保存后会在控制台看到这个命名空间的
id
:
- 修改
order-service
的application.yml
,添加namespace
:
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
- 重启 order-service 后,再来查看控制台:
- 此时访问 order-service,因为
namespace
不同,会导致找不到 userservice,控制台会报错:
Nacos 和 Eureka 的区别
nacos注册中心细节分析
Nacos 中将实例分为临时实例与非临时实例
临时实例和非临时实例
服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置(ephemeral
):
spring:
nacos:
server-addr: localhost:8848 # nacos 服务地址
discovery:
cluster-name: HZ # 集群名称
namespace: 52a45462-a6cf-4d9d-9627-110d4896d696 # dev命令空间 ID
ephemeral: false # 是否是临时实例
临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会
- Nacos 与 eureka 的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
- Nacos 与 Eureka 的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式