二刷Ribbon源码(上)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 二刷Ribbon源码(上)

说的多,也要做的多,这样才踏实多。

1.基础知识2.Netflix Ribbon主要组件2.1 ServerList 服务列表2.2 ServerListFilter服务筛选2.3 ServerListUpdater 服务列表的更新2.4 IPing 服务存活检查2.5 IRule 根据算法选择一个服务2.6 ILoadBalancer:统筹者,总管2.7 配置组件组合方式3.SC-Ribbon主要组件(脱离Eureka)3.1 (配置)默认的配置RibbonClientConfiguration3.2 (配置)自定义配置3.2.1 注解式配置类3.2.1 配置文件里配置:3.3 (使用) SpringClientFactory3.4 (使用) LoadBalancerClient3.SC-Ribbon与eureka一起使用又发生了什么4.Resttemplate 如何具有负载均衡能力5.总结


1.基础知识


首先要明白一个基础知识点:

  • Netfix公司开源了一系列微服务组件。项目地址github.com/Netflix。里面有eureka,Ribbon等等
  • SpringCloud 集成了Netfix开源的套件的几个套件,也组成了一个项目,项目地址github.com/spring-clou…。我们熟悉 eureka,ribbon就在这里。
  • Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法
  • Spring Cloud Ribbon模块是封装了Netflix公司开发的这个Ribbon项目。

也就是说

  • Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具。
  • 核心功能是在Netflix Ribbon项目中


本文基于Brixton版本,springboot环境下直接看的源码


<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Brixton.SR4</version>
        <type>pom</type>
        <scope>import</scope>
</dependency>ml


2.Netflix Ribbon主要组件


先从Netflix Ribbon项目的角度去看


2.1 ServerList 服务列表

存储服务列表,也就是被负载均衡的对象

主要实现

  • ConfigurationBasedServerList: 静态服务列表,也就是我们通常所说的写死,项目启动前配置好。
  • DiscoveryEnabledNIWSServerList:动态服务列表,从Eureka Client中获取服务列表。


2.2 ServerListFilter服务筛选

筛选特定条件的服务列表,对ServerList服务器列表进行二次过滤

主要实现

  • AbstractServerListFilter
    负责从负载均衡器中过滤出当前可用的服务器列表的类
  • ZoneAffinityServerListFilter: 过滤掉所有的不和客户端在相同zone的服务(注意:如果和客户端相同的zone不存在,才不过滤不同zone有服务)
  • ZonePreferenceServerListFilter
  • ServerListSubsetFilter


2.3 ServerListUpdater 服务列表的更新

定义关于更新动作,根据策略执行更新操作,更新ServerList列表,一般用于动态ServerList

主要实现

  • PollingServerListUpdater
    默认的实现策略。此对象会启动一个定时线程池,定时执行更新策略
  • EurekaNotificationServerListUpdater
    当收到缓存刷新的通知,会更新服务列表。


2.4 IPing 服务存活检查

检查一个服务是否存活,

主要实现

  • DummyPing : 总是认为存活
  • NoOpPing:什么都不做
  • PingConstant:通过配置参数设置指定服务器存活状态
  • NIWSDiscoveryPing: 如果服务实例在本地的Eureka缓存中存在,则返回true(默认配置)。ribbon-eureka包中提供的类,结合eureka使用时,如果Discovery Client在线,则认为心跳检测通过
  • PingUrl:用HttpClient调用服务的一个URL,如果调用成功,则认为本次心跳成功,表示此服务活着

IPing检查的是当个服务的存活性。

IPingStrategy:服务列表检查策略接口,

唯一实现:SerialPingStrategy:采用线性遍历的策略方式,使用IPing检查每个服务的存活性。


2.5 IRule 根据算法选择一个服务

根据算法中从服务列表中选取一个要访问的服务

主要实现

  • RandomRule:随机算法
  • RoundRobinRule : 轮训策略(`默认策略`
  • RetryRule: 轮询 + 重试,在RoundRobinRule基础上,增加重试功能
  • WeightedResponseTimeRule:  (非常好) 刚启动时,统计数据不足,先使用RoundRobinRule策略。有个DynamicServerWeightTask定时任务,默认每隔30秒会计算一次各个服务实例响应时间,等统计信息足够,切换到WeightedResponseTimeRule.
  • BestAvailableRule: 先过滤到断路器处于打开的服务,然后选择并发请求最小的服务实例来使用。刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到BestAvailableRule。
  • PredicateBasedRule:  过滤+轮训
  • AvailabilityFilteringRule:  (1)由于多次访问故障而处于断路器跳闸状态;(2)并发的连接数量超过阈值. (3)对剩余的服务列表,进行轮询

小结:我们可以看出上述组件是对 服务列表(待负载对象)的定义,与操作。但是要想让他们协同起来干活。这就需要ILoadBalancer


2.6 ILoadBalancer:统筹者,总管

负载均衡器,负责负载均衡调度的管理,总管级别。调度其他组件,完成从服务列表里获取一个服务的目标

对外提供一个方法,选择出一个Server来。

public Server chooseServer(Object key);

抽象类:AbstractLoadBalancer 主要定义了服务的分组

主要实现


1.BaseLoadBalancer: 基本负载均衡器实现.维护

(1)维护一个所有服务列表+当前存活服务列表

(2)默认使用轮训选择一个服务

(3)定义一个定时器,根据SerialPingStrategy策略定时检活


2.DynamicServerListLoadBalancer动态升级版

(1)DomainExtractingServerList 动态从EurekaClient获取UP状态服务列表

(2)ZoneAffinityServerListFilter对列表进行过滤

(3)PollingServerListUpdater定时对服务进行更新


3.ZoneAwareLoadBalancer: 在DynamicServerListLoadBalancer基础上增加了zone策略。

(1)此类使用ZoneStats存储每个Zone的状态和平均请求情况。区域指标作为选择服务的影响因素


2.7 配置组件组合方式

组件有了,到底采用哪种组合方式呢?Ribbon为使用者提供了可配置化。

通过不同的组件组合,配置不同的负载均衡效果。

配置的方式有哪些呢:

  • IClientConfig 接口:默认实现DefaultClientConfigImpl。你不配置任何属性,则默认会使用这里面定义的组件。当然这里还有其他各种属性的配置
默认配置的组件有:
  • 文件配置: 当我们更换默认的配置时,我们可以在配置文件里配置各种属性
    属性格式配置如下
<clientName>.<nameSpace>.<propertyName>=<value>
api-user.ribbon.listOfServers=localhost:8099

这样:Netfix-Ribbon的大概组件,以及工作原理也就一目了然了

项目地址github.com/Netflix/rib…


3.SC-Ribbon主要组件(脱离Eureka)


SpringCloud-Ribbon集成了Netflix Ribbon,使其融入springcloud体系。

核心的功能都在Netflix Ribbon项目中了。SC-Ribbon封装Netflix Ribbon,主要做了一些集成工作。

为此,SpringCloud-Ribbon又增加了哪些组件,干了哪些事呢?

思考:既然核心功能在Netflix Ribbon项目中了。此项目干的事,无非就是从以下几方面入手

  1. 配置层面:符合Spring体系的配置习惯
  2. 使用层面: 如何使用Ribbon的负载均衡

!!!!!注意注意: 此处说的是脱离Eureka使用SpringCloud-Ribbon

下面我们来看为此做出的工作:

配置层面的工作

相关实践学习
通过ACR快速部署网站应用
本次实验任务是在云上基于ECS部署Docker环境,制作网站镜像并上传至ACR镜像仓库,通过容器镜像运行网站应用,网站运行在Docker容器中、网站业务数据存储在Mariadb数据库中、网站文件数据存储在服务器ECS云盘中,通过公网地址进行访问。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3天前
|
负载均衡 算法 Java
【一起学源码-微服务】Ribbon 源码四:进一步探究Ribbon的IRule和IPing
【一起学源码-微服务】Ribbon 源码四:进一步探究Ribbon的IRule和IPing
|
2月前
|
负载均衡 算法 Java
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
|
12月前
|
设计模式 负载均衡 Apache
SpringCloud源码剖析-Zuul使用Ribbon负载均衡-RibbonRoutingFilter
RibbonCommandContext 在run方法中构建了一个 RibbonCommandContext Ribbon的上下文对象,然后调用 forward 方法转发请求 ,通过 setResponse方法设置结果
109 0
|
缓存 负载均衡 Java
深入剖析ribbon源码
深入剖析ribbon源码
140 0
深入剖析ribbon源码
|
12月前
|
设计模式 负载均衡 Apache
二十.SpringCloud源码剖析-Zuul使用Ribbon负载均衡-RibbonRoutingFilter
经过前面几章的学习,我们对Zuul的的详细执行流程,以及内置的Filter都有了一些认识,本篇文章是针对RibbonRoutingFilter做一个详细的分析,跟一下它是如何使用Ribbon对下游的微服务进行负载均衡的。注意:这篇文章是在 《zuul的执行流程》基础上进行延伸的,另外Ribbon的原理见:《Ribbon负载均衡原理》
|
12月前
|
缓存 负载均衡 算法
十五.SpringCloud源码剖析-Ribbon工作流程
Ribbon是由Netflix公司开源的一个客户端负载均衡器,主要功能是实现服务之间的负载均衡调用,内置丰富的负载均衡算法,本章意在探讨Ribbon的核心工作流程,Ribbon基本使用请看《[SpringCloud极简入门-客户端负载均衡Ribbon](https://blog.csdn.net/u014494148/article/details/105002095)》
|
12月前
|
缓存 负载均衡 算法
十四.SpringCloud源码剖析-Ribbon的初始化配置
前面我们分析了Eureka的源码,接下来这一章我们来研究一下Ribbon,本篇文章主要是对Ribbon的相关组件做一个认识,以及它的初始化配置做一个分析。
|
Java Spring
Spring Cloud Alibaba源码 - 21 Ribbon 源码解析
Spring Cloud Alibaba源码 - 21 Ribbon 源码解析
104 0
|
负载均衡 Cloud Native 算法
【微服务七】Ribbon负载均衡策略之BestAvailableRule源码深度剖析
【微服务七】Ribbon负载均衡策略之BestAvailableRule源码深度剖析
328 0
【微服务七】Ribbon负载均衡策略之BestAvailableRule源码深度剖析
|
存储 负载均衡 Cloud Native
【云原生&微服务八】Ribbon负载均衡策略之WeightedResponseTimeRule源码剖析(响应时间加权)
【云原生&微服务八】Ribbon负载均衡策略之WeightedResponseTimeRule源码剖析(响应时间加权)
209 0
【云原生&微服务八】Ribbon负载均衡策略之WeightedResponseTimeRule源码剖析(响应时间加权)