• Ribbon工作原理


    1.ILoadBalancer 负载均衡器,基于IRule 接口实现负载均衡算法,在这个接口里可以自定义负载均衡算法

    Class MyRule Implements IRule{

    }

    来实现特定的规则往特定的服务上分发

    很少需要定制负载均衡算法,除非是hash分发的那种场景,不过分布式系统中尽量减少hash分发情况

    2.Ribbon内置服务站均衡规则

    1)RoundRobinRule:系统内置的默认负载均衡,直接轮训

    2)AvailabilityFilteringRule :这个rule会考察服务器性能

    3)带权重的规则,如果某个服务器响应时间长,权重降低,减少访问

    4)ZoneAvoidanceRule:根据区域或服务器进行负载均衡,就是基于机房的

    5)BastAvaiable:忽略连接失败的服务器,尽量找到并发低的服务器来请求

    6)RandomRule:随机找一个服务器

    3. ribbon里定时ping服务器的接口

    @LoadBalanced注解

    这个注解的意思是,将一个RestTemplate 标志位底层采用LoandBalancerClient来执行实际的HTTP请求

    支持负载均衡

    AsynLoadBalancerAutoConfiguration 带有Asyn 的可以猜想到时异步调用,可能根本没用到

    LoadBalancerAutoConfiguration :专门为Ribbon 搞得一个配置类

    RestTemplateCustomizer : 专门对RestTemplate 进行定制化的一个组件

    内置RestTemplate 拦截器insterceptor拦截器。里边有一些Retry的代码,就是对RestTemplate 调用

    重试

    Ribbon 负载均衡原理

    ribbon 需要配合Eureka一起使用,从Eureka中拿到服务器列表,然后基于服务器列表调用

    通过RestTemplate 请求对应的服务器

    RestTemplate 并不是直接调用接口,而是被LoadBalancerInterceptor 拦截,进行接口处理

    然后由拦截器发起请求

    LoadBalancerInterceptor 拦截器原理

     

    实际上拦截器会把请求交给LoadBalancerClient,去执行实际的请求,LoadBalancerClient 通过@Ben 方法传到LoanBalancerAutoConfiguration

    里面,RestTemplate由LoadBalancerClent.execute()方法执行调用。

    RibbonLoadBalancerClient Ribbon核心入口

    创建一个ILoadBalancer loadBalancer = getLoadBalancer(serviceId);

    获取LoadBalancer 是通过SpringClientFactory来获取对于的LoadBalancer

    SpringClienFactory 是robbon 和Euraka 整合包下的

    这块的意思是对每个服务进行调用都要用到对于的spring 的ApplicationContext 容器,ServiceA 服务对应着自己的

    ApplicationContext容器中去获取自己的LoadBalancer即可

    Ribbon如何持续从eureka中获取注册表

    eureka client 本身30 秒去eureka server 更新一次注册表,拉取增量注册表,所以Ribbon 和Eureka整合的代码中

    一定有定时拉取得代码

    调用PollingServerListUpdater的start()方法,传入一个UpdateAction ,代表的是实际更新注册表的行为

    在PollingServerListUpdate中会开启一个Runnable 线程,定时取UpdateAction 中的操作刷新注册表,从

    eureka client 中获取注册表,刷新到LoadBalancer中

    Ribbon如何用负载均衡算法找到一个server

    LoadBalancer的chooseServer()方法,通过自己内置的负载均衡算法选择一个server

    LoadBalance需要用到IRule IRule 封装的算法用的是RibbonClientConfiguration 中实例化的一个ZoneAvoidancer=Rule

    调用它的choose()方法选择一个server,其实是先执行过滤规则,过滤掉一批server ,根据自己的制定的filter,然后用round robin

    轮训算法,依次获取server

    拿到选出来的server如何发起一个请求

    在LoadBalancerInterceptor中,可以找到调用RibbonLoadBalancerClient.execute()方法的地方

    在RibbonLoadBalancerClient.execute()中调用了apply方法,在这个方法中传入选择出来的server,意思

    是对这台机器发起指定请求,将请求地址封装在LoadBalancerRequest中,将LoadBalancerRequest和server

    再次封装为一个WrapperHttpRequest,然后将封装好的WrapperHttpRequest交给ClientHttpRequestExecution ,

    然后ClientHttpRequestExecution发起http请求

    ribbon 检测服务器存活有效吗

    默认情况下是不生效的eureka 有自己的故障发现和服务摘除机制,ribbon与eureka 整合,自动就有一套

    故障服务发现和摘除机制

    ribbon 中的IPing 会有一个定时任务,每隔30秒执行一下pingTask 任务,把server list 里的服务都ping 一遍

  • 相关阅读:
    如何基于先进视频技术,构建互联网视频监控安全管理平台解决方案
    iview label-in-value 和 @on-change 的使用
    python基础—并发编程
    SpringBoot 3.2.5 + ElasticSearch 8.12.0 - SpringData 开发指南
    2022年认证杯SPSSPRO杯数学建模D题(第一阶段)食品风味与风味物质求解全过程文档及程序
    PAT甲级 A1057 Stack
    河北联通HG680-L_S905L2_线刷固件包
    【左程云算法全讲3】归并排序与随机快排
    R-Drop: Regularized Dropout for Neural Networks解读
    干货分享——数字孪生应用与现实世界的虚实交互
  • 原文地址:https://blog.csdn.net/wumingxiaozei/article/details/125431081