Spring Cloud | 客户端 “负载均衡器“ : Ribbon

目录:

    • 1. 什么是 "负载均衡" ? ( 通过 "负载均衡" 可以将 "用户请求" "分发" 到 不同的服务器,以此来提高 "性能" 和 "可靠性" )
    • 2. "负载均衡" 的 分类 ?
    • 3. 认识 Ribbon :
      • 3.1 Ribbon 的 含义
      • 3.2 Ribbon 的 实现 ( ①与 "RestTemplate" 相结合 ②与 "Feign" 相结合 )
      • 3.3 Nginx 与 Zookeeper 比较
    • 4. 第一个 Ribbon 实例 :
      • 4.1 改造 "服务提供者"
        • ① 在 "服务提供者" 中 添加 Service层,创建 PortController控制器类
      • 4.2 搭建含有 Ribbon 的 "服务消费者" :
        • ② 创建名称为 :eureka-ribbon-client 的Spring Boot 项目
        • ③ "全局配置文件中" 配置信息
        • ④ 在 "项目启动类" 中添加注解,开启Eureka Client 功能
        • ⑤ 创建 "RibbonConfg 配置类" ( 通过 与 "RestTemplate" 相结合来实现 "Ribbon负载均衡" )
        • ⑥ 创建 Service层 , 创建 RibbonService业务类
        • ⑦ 创建 controller层 , 创建 RibbonService业务类
      • 4.3 测试运行
    • 5. Ribbon 的工作原理
    • 6. Ribbon 负载均衡策略

在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Spring Cloud微服务架构开发》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


  • 微服务架构中,负载均衡 是一个必不可少的技术负载均衡 决定着 整个服务集群性能稳定
  • Spring Cloud 体系中加入了 Netfix公司很多优秀产品,其中一个就是实现客户 负载均衡 工具 : Ribbon。下面将对 客户端负载均衡工具 : Ribbon 进行讲解

1. 什么是 “负载均衡” ? ( 通过 “负载均衡” 可以将 “用户请求” “分发” 到 不同的服务器,以此来提高 “性能” 和 “可靠性” )

  • 负载均衡“高可用” 网络基础架构 的一个关键组成部分有了负载均衡,我们通常 可以部署多台 “应用服务器”,然后
    通过负载均衡 将 “用户的请求” "分发"不同的服务器用来 提高网站应用数据库其他服务性能 以及 可靠性

    ---- 通过"负载均衡"可以 将用户的"请求" "分发"到 不同的服务器 ,以此来 提高"性能" 和 “可靠性”。

    ---- 通过 “负载均衡” 可以 部署多台 "服务器"。

  • 下面我们来看一个 不使用 “负载均衡”Web 架构如下图所示

    在这里插入图片描述

    上图中客户端之间通过因特网Web服务器端相连”。
    假想
    如果 Web 服务器 “宕机”
    用户访问网站时就将 “得不到” 任何响应,出现 单点故障问题 即使服务器可以正常工作如果 很多用户同时访问服务器数据 超过服务器的 处理能力,就会出现 响应速度慢 或者 无法连接 的情况,这也是用户无法接受的。

  • 引入负载均衡可以有效 解决上述问题,它可以将 负载 ( 工作任务 ) 进行 平衡分摊“多个” 执行单元 ( 如 Web服务器FTP服务器企业关键应用服务器其他主要任务服务器等上运行协同完成工作任务

2. “负载均衡” 的 分类 ?

  • 负载均衡 分为 “硬件” 负载均衡“软件” 负载均衡两种具体介绍如下 :

    (1) “硬件” 负载均衡解决方案就是直接服务器外部网络 之间 安装 “负载均衡设备”,通常这种设备称负载均衡器
    这样由 专门的设备 完成专门的任务负载均器独立于操作系统之外整体性能 得到大幅提高。加上多样化负载均衡策略智能化流量统计“硬件” 负载均衡解决方案 可达到 最佳负载均衡效果


    (2) “软件” 负载均衡解决方案是指在 一台多台服务器相应的 操作系统安装一个多个 "附加软件"来实现负载均衡
    DNS Load BalanceCheckPoint Firewall-1 ConnectControl 等。

    优点基于特定环境配置简单使用灵活成本低廉,可以 满足一般的负载均衡需求无论哪种负载均衡策略,都是为了系统高可用缓解网络压力以及扩容机器处理能力

  • 下面我们来看一个 使用 “负载均衡”Web架构具体如下图所示 :
    在这里插入图片描述

    上图所示架构中,负载均衡器维护一个可用的 “服务清单”,通过 心跳检测剔除故障服务端节点保证服务清单 中都是 可以正常访问服务器。当客户端借助网络 发送请求负载均衡器时,负载均衡器按照 “某种算法,从维护的服务清单里面"选择"
    一个服务器
    ,并将 客户端请求 "转发"到指定的服务器,从而提高 系统可用性稳定性

3. 认识 Ribbon :

3.1 Ribbon 的 含义

  • RibbonNetflix 公司的一款用于 客户端 负载均衡开源软件工具。它在集群中为 各个客户端通信 提供了 支持,有助于
    控制 HTTPTCP 客户端行为提供了很多 负载均衡算法,例如
    轮询
    随机算法等,同时也可以实现自定义的算法

3.2 Ribbon 的 实现 ( ①与 “RestTemplate” 相结合 ②与 “Feign” 相结合 )

  • Spring Cloud 构建的 微服务架构Ribbon 作为 服务消费者负载均衡器,有 两种 “使用方式” ( Ribbon 的 “实现方式” ):

    • (1) 一种与 RestTemplate 相结合

    • (2) 另一种与 Feign 相结合Feign已经默认集成RibbonRibbon 包含很多 “子模块”,但很多子块 没有用于生产环境。 目前 用于生产的Ribbon子模块 具体如下

      ① mibbon-core : 包括定义 负载均衡接口客户端接口内置负载均衡实现接口 等的 API
      ② ribbon-eureka : 提供 Eureka客户端 实现 "负载均衡"API
      ③ ribbon-httpclient : 对 ApacheHttpClient 进行封装。该
      模块
      提供了 含有 “负载均衡” 功能REST客户端。、

  • Spring Cloud 中,当 Ribbon ( 负载均衡 ) 和 Eureka ( 服务注册与发现 ) 配合使用的时候,Ribbon 可从 Eureka Server获取 服务提供者 “地址列表”,并 基于 “负载均衡算法”请求 其中一个 服务提供者实例

    Ribbon 整合 Eureka结构示例 如下图所示

    在这里插入图片描述

    上图可见该结构包含 一个 Eureka服务器 3个服务提供者以及 一个含有Ribbon服务消费者
    3个服务提供者Eureka服务器 "注册服务",当
    多个URL服务消费者 发起请求时,基于Ribbon负载均衡器 能够有效地将请求分摊不同的机器上

3.3 Nginx 与 Zookeeper 比较

  • NginxZookeeper 也是 可以作为 “负载均衡器” 使用 的,具体介绍如下 :

    (1) Nginx著名反向代理服务器,也被广泛地 作为 “负载均衡器” 使用。它的负载均衡配置非常简单Nginx配置
    多个Web服务器
    用户访问 Nginx 时,就会 自动被分配” 到 “某个Web 服务器


    (2) ZooKeeper“分布式协调服务” 框架,有时 也被用来作为 “负载均衡器” 使用ZooKeeper作为一个服务注册中心其中登记了每个服务每台服务器知道自己 “属于哪个服务”,在 服务器启动时,自己向所属服务进行登记

4. 第一个 Ribbon 实例 :

  • 在 服务 “注册与发现“ 框架 : Eureka框架 已经实现了Eureka高可用理论上使得微服务架构已经很完美了。但是, 考虑到机器自身硬件条件限制面对 流量高峰系统同样还会存在 宕机 等情况。此时,如果 使用 Ribbon “整合” Eureka “实现负载均衡”将用户请求 “分摊到” 多个服务器上,就能大幅减轻访问服务压力,使系统达到更好的负载能力
  • 下面我们将在 服务 “注册与发现“ 框架 : Eureka框架 搭建Eureka 集群 “基础上” 进行 改造具体步骤如下 :

4.1 改造 “服务提供者”

① 在 “服务提供者” 中 添加 Service层,创建 PortController控制器类
  • ( 前提 : 在 服务 “注册与发现“ 框架 : Eureka框架 敲的项目基础上进行关于 Ribbon 的开发 )

  • 我们服务消费者"集成Ribbon" 实现 客户端负载均。为了验证 服务消费者 调用的是 “哪个服务提供者” 的 服务,下面我们对 服务提供者进行改造改造后服务提供者 提供了"/port" API,用于 返回服务提供者端口号

  • 项目 : eureka-provider ( “第一个” 服务提供者 ) 和 eureka-provider-another ( “第二个” 服务提供者 ) 中 新建 controller包 ( 两个 “服务提供者” 项目中都加 ),并创建PortController类该类 能够 返回当前项目端口号具体代码如下所示 :

    PortController.java :

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    /*
       @ResponseBody注解 :
        ①将方法的返回值转换为指定类型存入到"响应体"中响应给前端 :
          如果返回值为String类型,这个字符串会直接写入"响应体"中响应给前端( 不使用该注解时,String类型的返回值可以返回一个视图页面的,但现在没这个效果了 )
          如果返回值为"对象类型",会默认采用 MappingJackson2HttpMessageConverter 将该对象转换为"JSON格式的字符串",后写入"响应体"中响应给前端。
     */
    @ResponseBody
    @Controller //将该类加入到IOC容器中
    public class PortController { //返回当前项目的"端口号"
    
        @Value("${server.port}")//获取"全局配置文件"中的属性值,并将该属性值注入到下面这个属性中
        String port;
    
        @RequestMapping("/port")
        public String getPort() {
            return "Hello World,I'm from port: " + port;
        }
    
    }
    

4.2 搭建含有 Ribbon 的 “服务消费者” :

② 创建名称为 :eureka-ribbon-client 的Spring Boot 项目
  • 使用 Spring Initializr 方式创建一个名称eureka-ribbon-clientSpring Boot 项目。这里将 Group 命名为 com.myh , 将 Artifact 命名为 eureka-ribbon-client , 添加 Eureka ClientRibbonWeb 的 这 三个依赖项目创建好后pom.xml文件 代码 如下所示 :

    pom.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <!--    SpringBoot的版本为:2.1.7.RELEASE   -->
            <version>2.1.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.myh</groupId>
        <artifactId>eureka-ribbon-client</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka-ribbon-client</name>
        <description>eureka-ribbon-client</description>
        <properties>
            <java.version>1.8</java.version>
            <!--    Springcloud的版本为:Greenwich.SR2  -->
            <spring-cloud.version>GreenWich.SR2</spring-cloud.version>
        </properties>
    
        <dependencies>
    
            <!--  引入了 eureka-client 的jar包   -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--  引入了 Ribbon(客户端的"负载均衡器") 依赖启动器 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </pluginRepository>
        </pluginRepositories>
    
    </project>
    
③ “全局配置文件中” 配置信息
  • 全局配置文件 : application.yml中进行相关配置,包括指定 应用名称端口号服务注册地址 等信息具体代码如下所示

    application.yml :

    spring:
      application:
        name: eureka-ribbon-client #指定该应用的名为 : eureka-ribbon-client / 端口名称配置
    server:
      port: 8764 #指定该应用的端口号为 : 8764
    eureka:
      client:
        service-url:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置)
          defaultZone:
             http://localhost:7000/eureka/  #指定EurekaServer(服务注册中心)的地址
    
④ 在 “项目启动类” 中添加注解,开启Eureka Client 功能
  • 在 “项目启动类” 中 激活 Bureka Client相关配置 : 在项目启动类中 添加 @EnableEuekaClient注解,开启 Eureka Client 功能具体代码如下所示

    在这里插入图片描述

⑤ 创建 “RibbonConfg 配置类” ( 通过 与 “RestTemplate” 相结合来实现 “Ribbon负载均衡” )
  • 创建配置类,在 项目中新建 config,并在该包下创建 RibbonConfg。在 RibbonConfg类注入 restTemplateBean 对象,并在 Bean 对象加上 @LoadBalanced 注解具体代码如下所示

    RibbonConfig.java

    import org.springframework.boot.web.client.RestTemplateBuilder;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration //比较该类为"配置类"
    public class RibbonConfig { //Ribbon : 客户端"负载均衡器" 的 配置类
    
        @Bean //将该方法的返回值对象加入到IOC容器中
        @LoadBalanced // 该注解的作用 : 让 RestTemplate对象/RestTemplate实例 具备"负载均衡"的能力
        public RestTemplate restTemplate(RestTemplateBuilder builder) {
            //返回一个被 @LoadBalanced注解作用的 RestTemplate示例/RestTemplate对象
            //返回一个 具备 "负载均衡"能力的RestTemplate对象
            return builder.build();
        }
    }
    

    在上面的代码中,使用 @Confguration注解RibbonConfg类 “标注为” 配置类@Bean注解作用 : 将 restTemplate( )返回值 : RestTemplate 对象 加入到 IOC容器中@LoadBalanced 注解作用 :让 RestTemplate对象 具备 “负载均衡” 的 能力

⑥ 创建 Service层 , 创建 RibbonService业务类
  • 在 项目中新建 service包,并在该包下创建一个 RibbonService类。在 RibbonService 类hi( )方法中使用restTemplate对象调用eureka-clientAPI具体代码如下所示

    RibbonService.java :

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    @Service //加入ioc容器中
    public class RibbonService { //获得访问的"服务提供者"的端口号信息
    
        @Autowired
        RestTemplate restTemplate;
    
        public String hi() {
            /*
              getForObject()方法用于发起Get请求,
                第一个参数设置 : 请求的url ; 第二个参数指定 "返回结果" 的 Java类型,告诉 RestTemplate 将"响应体中的内容"转换为"指定类型"的对象。
    
              通过url请求访问到 "服务提供者"项目中的/port路径中,获得访问的"服务提供者"的端口信息
                ---(如果每次访问到的端口不是一样的,说明"负载均衡成功了")
             */
            return restTemplate.getForObject("http://eureka-provider/port",String.class); //String.class : 将响应体中内容转换为String类型
        }
    }
    
⑦ 创建 controller层 , 创建 RibbonService业务类
  • 项目中新建 controller在该包下新建一个 RibbonController。在该类上添加 @RestController 注解
    类中写一个 hi( )方法 , 通过该方法调用 RibbonServicehi( )方法具体代码如下所示 :

    import com.myh.eurekaribbonclient.service.RibbonService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController // = @@ResponseBody注解 + @Controller注解
    public class RibbonController { //该类为控制层类,可调用业务层中的代码
    
        @Autowired
        RibbonService ribbonService;
    
        @RequestMapping("/hi")
        public String hi() {
            //获得RibbonService业务类中的hi()方法的内容
            return ribbonService.hi();
        }
    }
    

4.3 测试运行

  • 启动 eureka-servereureka-server-another两个服务器( 服务器注册中心 ) , 启动 eureka-providereureka-provider-another两个 “服务提供者” 启动 服务消费者 : eurek-ribbon-client ( 该服务消费者配置Ribbon负载均衡器 )。

  • 浏览器上访问 http://server1:7000http://server2:7009 ( 这两个为 “服务注册中心” 的 访问url )。无论访问 “哪个Eureka Server”Eureka Server
    注册实例都是一样的,效果如下两图所示

    在这里插入图片描述


    在这里插入图片描述

    上两图看出,"两个"服务提供者"一个"服务消费者已经全部成功注册Eureka ( Eureka Server服务注册中心 )上,实现了高可用为了演示含有Ribbon服务消费者负载均衡效果,使用浏览器多次访问
    http://localhost:8764/hi ( localhost主机名8764端口号 , /hiurl请求 , 请求该项目中控制层中的 /hi路径下对应的方法 )

浏览器页面 访问效果如下图 所示 :

在这里插入图片描述


在这里插入图片描述

从上面两个图 可以看出,当访问 http://localhost:8764/hi 时,浏览器页面轮流显示两个服务提供者” 的 端口号说明负载均衡起了 效果负载均衡器轮流请求 两个服务提供者 中的 “hi”接口

5. Ribbon 的工作原理

  • 前面我们 使用Ribbon "实现负载均衡"时,基本用法注入一个 RestTemplate,并使用@LoadBalanced注解 标注RestTemplate,从而使 RestTemplate 具备 负载均衡能力

  • Spring容器启动,使用 @LoadBalanced注解 修饰RestTemplate 会被 添加到 “拦截器” 中,拦截器 中使用了
    LoadBalancerClient “处理请求”,从而 达到 负载均衡目的 。那么 LoadBalancerClient 内部如何做到的呢?
    下面我们通过 源码分析 的方式来 剖析 Ribbon负载均衡工作原理

  • LoadBalancerClientSpring Cloud 提供的一个非常重要接口,它 继承于 : ServicelnstanceChooser接口该接口实现类 是 : RibbonLoadBalanceClient,它们之间的 关系如下图所示 :

    在这里插入图片描述

  • 为了大家更好地理解中所示接口及其实现类实现细节,我们先来查看 LoadBalancerClient部分源码具体代码如下

    public interface LoadBalancerClient extends ServiceInstanceChooser {
        <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;
    
        <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;
    
        URI reconstructURI(ServiceInstance instance, URI original);
    }
    

    上述源码中LoadBalancerClient 提供的 “两个” execute( )方法 用于**执行请求** , reconstructURI ( )方法用于重构 URL


    继续査看 LoadBalancerClient 继承ServiceInstanceChooser接口源码具体代码如下 :

    public interface ServiceInstanceChooser {
        ServiceInstance choose(String serviceId);
    }
    

    上述源码中ServicelnstanceChooser接口定义了一个choose( )方法。该方法用于根据 serviceId选择一个服务实例,即通过服务名 “选择” 服务实例


  • RibbonLoadBalanceClientLoadBalancerClient实现类,它用来 执行最终负载均衡请求RibbonLoadBalanceClient 中的 choose( )方法用于选择具体的 服务实例,其内部是通过 getServer( )方法交给ILoadBalancer接口 完成的。


    ILoadBalancer 是一个接口,该接口定义了一系列 “实现负载均衡” 的 方法IoadBalancer 接口实现类结构如下图所示

    在这里插入图片描述

    查看 BaseLoadBalancerDynamicServerListLoadBalancer 源码默认情况实现了以下配置

    • (1) IClientConfg clientConfg : 用于配置 “负载均衡客户端默认实现类DefaultClientConfglmpl
    • (2) IRule rule : 用于配置 负载均衡策略默认使用的是 RoundRobinRule 策略,也就是轮询策略
    • (3) IPing ping : 用于检查当前服务是否有响应”,从而判断当前服务是否可用”。默认实现类DummyPing。该 实现类isAlive( )方法返回值true,即 默认所有服务实例都是可用
    • (4) ServerList serverList : 用于获取所有 Server注册列表信息ServerList实现类DiscoveryEnabledNIWSServerList。该类定义obtainServersViaDiscovery( )方法根据 eurekaClientProvider.get()法获取 EurekaClient,再根据 EurekaClient 获取服务注册列表信息”。EurekaClient实现类DiscoveryClientDiscoveryClient 具有服务注册获取服务注册列表 等功能。
    • (5)ServerListFilter flter : 定义了根据 配置过滤者动态获取符合条件服务列表默认实现类ZonePreferenceServerListFilter。该策略能够优先过滤出” 与请求调用方处于同区域服务实例

    综上所述,使用 RibbonLoadBalanceClient 实现"负载均衡"时,会从 EurekaClient 获取 “服务列表信息”,然后根据 IPing 判断服务 “是否可用如果服务可用,就会根据 IRule 选择 "负载均衡策略",否则会 “重新获取” 服务清单


  • 了解了 LoadBalancerClient 负载均衡功能后,那么ResrTemplate 添加 @LoadBalanced 注解后 为什么会被拦截呢?
    这是因为 LoadBalancerAutoConfiguration类维护了一个被 @LoadBalaneed 注解修饰的 ResTemplate 列表,在
    初始化过程中,通过
    调用 customizer.customize( resTemplate )方法
    RestTemplate 添加
    LoadBalancerlnterceptor拦截器,该拦截器中的方法远程服务调用的方法 交给了 LoadBalancerClient 去处理
    从而达到了 负载均衡目的

6. Ribbon 负载均衡策略

  • 默认情况下Ribhon 使用的 负载均衡策略轮询策略。实际上,Ribbon 提供了 很多 负载均衡算法 ,其中 IRue 接口就是 所有负载均衡算法父接口 , 它的实现类结构 如下图所示 :

    在这里插入图片描述

    在上图中AbstractLoadBalancerRule负载均衡策略抽象类。该抽象类定义了负载均衡器 : IoaderBalancer对象 ,对象能够 在具体 实现 "选择服务策略"时,获取到一些负载均衡器维护的信息该信息会作为 选择 "服务策略"时的分配依据,并以此设计一些算法来实现针对特定场景高效策略

  • 在上图中各个实现类实现了一种负载均衡算法,关于这些实现类具体介绍如下 :

    • RoundRobinRule :
      实现了按 “照线性轮询” 的方式 依次选择服务 的功能。
    • WeightedResponseTimeRule :
      RoundRobinRule扩展,会根据平均响应时间 “计算” 所有服务的 “权重”响应时间越快服务权重越大被选中的概率越高
    • ZoneAvoidanceRule :
      它是 PredicateBasedRue具体实现类。其内部通过使用 ZoneAvoidancePredicateAvailabilityPredicate 判断 ”是否选择“ 某个服务前者用于判断服务所在区域的性能是否可用”,后者用于 “过滤掉 连接数过多的服务
    • AvailabilityFilteringRule :
      使用 AvailabilityPredicate 过滤 由于 多次访问出现故障而处于断路器跳闸状态服务,还有 并发的连接数 "超过阈值"服务,然后对 剩余的服务列表进行 轮询
    • BestAvailableRule :
      用于 先过滤掉多次访问出现故障而处于断路跳闸状态服务,然后选择一个 并发量最小服务
    • RetryRule :
      该策略实现了一个 具备 “重试功能”服务选择功能,其内部会"先按照轮询策略" 获取服务如果获取失败就在
      指定时间内重试
      获取可用服务
    • RandomRule :
      该策略实现了从服务清单中随机选择一个服务的功能。
    • ClientConfgEnableRoundRobinRule :
      该类是一个 抽象类。该类本身没有实现特殊处理逻辑,我们 也不会直接使用该策略,但是通过使用 BestAvailableRule继承该策略 默认实现线性轮询。它的内部定义了一个RoundRobinRule 策略
    • PredicateBasedRule : 继承ClientConfgEnableRoundRobinRule,其内部会先通过
      chooseRoundRobinAferFiltering( ) 方法筛选服务清单”,然后以 线性轮询的方式从 过滤后的服务清单选择一个服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/666814.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[香橙派 AIpro] 性能强劲的昇腾AI开发板,应用广泛,性能出众,遥遥领先!

[香橙派 AIpro] 性能强劲的昇腾AI开发板&#xff0c;应用广泛&#xff0c;性能出众&#xff0c;遥遥领先&#xff01; 开发板简介 香橙派AIpro开发板凭借华为昇腾AI芯片的强大算力、丰富的接口、完善的开发工具等优势&#xff0c;在AI开发板市场具有很高的竞争力&#xff0c;可…

基于模板匹配的信用卡数字识别

文章目录 一、项目介绍二、模板匹配的原理三、模板匹配的步骤模板图片处理信用卡图片处理进行模板匹配 一、项目介绍 模板识别&#xff08;Template Matching&#xff09;是一种基于图像匹配的技术&#xff0c;用于在较大图像中识别和定位小图像&#xff08;模板&#xff09;。…

如何在 llama.cpp 服务器中实现用户登录功能的优化方案?(语言-c++)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

揭秘APP广告变现项目

在当今移动应用市场&#xff0c;广告变现已经成为开发者盈利策略的重要组成部分。 通过在应用程序中展示多种类型的广告&#xff0c;如插页式广告、横幅广告和激励视频广告&#xff0c;开发者能够获得经济效益。 实现这一目标的核心在于平衡收入与用户体验&#xff0c;避免过…

前端树形结构组件的设计与实现:以企查查、天眼查股权结构为例

摘要 随着信息化时代的不断发展&#xff0c;数据可视化在各行各业的应用越来越广泛。特别是在商业信息查询领域&#xff0c;如企查查、天眼查等平台&#xff0c;通过直观的数据展示方式&#xff0c;帮助用户快速理解复杂的商业关系。本文将以一个前端tree树形结构模版组件为例…

C语言序列化和反序列化--TPL中的API(三)

tpl_map 创建tpl的唯一方法是调用tpl_map()。第一个参数是格式字符串。后面是格式字符串中特定字符所需的参数列表。例如, tpl_node *tn; int i; tn tpl_map( "A(i)", &i );该函数在格式字符串中的项和给定地址的C程序变量之间创建映射。稍后&#xff0c;C变量…

Java-集合基础

集合 一、含义 集合是Java API所提供的一系列类&#xff0c;可以用于动态存放多个对象 (集合只能存对象)集合与数组的不同在于&#xff0c;集合是大小可变的序列&#xff0c;而且元素类型可以不受限定&#xff0c;只要是引用类型。(集合中不能放基本数据类型&#xff0c;但可以…

element-plus关于表单数据自定义参数校验

element-plus关于表单数据自定义参数校验 核心点&#xff1a; 代码&#xff1a; <el-form-item :prop"tableData[ scope.$index ].score":rules"[{ required: true, message: 得分不能为空, trigger: blur },{ validator: (rule: any, value: any, ca…

服务器主板电池

一、什么是服务器纽扣电池&#xff1f; 服务器纽扣电池&#xff0c;也叫CMOS电池&#xff0c;是一种非常小型的电池&#xff0c;通常与服务器主板上的CMOS芯片相结合&#xff0c;用于储存BIOS设置、时钟和其他关键系统信息。这种电池的体积通常比一枚硬币还小&#xff0c;而且…

JeecgBoot-Vue3:基于Vue3的低代码开发平台的新篇章

摘要 随着前端技术的不断发展&#xff0c;Vue3.0、TypeScript、Vite以及Ant Design Vue等新技术方案的涌现&#xff0c;为低代码开发平台带来了全新的可能性。JeecgBoot-Vue3作为JeecgBoot低代码平台的全新UI版本&#xff0c;采用Vue3技术栈&#xff0c;结合上述先进技术&#…

海外动态IP代理可以用来批量注册邮箱吗?

无论是个人还是企业&#xff0c;都需要使用邮箱进行沟通、注册账号、接收通知等多种用途。然而&#xff0c;由于互联网服务商为了防止滥用和垃圾邮件的传播&#xff0c;通常对注册邮箱设置了一定的限制&#xff0c;如IP限制、验证码验证等。为了解决这些问题&#xff0c;海外动…

【EFK日志系统】docker一键部署filebeat、metricbeat

docker一键部署filebeat、metricbeat filebeat部署创建配置文件一键启动修改配置文件查验信息 metricbeat部署创建配置文件一键启动修改配置文件查验信息 上两篇文章写了搭建部署es集群和部署kibana 这篇写一键部署filebeat和metricbeat收集工具 规划服务器是 es01:172.23.16…

段码屏|液晶显示模块|超低功耗LCD驱动芯片

1 简介 PC164S32 是一款支持 128 点 (32 4)显示 的多功能 LCD 控制器芯片&#xff0c;内部存储器RAM数据直接映射到 LCD 显示。可软件配置特性使其适用于包括 LCD 模块和显示子系统在内的多种 LCD 应用。主控制器与 PC164S32接口仅需3 或 4 条线。内置的省电模式极大的降低了功…

MYSQL四大操作——查!查!查!

目录 简洁版&#xff1a; 详解版&#xff1a; SQL通用语法&#xff1a; 分类&#xff1a; 1. DDL —库 1.1 查询&#xff1a; 1.2 创建&#xff1a; 1.3 删除 1.4 使用库 2. DDL—表 2.1 查询 2.1.1 查询当前库的所有表&#xff1a; 2.1.2 查询表结构 &#xff1a; 2.1.…

【云原生】Kubernetes----POD控制器

目录 引言 一、Pod控制器概述 二、Pod控制器的种类 &#xff08;一&#xff09;ReplicaSet &#xff08;二&#xff09;Deployment &#xff08;三&#xff09;StatefulSet &#xff08;四&#xff09;DaemonSet &#xff08;五&#xff09;Job 三、使用POD控制器 &a…

江苏大信环境科技有限公司:环保领域的开拓者与引领者

2009 年&#xff0c;江苏大信环境科技有限公司在宜兴环保科技工业园成立。自创立之始&#xff0c;该公司便笃定坚守“诚信为本、以质量求生存、以创新谋发展”这一经营理念&#xff0c;全力以赴为客户构建专业的工业有机废气治理整体解决方案&#xff0c;进而成为国家高新技术企…

Vxe UI vxe-upload 上传组件,显示进度条的方法

vxe-upload 上传组件 查看官网 https://vxeui.com 显示进度条很简单&#xff0c;需要后台支持进度就可以了&#xff0c;后台实现逻辑具体可以百度&#xff0c;这里只介绍前端逻辑。 上传附件 相关参数说明&#xff0c;具体可以看文档&#xff1a; multiple 是否允许多选 li…

6.5 Go 指针

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

微信小程序上架,AI类目审核(AI问答、AI绘画、AI换脸)

小程序对于生成式AI类目的产品上架审核较为严格&#xff0c;这也是近两年新增了几个类目&#xff0c;一旦小程序中涉及生成式AI相关的内容&#xff0c;如果你选择相应类目&#xff0c;但审核被划归为这一类&#xff0c;都需要准备此类目的审核&#xff0c;才能正常上架。 如果…

Open3D(C++) Ransac拟合多项式曲线

目录 一、算法原理一、代码实现三、结果展示本文由CSDN点云侠原创,Open3D(C++) Ransac拟合多项式曲线,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 RANSAC(Random Sample Consensus)是一种用于拟合模型的迭…