SpringCLoud——Nacos注册中心

认识Nacos

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件,相对于Eureka功能更加丰富,在国内受欢迎程度较高。

home (nacos.io)

WIndows安装

在WIndows环境下安装,首先我们要进入Nacos的官网,然后点击【前往Github】的按钮,来到Nacos的项目地址:

然后我们点击红色框中的位置,这个位置就是下载的位置,版本可能不一样,点进来之后就像是这样的:

在这里的这个位置就是对应的版本的下载,然后很明显,tar包就是Linux的,zip就是Windows的,所以我们选择下载zip包,这个下载过程会比较慢。

下载好之后,我们就可以将压缩包解压到一个没有中文目录的路径下,解压之后就是这个样子的:

其中,Nacos的默认端口号是8848,如果你发现你的端口已经被占用了,那么你可以到conf目录下找到application.properties文件修改serve.port的值:

启动服务

我们来到bin目录下:

其中,startup就是启动的文件,然后我们在当前目录下打开一个黑窗口,然后输入命令启动:

./startup.cmd -m standalone

其中-m表示启动模式,standlone表示单机模式,之后会介绍到集群启动模式。

启动之后就是这样的:

服务启动成功之后,我们就可以输入服务的网址然后查看服务的UI控制界面:

输入上面的网址之后,你看到的服务界面是这样的:

磨人的账号密码都是nacos:

之后,我们就进入到了nacos的控制台。

Nacos注册中心

服务注册到Nacos

  1. 在cloud-demo父工程中添加spring-cloud-alibaba的管理依赖,这样有关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>

</dependency>

  1. 注释掉order-server和user-server中原有的eureka依赖
  2. 添加nacos的客户端依赖:

<!-- nacos客户端依赖包 -->

<dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

</dependency>

修改对应服务的yml配置文件:

spring:

    cloud:

        nacos:

            server-addr: localhost:8848

其实就是一个指定cacos服务的过程。

然后,在Nacos的UI界面中的服务列表中,就可以看到配置的两个服务消息:

Nacos服务分级存储模型

在之前我们看到过将将启动一个服务的多个实例,在Nacos中,引入了地域的概念,或者称为机房的概念,Nacos将存在于同一个机房中的多个服务称为集群,也就是在Nacos的服务分级中,首先最上级的是服务,然后服务下面是存在于不同地域的集群,集群下面,是存在于不同服务器上的实例:

  1. 一级是服务,例如userservice
  2. 二级是集群,例如杭州或上海
  3. 三级是实例,例如杭州机房的某台部署了userservice的服务器

 服务跨集群调用问题

服务调用尽可能选择本地集群服务,跨集群调用延迟较高

本地集群不可访问,再去访问其他集群。这就是为什么Nacos要配置地域的概念,就是尽量减少跨服务器访问的延迟。

服务集群属性

  1. 1.修改application.yml,添加如下内容:

spring:

    cloud:

        nacos:

            serber-addr: localhost:8848 # Nacos服务端地址

            discovery:

                cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州

  1. 2.在Nacos服务台可以看到集群变化

然后我们点击【详情】按钮,就可以查看具体有哪些集群,以及集群中都各自有哪些实例:

现在就可以看到有两个集群,分别是HZ和SH

NacosRule负载均衡

在默认情况下,即使配置了Nacos的地域,也不会马上应用Nacos的地域优先的访问规则,而是继续之前的轮询的负载均衡规则,这时候就需要手动修改负载均衡的规则:

  1. 修改order-service中的application.yml,设置集群为HZ:

spring:

    cloud:

        nacos:

            server-addr: localhost:8848 # nacos 服务端地址

                discovery:

                    cluster-name:HZ # 配置集群名称,也就是机房位置

  1. 然后在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务

userserver:

    ribbon:

        NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

  1. 注意将user-service的权重都设置为1

然后当我们访问业务的时候,就会优先选择与请求服务的服务器处于同一地域的服务器。

当同一地域中包含多个同一服务的实例的时候,这时候的选择规则是随机选择。也就是说他的负载规则就是优先地域,而后随机。

如果停掉与请求服务处于同一地域的其他服务器,那么再次请求的时候,会请求其他地域的服务,此时会出现一条警告:

意思就是说,我现在是出于HZ的集群,但是我访问了一个处于SH的集群的服务。如果你看到类似的警告出现,那么就说明你的本地集群的服务出现了问题没有被优先访问。

根据权重负载均衡

实际部署中会出现这样的场景:

服务器设备性能有差异,部分梳理所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求

Nacos提供了权重配置来控制访问频率,权重越大访问频率越高。

权重就是手动控制某个服务器承担更多负载的手段。

设置负载均衡可以使用Nacos的UI界面进行设置:

首先点击【详情】:

然后点击【编辑】:

在这里,就可以设置服务器的权重:

一般权重的设置范围是0~1之间,如果权重为0,则不会访问这台服务器。作用就是在版本升级,或者需要关闭,重启服务器的时候,就可以将权重设置为0,然后可以重启服务器进行升级,然后慢慢的升高权重,做到【无感升级】

namespace-环境隔离

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层的隔离:

对于命名空间的设置同样可以在Nacos的UI界面中设置:

  1. 首先在Nacos的图形化界面中新建命名空间

然后点击【新建命名空间】:

然后填写命名空间相关信息:

命名空间的名称和描述是我们必填的,然后命名空间的ID如果不填就默认是一个UUID。

点击【确定】就可以看到一个新的命名空间:

  1. 然后在代码中将服务划分到某个命名空间中

spring:

    cloud:

        nacos:

            serever-addr: localhost:8848

            discovery:

                cluster-name: SH

                namespace: # 命名空间的ID

然后重启对应的服务的实例,就可以在UI界面中看到服务已经转移到了另一个环境中。

在不同环境下的两个服务永远不会被访问到。

nacos注册中心细节分析

nacos的原理与之前的eureka的执行原理是基本相同的,有一点与之前不一样的是,在服务消费者请求服务的时候,并不是每次请求的时候才回去拉取服务器列表,而是定时拉取,并缓存在自己的服务列表缓存中,这样就不用每次请求都拉取可用服务器列表。

并且nacos还有一个特点是【临时实例】,也就是cos将实例分为临时实例和非临时实例,两者最大的区别就是在做心跳检测的时候。当某一台实例是临时实例的时候,nacos会和Eureka一样,定时做心跳检测,当某一次检测时候,临时实例挂掉了,那么nacos就把这个实例剔除自己的维护列表中,这一过程和Eureka是一样的。但是当某一台实例是非临时实例的时候,并不会由提供者去发心跳检测,而是由nacos主动去发请求去询问服务器的健康状态,等于是相反的过程,并且当非临时实例,nacos并不会直接将实例剔除自己的维护列表,而是将实例标记为不健康,并等待实例恢复健康。

并且还有一个区别在于消费者在拉取列表的时候,在之前的Eureka的时候,是消费者要发送请求的时候,主动拉取并缓存服务列表,但是这个拉取有时间延迟,如果有服务器在这个延迟期间挂了,但是在下一次拉取之前有人访问这个服务,那么就会出现问题,所以nacos在拉取列表的时候,除了可以让消费者主动拉取之外,nacos的注册中心还会【主动推动变更消息】,也就是当服务器发生变化的时候,主动将这个变化发送到消费者端。

然后就是在服务中配置非临时实例,测试一下两个实例的不同之处,服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置:

spring:

    cloud:

        nacos:

            discovery:

                ephemeral: false # 设置为非临时实例

设置好之后,来到UI界面的实例详情界面,就可以看到这里的服务器发生了变化:

临时实例为true的表示临时实例,临时实例为false的,就是刚才配置的非临时实例。

当我们把服务停掉的时候,nacos并不会将它删除,知道操作人员手动删除实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值