Nacos注册中心
注册中心
注册中心就是专门对服务的信息进行存储和管理的服务器
如果没有注册中心,在微服务时代我们是把一个大项目拆分成细粒度的小项目,小项目之间需要维护关系,那么
维护成本高
没有注册中心,服务之间调用时需要在配置文件或代码中写死服务的地址,如果需要修改则需要停止项目进行修改
常用的注册中心有:nacos、eureka、zookeeper、consul
CAP理论
分布式系统设计中设计了CAP理论中,需要符合其中的两项
C
:consistency
一致性,所有节点在同一时间的数据完成一致
A
:availabilty
可用性,服务在正常的响应时间内是可用的
P
:partition tolerance
分区容错性,以实际效果而言,分区相当于对通信的时限要求,系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择
注册中心一般选择AP
Nacos
Nacos
是Spring Cloud Aliaba
提供的一个软件
这个软件主要具有注册中心和配置中心(最后再讲)的功能
微服务中的所有项目都必须先注册到注册中心才能成为微服务的一部分
Nacos的安装及启动
解压nacos的压缩包到没有中文路径或空格的地方即可
需要注意的是Nacos
是java
开发的,所以需要JAVA_HOME
的变量
解压后进入bin目录,有四个文件:shutdown.cmd
、shutdown.sh
、startup.cmd
、startup.sh
其中,.sh
结尾的文件是Linux
系统启动或关闭nacos
的脚本;.cmd
结尾的文件是windows
下启动或关闭nacos
的脚本
注意,不要双击startup.cmd
文件,因为nacos
有两个模式:standalone
、cluster(默认)
由于没有cluster
环境,所以在dos
窗口中,输入以下命令
startup.cmd -m standalone
(访问路径:http://localhost:8848/nacos)
用户名和密码:nacos
idea中配置nacos
配置nacos的客户端
business、order、cart、stock都需要做以下操作
首先在pom文件中,添加nacos
依赖1
2
3
4
5<!--添加nacos依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置application-dev.yml
1
2
3
4
5
6#配置nacos相关信息
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置nacos服务器地址,默认是localhost:8848
启动四个服务,在nacos
的管理界面中找到服务管理—>服务列表,观察是否有服务信息
搭建高可用集群
以stock为例:20003、20004、20005启动三台stock服务
启动stock所有的服务,会发现nacos中的stock
对应的实例数变成了3
Nacos常见面试题
Nacos的心跳机制
Nacos内部注册的服务都会有一个心跳机制,心跳机制的目的,是每个服务和nacos保持沟通和交换信息的机制
默认情况下,服务启动后每隔5秒会向nacos发送一个”心跳包“,这个心跳包中包含了当前服务的基本信息
Nacos接收到这个心跳包,首先会检查当前服务在不在注册列表中,如果不在就新服务进行注册,如果在,表示当前这个服务是健康状态(健康状态,就是服务可用)
如果一个服务连续3次心跳(15秒)没有和Nacos进行信息的交换,Nacos就会将当前服务标记为不健康的状态(大概是橙粉色)
如果一个服务连续6次(30秒)没有和Nacos进行信息的交换,Nacos会将当前服务从注册表中剔除
发送心跳包的这些默认时间都是改变的
实际上nacos的服务实例还是有分类的:
临时实例(默认的)
永久实例(持久化实例)
默认每个服务都是临时实例,如果想要标记一个服务为永久实例,需要以下配置:1
2
3
4
5
6
7#配置nacos相关信息
spring:
cloud:
nacos:
discovery:
#ephemeral设置当前服务注册到nacos的类型,默认是true(临时实例),false(永久实例)
ephemeral: false
永久实例启动时向nacos进行注册,nacos会对这个实例进行持久化的处理
心跳包的规则和临时一致,只是不会从注册表中剔除
一般情况下,我们创建的服务都是临时实例
只有项目的主干业务才会设置为永久实例
Nacos的保护阈值
保护阈值为了防止因为过多实例故障,导致所有流量全部流入剩余的健康实例,继而对健康实例造成流量压力过大而导致崩溃形成的雪崩效应。应该将健康保护阈值设置成在0~1之间的数值,比如设置成0.5 。
现在假如:有十个实例,保护阈值是0.5
如果健康状态的实例和所有状态的实例占比不小于0.5,就是健康状态的实例在工作
如果健康状态的实例和所有状态的实例占比小于0.5,这就意味着健康的实例不足五个,触发阈值保护功能
现在,在十个实例中进行负载均衡调用,无论调用实例是否健康,都会返回给客户端进行服务的调用
这样做虽然损失了一部分流量,但是保证了集权中剩余健康实例能正常工作