• Ribbon框架原理及解析


    1、简介

    Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
    在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。

    2、接口

    Ribbon提供了抽象接口,如IClient,IClientConfig,IRule,ILoadBalancer

    2.1 IClient

    IClient:客户端接口,依赖IClientConfig配置执行请求,返回响应。 

    IClientConfig:客户端配置,主要是属性配置,依赖于IClientConfigKey

    IClientConfigKey:客户端配置键,包含key,类型及对应值信息。

    ReloadableClientConfig:支持重新加载的客户端配置,其依赖Property以及PropertyResolver

    Property:动态配置的封装。

    ReloadableProperty:支持重新加载的动态配置

    PropertyResolver:配置解析器,用于解耦配置与属性源。

    AbstractLoadBalancerAwareClient:使用LoadBalancer的客户端抽象类,执行时,创建LoadBalancerCommand命令,当中会调用抽象方法getRequestSpecificRetryHandler来配置,基于RxJava调用

    2.2 ILoadBalancer

    负载均衡接口,其依赖于Server类,支持添加Server,选择Server以及获取所有及可用 Server列表。

     AbstractLoadBalancer:包含大多数LoadBalancer的公有特征,同时提供了抽象方法根据ServerGroup获取服务器列表方法

    BaseLoadBalancer:实现了AbstractLoadBalancer,也是其它类的基类,其依赖IRule,IPing,IPingStrategy接口。

    DynamicServerListLoadBalancer:可以根据数据源动态更新Server列表

    ZoneAwareLoadBalancer:分区的动态负载均衡。

    其它**LoadBalancer继承自BaseLoadBalancer,决定了**LoadBalancer的依赖组件

    2.2.1 IRule

    负载均衡的规则接口,有很多不同的实现类,主要是根据各自的规则从负载均衡得到 的Server列表中选取其中的一个Server。

    AbstractLoadBalancerRule:是其它规则类的公共基类,是公共的特征即依赖ILoadBalancer。

    ClientConfigEnabledRoundRobinRule:内部包含RoundRobinRule,同时也提供根据客户端配置来设置规则。

    PredicateBasedRule:基于AbstractServerPredicate过滤,然后基于round robin

    AvailabilityFilteringRule:先基于round robin得到server,如果server不可用,继续下一个

    ZoneAvoidanceRule:首先基于zone区选择,然后再根据server的可用性来选择。

    BestAvailableRule:选择并发数最小的

    RandomRule:随机选择

    RoundRobinRule:轮询方式

    ResponseTimeWeightedRule:基于响应时间的权重

    WeightedResponseTimeRule:基于响应时间的权重

    2.2.2 IPing

    判断服务器是否是存活的接口

    AbstractLoadBalancerPing:抽象基类,提供基本实现, 主要是成员AbstractLoadBalancer。

    NIWSDiscoveryPing:基于服务发现,通过发现实例信息的状态 判断服务器是否是存活

    PingUrl:主要是通过向服务器发送get请求, 根据响应来判断是否是存活

    2.2.3 IPingStrategy

    对于多个服务器判断存活的策略,当前只有一个实现类SerialPingStrategy,遍历Server依次IPing。

    2.2.4 AbstractServerPredicate

    对于Server的过滤器,有不同的实现类

    ZoneAffinityPredicate:过滤与当前客户端不在同一服务区的服务器

    AvailabilityPredicate:过滤处于断路以及有太多并发连接的服务器

    CompositePredicate:多个过滤器and操作

    ZoneAvoidancePredicate:过滤测量指标超过阀值的服务区

    参考资料:

    https://github.com/Netflix/ribbon


     

  • 相关阅读:
    全面指南:如何使用Python编写代码,利用热像仪自动测量人员体温进行发热症状的早期筛查
    GORM使用指南一
    电脑开不了机怎么办?三招帮你成功解决!
    微服务分布式架构中,如何实现优雅发版?
    使用 @FastNative 和 @CriticalNative 的区别
    Spring Boot Actuator 介绍
    12代CPU启用SR-IOV vGPU,实现一台电脑当七台用
    LeetCode 1 两数之和
    深入理解Java虚拟机:Jvm性能调优
    Butterworth型IIR滤波器
  • 原文地址:https://blog.csdn.net/wuli2496/article/details/126506741