• 微服务技术栈-Ribbon负载均衡和Nacos注册中心



    前言

    在上面那个文章中介绍了微服务架构的概念以及eureka注册中心的概念,在本节中我们将继续介绍微服务技术栈的其他两个组件Ribbon和Nacos。


    一、Ribbon负载均衡

    1.LoadBalancerInterceptor(负载均衡拦截器)

    在上篇文章中讲到,Spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。

    那么这个负载均衡底层是由谁帮助我们完成的呢?为什么发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081/user/1的呢?

    解答:SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。
    在这里插入图片描述
    接下来我们在源码中追踪一下负载均衡功能的具体实现。
    在这里插入图片描述
    底层源码:

    • request.getURI():获取请求uri,本例中就是 http://user-service/user/8
    • originalUri.getHost():获取uri路径的主机名,其实就是服务id,user-service
    • this.loadBalancer.execute():处理服务id,和用户请求。

    this.loadBalancer是LoadBalancerClient类型,我们继续跟入execute方法。
    在这里插入图片描述

    • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。
    • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。

    2.负载均衡策略IRule

    从上面的源码可以看出getServer(loadBalancer)方法利用内置的负载均衡算法,从服务列表中选择一个。
    在这里插入图片描述
    继续追踪chooseServer方法,发现里面有个rule。
    在这里插入图片描述这里的rule默认值是一个RoundRobinRule,看类的介绍:
    在这里插入图片描述
    RoundRobinRule()是轮询的意思,到这里,整个负载均衡的流程我们就清楚了。

    总结:SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。

    负载均衡的规则都定义在IRule接口中,接下来我们来研究一下IRule接口。
    在这里插入图片描述
    IRule接口有很多不同的实现类,不同实现类的含义不同,默认的实现就是ZoneAvoidanceRule,是一种轮询方案

    如果我们要更改负载均衡策略,即自定义负载均衡策略,我们要怎么办?

    1.代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:

    @Bean
    public IRule randomRule(){
        return new RandomRule();
    }
    
    • 1
    • 2
    • 3
    • 4

    2.配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则

    userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 
    
    • 1
    • 2
    • 3

    二、Nacos注册中心

    1.Nacos简介

    在上篇文章中已经介绍了eureka这个注册中心,现在来介绍另外一个注册中心Nacos。Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka,Ncaos功能更加丰富,在国内受欢迎程度较高。
    在这里插入图片描述
    Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。主要差异在于依赖不同和服务地址不同。

    2.搭建Nacos注册中心

    1)引入依赖
    在cloud-demo父工程的pom文件中的中引入SpringCloudAlibaba的依赖:

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-alibaba-dependenciesartifactId>
        <version>2.2.6.RELEASEversion>
        <type>pomtype>
        <scope>importscope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在user-service和order-service中的pom文件中引入nacos-discovery依赖:

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    2)配置nacos地址
    在user-service和order-service的application.yml中添加nacos地址:

    spring:
      cloud:
        nacos:
          server-addr: localhost:8848
    
    • 1
    • 2
    • 3
    • 4

    重启微服务后,登录nacos管理页面,在服务列表可以查看服务信息。
    在这里插入图片描述

    3.服务分级存储模型

    一个服务可以有多个实例,假如这些实例分布于全国各地的不同机房,nacos就将同一机房内的实例划分为一个集群
    在这里插入图片描述
    微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。修改application.yml文件,添加集群配置。

      cloud:
        nacos:
          server-addr: localhost:8848
          discovery:
            cluster-name: HZ
    
    • 1
    • 2
    • 3
    • 4
    • 5

    默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。

    userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
      ribbon:
        NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
    
    • 1
    • 2
    • 3

    因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。在nacos控制台,找到实例列表,点击编辑,即可修改权重。(如果权重修改为0,则该实例永远不会被访问)
    在这里插入图片描述

    在这里插入图片描述

    4.环境隔离

    Nacos提供了namespace来实现环境隔离功能:
    1.nacos中可以有多个namespace。
    2.namespace下可以有group、service等。
    3.不同namespace之间相互隔离,例如不同namespace的服务互相不可见。
    在这里插入图片描述
    给微服务配置namespace只能通过修改配置来实现。例如,修改application.yml文件,指定命名空间。

    spring:
      cloud:
        nacos:
          server-addr: localhost:8848
          discovery:
            cluster-name: HZ
            namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果order-service和userservice在不同的命名空间下,此时访问order-service,因为namespace不同,会导致找不到。

    5.Nacos与Eureka的区别

    Nacos的服务实例分为两种类型:
    1.临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
    2.非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

      cloud:
        nacos:
          server-addr: localhost:8848
          discovery:
            cluster-name: HZ
            ephemeral: false  #设置为非临时实例
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待。
    1.Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式(亲儿子)
    2.临时实例心跳不正常会被剔除,非临时实例则不会被剔除。
    3.Nacos支持服务列表变更的消息推送模式,服务列表更新更及时。
    在这里插入图片描述


    总结

    Nacos和Eureka整体结构类似,都支持服务注册和服务拉取以及服务提供者心跳方式做健康检测,但是也存在一些差异。在后续的文章中我们将学习更多有关nacos的知识,包括统一配置中心,热更新以及nacos集群。


  • 相关阅读:
    记录一个git无法push的问题
    监控易:支持多种协议和设备,适应复杂多变的IT环境
    「PAT乙级真题解析」Basic Level 1109 擅长C (问题分析+完整步骤+伪代码描述+提交通过代码)
    “要卷就卷创新”,百度在走一条难而正确的路
    Power BI 傻瓜入门 8. 制作数据模型
    Qt QFile文件操作详解
    前端Math属性方法汇总集锦
    第四章——PCA降维
    【RealTek sdk-3.4.14b】RTL8197FH-VG+RTL8367+RTL8812F WiFi to LAN 和WiFi to WAN吞吐量
    7.5面试问答
  • 原文地址:https://blog.csdn.net/qq_52173163/article/details/133519670