目录
概况
Git:https://github.com/Netflix/ribbon
Ribbon为netflix开源的基本客户端的负载均衡组件,一般与feign搭配使用。
内部框架
Spring集成Ribbon框架:
集成方式
- 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
负载均衡器核心。整体结构
组件对象 | 功能 |
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选择服务实例流程:
- 通过ServerList获取当前可用的服务实例
- 通过ServerListFilter将步骤1 得到的服务列表进行一次过滤,返回满足过滤器条件的服务实例列表;列表;
- 应用Rule规则,结合服务实例的统计信息,返回满足规则的某一个服务实例;
IRule
定义Ribbon的常见规则的接口,可自定义实现。其常用实现方法有
- RoundRobinRule:通过轮询的方式,选择过程会有最多10次的重试机制
- RandomRule:随机方式,从列表中随机挑选一个服务
- BestAvailableRule:最优匹配规则:从服务列表中给挑选出并发数最少的Server
- RetryRule:采用了装饰模式,为Rule提供了重试机制
- WeightedResponseTimeRule:基于请求响应时间加权计算的规则,如果此规则没有生效,将采用 RoundRobinRule的的策略选择服务实例
源码分析
TODO