文章目录
- 一、Nacos
- 1、安装
- 2、服务注册和发现
- 3、服务分级存储模型
- 4、负载均衡策略--NacosRule
- 5、服务实例的权重设置
一、Nacos
1、安装
官网:https://nacos.io/zh-cn/
- 下载
Github主页: https://github.com/alibaba/nacos
Github的Release下载页: https://github.com/alibaba/nacos/releases
- 解压
# bin即启动脚本、可执行文件
# conf即配置文件,nacos默认端口8848
- 启动
双击startup.cmd或者执行cmd命令:
//进入bin目录,打开cmd
// -m standalone即单机启动
startup.cmd -m standalone
- 启动成功
- 登录
2、服务注册和发现
- 在cloud-demo
父工程中添加
spring-cloud-alilbaba的管理依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 子模块下添加nacos的客户端依赖(此时user、order中的eureka可以注释掉了)
<!-- nacos客户端依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 在order和user模块的application.yml文件中,注释eureka地址,添加nacos的地址
server:
port: 8081
spring:
application:
name: userservice # user服务的服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
- 重启order服务,查看nacos,可以看到注册成功
3、服务分级存储模型
一个服务可以部署多个实例,如果将这多个实例部署到同一个机房,万一这个机房出现意外,则整个集群宕掉。因此考虑将以机房划分集群,如上海集群、杭州集群…
可以看出,nacos的服务分级模型中,
一级是服务、二级是集群、三级是实例。
引入集群的概念,其实是做个划分:服务调用尽可能选择本地集群的服务,跨集群调用延迟较高本地集群不可访问时,再去访问其它集群
配置集群属性:
点进去一个服务,可以看到它的集群是default,即默认,没有划分集群
想配置集群属性,可修改application文件
server:
port: 8081
spring:
application:
name: userservice # user服务的服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery: # 新加集群属性
cluster-name: HZ # 配置集群名称,也就是机房位置
修改application的集群信息,启动一个userservice实例,再修改,再启动另一个实例:
刷新nacos,进入userservice服务,可以看到有两个集群,以及集群下的服务实例:
4、负载均衡策略–NacosRule
现在,user服务的实例被部署到了两个集群中:杭州集群和上海集群。接下来实验order调用user服务时,优先选择本地集群的服务。因此,先给order服务添加一个集群属性:
# 修改order服务的application文件
server:
port: 8080
spring:
application:
name: orderservice # order服务的服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery: # 新加集群属性
cluster-name: HZ # 配置成杭州集群,也就是机房位置
重启order服务,查看nacos,发现order的实例已成功位于杭州集群:
此时,多次访问 http://localhost:8080/order/{orderId},发现控制台上三个服务实例均有日志输出,并没有按照集群来优先选择本地。
很明显,这是负载均衡默认的轮询机制。接下来修改默认机制:
在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务实例:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则,这里之前学Eureka时配置的是随机
# 以上配置即:order调用userservice时,优先选择同集群的userservice实例
此时,再多次调用http://localhost:8080/order/{orderId},发现上海集群的8003实例中,控制台没有日志了。可见现在是优先杭州集群的实例。
此时,停掉杭州的两个实例:
再调用http://localhost:8080/order/{orderId},发现请求到了上海集群的userservice的8003实例上。且orderservice控制台输出警告信息A cross-cluster call occurs
,即一个跨集群访问发生。
总结:NacosRule这种负载均衡策略下,优先本地集群的实例,本地的多个可用实例之间则又是随机的策略。