Ribbon

目录

概况

内部框架

集成方式

实现原理

LoadBalance

IRule

源码分析


概况

Git:https://github.com/Netflix/ribbon

Ribbon为netflix开源的基本客户端的负载均衡组件,一般与feign搭配使用。

内部框架

Spring集成Ribbon框架:

image.png

集成方式

  • Ribbon服务配置方式。每一个服务配置都有一个Spring ApplicationContext上下文,用于加载各自服务的实例,各个客户端的配置相互独立,彼此不收影响
  • Feign集成模式。在使用Feign作为客户端时,最终请求会转发成 http://<服务名称>/<relative-path-to-service>的格式,通过LoadBalancerFeignClient, 提取出服务标识<服务名称>,然后根据服务名称在上下文中查找对应服务的负载均衡器FeignLoadBalancer,负载均衡器负责根据既有的服务实例的统计信息,挑选出最合适的服务实例

实现原理

和Feign结合的场景下,Feign的调用会被包装成调用请求LoadBalancerCommand,然后底层通过Rxjava基于事件的编码风格,发送请求;Spring Cloud框架通过 Feigin 请求的URL,提取出服务名称,然后在上下文中找到对应服务的的负载均衡器实现FeignLoadBalancer,然后在ServerList通过负载均衡器中挑选一个合适的Server实例,然后将调用请求转发到该Server实例上,完成调用,在此过程中,记录对应Server实例的调用统计信息

LoadBalance

负载均衡器核心。整体结构

image.png

组件对象

功能

Server

Server 作为服务实例的表示,会记录服务实例的相关信息,如:服务地址,所属zone,服务名称,实例ID等ServerList实例状态;

ServerList

维护着一组Server实例列表,在应用运行的过程中,Ribbon通过ServerList中的服务实例供负载均衡器选择。ServerList维护列表可能在运行的过程中动态改变

ServerStats

作为对应Server 的运行情况统计,一般是服务调用过程中的Server平均响应时间,累计请求失败计数,熔断时间控制等。一个ServerStats实例唯一对应一个Server实例

LoadBalanceStats

作为 ServerStats实例列表的容器,统一维护

ServerListUpdater

负载均衡器通过ServerListUpdater来更新ServerList,比如实现一个定时任务,每隔一段时间获取最新的Server实例列表

Pinger

服务状态检验器,负责维护ServerList列表中的服务状态注意:Pinger仅仅负责Server的状态,没有能力决定是否删除

PingStrategy

定义以何种方式还检验服务是否有效,比如是按照顺序的方式还是并行的方式

IPing

Ping,检验服务是否可用的方法,常见的是通过HTTP,或者TCP/IP的方式看服务有无认为正常的请求

  • 维护ServcieList的增删改;

ribbon在默认情况下,会采用如下的配置项,即,采用基于配置的服务列表维护,基于定时任务按时拉取服务列表的方式,频率为30s

<service-name>.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.DiscoveryEnabledNIWSServerList
<service-name>.ribbon.ServerListUpdaterClassName=com.netflix.loadbalancer.EurekaNotificationServerListUpdater
### 更新线程池大小
EurekaNotificationServerListUpdater.ThreadPoolSize=2
###通知队列接收大小
EurekaNotificationServerListUpdater.queueSize=1000
  • 维护Server实例列表状态;

负载均衡器内部会创建一个周期性定时Ping任务。IPing的默认实现,是NIWSDiscoveryPing ,其使用Eureka作为服务注册和发现,则校验服务是否可用,则通过监听Eureka 服务更新来更新Ribbon的Server状态

  • 返回最合适的Server实例。

使用ServerListFilter过滤器过滤出符合要求的服务实例列表List。

LoadBalancer选择服务实例流程:

  1. 通过ServerList获取当前可用的服务实例
  2. 通过ServerListFilter将步骤1 得到的服务列表进行一次过滤,返回满足过滤器条件的服务实例列表;列表;
  3. 应用Rule规则,结合服务实例的统计信息,返回满足规则的某一个服务实例;

 

IRule

定义Ribbon的常见规则的接口,可自定义实现。其常用实现方法有

  • RoundRobinRule:通过轮询的方式,选择过程会有最多10次的重试机制
  • RandomRule:随机方式,从列表中随机挑选一个服务
  • BestAvailableRule:最优匹配规则:从服务列表中给挑选出并发数最少的Server
  • RetryRule:采用了装饰模式,为Rule提供了重试机制
  • WeightedResponseTimeRule:基于请求响应时间加权计算的规则,如果此规则没有生效,将采用 RoundRobinRule的的策略选择服务实例

 

源码分析

TODO

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值