接上篇,继续学习微服务框架中的Nacos注册中心。
Nacos注册中心
一、认识和安装Nacos
1.认识Nacos
Nacos
是阿里巴巴的产品,现在是SpringCloud
中的一个组件。相比Eureka
功能更加丰富。
2.安装Nacos
下面给大家展示windows安装Nacos步骤:
- 下载安装包
Nacos下载地址
-
解压
-
端口配置
Nacos默认是 8848端口,如果你的8848端口已被占用,可以在conf配置文件夹中找到
进行配置端口,
我这里就不牵扯修改端口了。 -
启动
加入bin目录结构下:
进入cmd,执行命令startup.cmd -m standalone
单机启动。
-
访问
按照启动之后控制台输出的地址进行访问
登录默认账号和密码都是nacos
二、Nacos快速入门
1. 服务注册到Nacos
- 把 cloud-demo父工程中添加spring-cloud-alibbaba的管理依赖
<!--nacos的管理依赖-->
<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中原有的 euerka 依赖
- 添加nacos的客户端依赖:
<!--nacos客户端依赖包-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
启动两个服务,在nacos查看服务注册情况
三、Nacos服务分级存储模型
- 为了提升整个系统的容灾性,Nacos 引入了地域 (Zone) 的概念,如上图中的北京、上海和杭州。把同一个服务的多个实例部署到不同地域的机房中 (鸡蛋分开不同的篮子放) ;又把在同一个地域的机房的多个服务实例称为集群 (Cluster) 。比如,杭州机房的 2 个用户服务 user-service 称为杭州 user-service 集群。
- 因此,在 Nacos 的服务分级模型中,
- 第一级是微服务 (如订单服务) ;
- 第二级是集群 (如北京订单服务集群、上海订单服务集群等) ;
- 第三集是实例 (如杭州服务集群的 8081 端口实例、8082 端口实例等) 。
微服务之间的远程调用要优先调用同一个地域的集群中的实例,因为访问同一个集群中的服务距离较短、速度比较快、延迟比较低 (例如北京集群的订单服务调用北京集群的用户服务) 。而跨地域集群地域距离远、速度慢、延迟高 (例如北京集群的订单服务调用上海集群的用户服务) 。
那为什么 Nacos 还要增加一层【集群】的概念呢?
首先就是为了避免跨地域集群的远程调用发生,让微服务之间的远程调用尽可能地发生在同一个地域集群中,保证访问的高速低延迟。其次就是为了当同地域的集群服务不可用时,可以跨地域集群访问,保证服务的高可用,提升系统的容灾能力。
1. 服务集群属性
- 修改 application.yml ,添加如下内容:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: XA #集群名称 这里指西安
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: SH #集群名称 这里指上海
- 在Nacos控制台可以看到集群变化
下来我们进行测试对 orderservice 也进行集群配置,配置到 西安,看orderservice 会不会优先访问 西安的 userservice 。答案是不会,因为此时我们没有配置负载均衡机制,默认的负载均衡机制是轮询的,所以两个userservice都会接收到请求。
2. 根据集群负载均衡
-
修改order-service的application.yml ,设置集群为HZ:
-
在order-service中设置负载均衡的Rule为 NacosRule,这个规则会优先寻找与子集同集群的服务:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡策略
- 将user-service的权重都设置为1
【注意】此时把西安集群的 2 个用户微服务实例 8081 和 8082 停掉,那么订单微服务就不得不跨地域集群去访问上海集群的用户服务实例 8083 了。
3.根据权重负载均衡
针对公司服务器性能水平参差不齐的情况,我们希望性能强的服务器承担更多的微服务远程调用,而性能稍弱的微服务承担较少的访问,从而最大限度地发挥服务器的最佳性能和利用率。但目前 NacosRule 的策略是集群优先,然后随机,这无法满足上述需求。
因此,Nacos 提供了权重 (值域 0~1) 配置来控制访问频率,权重越大的服务器则访问频率越高。当权重调为 0 时就不会被访问,可以做无感知的停机升级和灰度测试。
进入 Nacos 控制台主页,进入用户服务 userservice 【详情】,默认权重都为 1 。现在假设 8081 是性能强的服务器,8082 是性能弱的服务器,因此把 8081 的权重设置得大一些,而 8082 的权重设置得小一些。
点击右侧的【编辑】,把 8082 的权重设为 0.1 。
这样,8081 被访问到的概率就应该是 8082 的 10 倍。
我们 测试一下。结果是试了 20 几次,只有 1 次访问到 8082 ,其余都访问到 8081 了。说明权重生效。