认识Nacos
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件,相对于Eureka功能更加丰富,在国内受欢迎程度较高。
WIndows安装
在WIndows环境下安装,首先我们要进入Nacos的官网,然后点击【前往Github】的按钮,来到Nacos的项目地址:
然后我们点击红色框中的位置,这个位置就是下载的位置,版本可能不一样,点进来之后就像是这样的:
在这里的这个位置就是对应的版本的下载,然后很明显,tar包就是Linux的,zip就是Windows的,所以我们选择下载zip包,这个下载过程会比较慢。
下载好之后,我们就可以将压缩包解压到一个没有中文目录的路径下,解压之后就是这个样子的:
其中,Nacos的默认端口号是8848,如果你发现你的端口已经被占用了,那么你可以到conf目录下找到application.properties文件修改serve.port的值:
启动服务
其中,startup就是启动的文件,然后我们在当前目录下打开一个黑窗口,然后输入命令启动:
其中-m表示启动模式,standlone表示单机模式,之后会介绍到集群启动模式。
服务启动成功之后,我们就可以输入服务的网址然后查看服务的UI控制界面:
Nacos注册中心
<!--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>
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
spring:
cloud:
nacos:
然后,在Nacos的UI界面中的服务列表中,就可以看到配置的两个服务消息:
Nacos服务分级存储模型
在之前我们看到过将将启动一个服务的多个实例,在Nacos中,引入了地域的概念,或者称为机房的概念,Nacos将存在于同一个机房中的多个服务称为集群,也就是在Nacos的服务分级中,首先最上级的是服务,然后服务下面是存在于不同地域的集群,集群下面,是存在于不同服务器上的实例:
服务跨集群调用问题
本地集群不可访问,再去访问其他集群。这就是为什么Nacos要配置地域的概念,就是尽量减少跨服务器访问的延迟。
服务集群属性
spring:
cloud:
nacos:
serber-addr: localhost:8848 # Nacos服务端地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
然后我们点击【详情】按钮,就可以查看具体有哪些集群,以及集群中都各自有哪些实例:
NacosRule负载均衡
在默认情况下,即使配置了Nacos的地域,也不会马上应用Nacos的地域优先的访问规则,而是继续之前的轮询的负载均衡规则,这时候就需要手动修改负载均衡的规则:
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务端地址
discovery:
cluster-name:HZ # 配置集群名称,也就是机房位置
userserver:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
然后当我们访问业务的时候,就会优先选择与请求服务的服务器处于同一地域的服务器。
当同一地域中包含多个同一服务的实例的时候,这时候的选择规则是随机选择。也就是说他的负载规则就是优先地域,而后随机。
如果停掉与请求服务处于同一地域的其他服务器,那么再次请求的时候,会请求其他地域的服务,此时会出现一条警告:
意思就是说,我现在是出于HZ的集群,但是我访问了一个处于SH的集群的服务。如果你看到类似的警告出现,那么就说明你的本地集群的服务出现了问题没有被优先访问。
根据权重负载均衡
服务器设备性能有差异,部分梳理所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大访问频率越高。
一般权重的设置范围是0~1之间,如果权重为0,则不会访问这台服务器。作用就是在版本升级,或者需要关闭,重启服务器的时候,就可以将权重设置为0,然后可以重启服务器进行升级,然后慢慢的升高权重,做到【无感升级】
namespace-环境隔离
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层的隔离:
命名空间的名称和描述是我们必填的,然后命名空间的ID如果不填就默认是一个UUID。
spring:
cloud:
nacos:
serever-addr: localhost:8848
discovery:
cluster-name: SH
然后重启对应的服务的实例,就可以在UI界面中看到服务已经转移到了另一个环境中。
nacos注册中心细节分析
nacos的原理与之前的eureka的执行原理是基本相同的,有一点与之前不一样的是,在服务消费者请求服务的时候,并不是每次请求的时候才回去拉取服务器列表,而是定时拉取,并缓存在自己的服务列表缓存中,这样就不用每次请求都拉取可用服务器列表。
并且nacos还有一个特点是【临时实例】,也就是cos将实例分为临时实例和非临时实例,两者最大的区别就是在做心跳检测的时候。当某一台实例是临时实例的时候,nacos会和Eureka一样,定时做心跳检测,当某一次检测时候,临时实例挂掉了,那么nacos就把这个实例剔除自己的维护列表中,这一过程和Eureka是一样的。但是当某一台实例是非临时实例的时候,并不会由提供者去发心跳检测,而是由nacos主动去发请求去询问服务器的健康状态,等于是相反的过程,并且当非临时实例,nacos并不会直接将实例剔除自己的维护列表,而是将实例标记为不健康,并等待实例恢复健康。
并且还有一个区别在于消费者在拉取列表的时候,在之前的Eureka的时候,是消费者要发送请求的时候,主动拉取并缓存服务列表,但是这个拉取有时间延迟,如果有服务器在这个延迟期间挂了,但是在下一次拉取之前有人访问这个服务,那么就会出现问题,所以nacos在拉取列表的时候,除了可以让消费者主动拉取之外,nacos的注册中心还会【主动推动变更消息】,也就是当服务器发生变化的时候,主动将这个变化发送到消费者端。
然后就是在服务中配置非临时实例,测试一下两个实例的不同之处,服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置:
spring:
cloud:
nacos:
discovery:
设置好之后,来到UI界面的实例详情界面,就可以看到这里的服务器发生了变化: