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 { //获得访问的"服务提供者"的端口号信息@AutowiredRestTemplate 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 { //该类为控制层类,可调用业务层中的代码@AutowiredRibbonService 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( ) 方法筛选服务清单”,然后以 线性轮询的方式从 过滤后的服务清单选择一个服务

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯国赛】动态规划

“动态规划”在蓝桥杯中的出题类型&#xff0c;主要为两种&#xff0c; 要格外注意&#xff0c;每一次 dp 的迭代更新&#xff0c;都是针对于当前位置下的“所有情况”进行的&#xff0c; 应着眼于当前位置的每一种情况。 类型一&#xff1a;一共有多少种情况&#xff1f; 1…

使用 Apache Commons Exec 自动化脚本执行实现 MySQL 数据库备份

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Part 3.1 深度优先搜索

深度优先搜索&#xff08;DFS&#xff09;&#xff0c;即按照深度优先的顺序搜索的算法。 深度优先搜索一般使用栈来实现。 [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 6 6 6 \times 6 66 的跳棋棋盘&#xff0c;有六个棋子被放置在棋盘上&#xff0c;使得…

go解析yaml

go解析yaml文件关键就是结构体的创建 初学go tag字段要和yaml文件中的key对应起来&#xff0c;每个层级都要创建对应的结构体&#xff0c;有点烦 package configimport ("gopkg.in/yaml.v3""os" )type Config struct {MysqlConfig MysqlConfig yaml:&q…

开发nfc读卡器应用出现报错Unhandled Exception: SCARD_E_NO_SERVICE

使用flutter开发ACR122U的nfc读卡器的时候&#xff0c;报错&#xff1a; [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Exception: Error while establing context. Reason: SCARD_E_NO_SERVICE #0 PCSCBinding._checkAndThrow (package:fl…

Flink实现实时异常登陆监控(两秒内多次登陆失败进行异常行为标记)

Flink实现异常登陆监控&#xff08;两秒内多次登陆失败进行异常行为标记&#xff09; 在大数据处理领域&#xff0c;Apache Flink 是一个流行的开源流处理框架&#xff0c;能够高效处理实时数据流。在这篇博客中&#xff0c;我们将展示如何使用 Apache Flink 从 MySQL 中读取数…

科研数据分析常见问题

许多使用SPSSAU进行初次科研数据分析的同学&#xff0c;可能对数据分析方法的深层原理和研究思路缺乏全面的把握。因此&#xff0c;当导师针对数据研究方法提出具体问题时&#xff0c;他们可能会感到些许困惑或难以立即给出满意的答复。鉴于此&#xff0c;SPSSAU汇总了一些常见…

【工具】创客贴会员|创客贴截止2024年6月所有AI功能效果实测(热门推荐和图片编辑部分)

上一篇&#xff1a;【工具】创客贴会员&#xff5c;万字测评&#xff01;前沿设计网站创客贴的 AI 文生图效果测评 上一篇写的时候只测了文生图&#xff0c;因为百度那边活动没和创客贴接洽好&#xff0c;他们不清楚创客贴的AI和其他会员功能分开了&#xff0c;导致只有10次体…

virtualbox中ubuntu22.04网络配置

第一&#xff1a;添加两个网卡&#xff0c;网卡1是NAT方式&#xff0c;网卡2是仅主机模式&#xff08;两个顺序不能颠倒&#xff09; 第二步&#xff1a;启动ifconfig查看网络

搭载昇腾310NPU的Orange Pi AIpro开箱体验以及深度学习样例测试

Orange Pi AIpro开箱体验以及样例测试 随着人工智能和物联网技术的快速发展&#xff0c;单板计算机&#xff08;Single Board Computer, SBC&#xff09;在创客和开发者社区中越来越受到欢迎。我最近入手了一款高性能的单板计算机——Orange Pi AIpro。 在入手此款AI开发板之…

探索 Ollama: 你的本地 AI 助手

本期推荐的开源项目是 Ollama&#xff0c;它是一款本地大模型运行工具&#xff0c;可以帮助用户轻松下载和运行各种大型语言模型&#xff08;LLM&#xff09;&#xff0c;而无需将数据上传到云端。以下是关于 Ollama 的介绍以及安装和使用教程&#xff1a; Ollama 是什么&#…

VB.net 进行CAD二次开发(二)

利用参考文献2&#xff0c;添加面板 执行treeControl New UCTreeView()时报一个错误&#xff1a; 用户代码未处理 System.ArgumentException HResult-2147024809 Message控件不支持透明的背景色。 SourceSystem.Windows.Forms StackTrace: 在 System.Windows…

Spring事务管理进阶-rollbackFor propagation

黑马程序员JavaWeb开发教程 文章目录 一、rollbackFor二、propagation2.1 事务传播行为2.2 场景 一、rollbackFor 默认情况下&#xff0c;只有初选RuntimeException才会回滚异常。roolbackFor属性用于控制出现何种异常类型&#xff0c;回滚事务。 二、propagation 用来配置事…

网络安全基础技术扫盲篇 — 名词解释之“数据包“

用通俗易懂的话说&#xff1a; 数据包就像是一个信封。当你写信给某个人时&#xff0c;你将内容写在一张纸上&#xff0c;然后将纸叠起来并放入信封中&#xff0c;就形成了一个完整要发送的数据内容。信封上有发件人和收件人的详细地址&#xff0c;还有一些其他必要的信息&…

Java项目:93 springboot学生评奖评优管理系统的设计与实现

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本学生评奖评优管理系统有管理员和教师和学生。 管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;院系信息管理&a…

规则引擎Drools,基于mysql实现动态加载部署

文章目录 一、使用1、参考资料2、引包3、创建规则实体类4、实现drools动态规则5、模拟数据库&#xff0c;实现规则的CRUD6、创建控制层7、测试规则的动态添加&#xff08;1&#xff09;添加规则&#xff08;2&#xff09;修改规则&#xff08;3&#xff09;删除规则 8、模拟2个…

蓝桥杯单片机-国赛7——第十四届主观题代码参考

0.编程心得 本题中&#xff0c;要求测距能达到250cm&#xff0c;因此pca必须配置为0x01&#xff0c;但直接用会死机&#xff0c;因此需要使用CH作为判断量。 【iic的at24c02记录】&#xff1a; 读设备地址&#xff1a;0xA1 写设备地址&#xff1a;0xA0 非应答信号&#xff1…

【Linux】Linux基本指令3

目录 1.date指令 2.cal指令 3.find指令&#xff1a;&#xff08;灰常重要&#xff09; -name 4.grep指令——行文本过滤工具 5.zip/unzip指令&#xff1a; 6.tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包&#xff0c;不打开它&#xff0c;直接看内容 7.bc…

Dinky DorisCDC 整库同步到 Doris

doris flinkcdc语法参考 Flink Doris Connector - Apache Doris 参考&#xff1a; Doris Flink DolphinScheduler Dinky 构建开源数据平台_dinky dolphinscheduler flink-CSDN博客

2024年,抖音小店618十大爆款预测!商家抓紧时间上架!

哈喽~我是电商月月 做电商的玩家都知道&#xff0c;一但到了换季或者是节日大促的时候&#xff0c;销量高&#xff0c;是最容易爆单的阶段 而提前上架一些热卖产品&#xff0c;爆单的几率在自己的店铺机会就越大 而最近的一个大型活动&#xff0c;就是618了&#xff0c;抖音…