• 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的相关配置,比如版本信息,就会自动拿到这里的配置:

        com.alibaba.cloud

        spring-cloud-alibaba-dependencies

        2.2.5.RELEASE

        pom

        import

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

        com.alibaba.cloud

        spring-cloud-starter-alibaba-nacos-discovery

    修改对应服务的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并不会将它删除,知道操作人员手动删除实例。

  • 相关阅读:
    使用神经网络实现对天气的预测
    软件工程导论:概述引言
    概率统计·概率论的基本概念【事件独立性、随机变量】
    antd3和dva-自定义组件初始化值的操作演示和自定义组件校验
    Logback 配置文件这样优化,TPS提高 10 倍
    【干货】前后端分离怎么部署?
    【SpringBoot的自动配置--下篇】架构师如何自定义自己的条件注解与自动配置
    K8s源码分析(22)-client go组件之clientset
    试用程序实现不使用缓存字节数组的方法复制C盘根目录下的a,jpg到E盘下的a.jpg
    mybatis date类型比较
  • 原文地址:https://blog.csdn.net/hssjsh/article/details/132888804