Spring Cloud Alibaba 微服务框架 Ribbon:客户端负载均衡
2022-05-21 12:13:29 1 举报
AI智能生成
Spring Cloud Alibaba 微服务框架 Ribbon 客户端负载均衡
作者其他创作
大纲/内容
1.概述
负载均衡(Load Balance),即利用特定方式将流量分摊到多个操作单元上的一种手段,它对系统吞吐量与系统处理能力有着质的提升
负载均衡的分类
软负载:Nginx
硬负载:F5
客户端负载:Ribbon
图片
服务端负载:Nginx、F5
图片
Ribbon核心模块
ribbon-loadbalancer:负载均衡模块,可独立使用,也可以和别的模块一起使用。内置的负载均衡算法都实现在其中。
ribbon-eureka:基于Eureka封装的模块,能够快速、方便地集成Eureka。
ribbon-transport:基于Netty实现多协议的支持,比如HTTP、Tcp、Udp等。
ribbon-httpclient:基于Apache HttpClient封装的REST客户端,集成了负载均衡模块,可以直接在项目中使用来调用接口。
ribbon-example:Ribbon使用代码示例,通过这些示例能够让你的学习事半功倍。
ribbon-core:一些比较核心且具有通用性的代码,客户端API的一些配置和其他API的定义。
2.使用方法
在 RestTemplate 对象上加上 @LoadBalanced 的注解
使用加了注解的RestTemplate请求对应的服务地址
代码示例
3.相关属性
核心参数
图片
核心接口
图片
接口描述
图片
超时重试
使用HTTP发起请求,免不了要经历极端环境,此时对调用进行时限控制以及时限之后的重试尤为重要
F版中Ribbon的重试机制是默认开启的,需要添加对于超时时间与重试策略的配置
配置示例
图片
对Http响应码进行重试:ribbon.retryableStatusCodes=500,404,502
饥饿加载
Ribbon在进行客户端负载均衡的时候并不是在启动时就加载上下文,而是在实际请求的时候才去创建
因此这个特性往往会让我们的第一次调用显得颇为疲软乏力,严重的时候会引起调用超时。
所以我们可以通过指定Ribbon具体的客户端的名称来开启饥饿加载,即在启动的时候便加载所有配置项的应用程序上下文
配置示例
图片
4.原理解析
执行流程
图片
核心接口:ILoadBalancer
主要作用
维护Sever列表的数量(新增、更新、删除等)
维护Server列表的状态(状态更新)
当请求Server实例时,能否返回最合适的Server实例
ILoadBalancer实现原理图
图片
相关组成部分说明
图片
@LoadBalanced原理
作用
@LoadBalanced注解是属于Spring,而不是Ribbon的
Spring在初始化容器的时候,如果检测到Bean被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器
实现原理
RestTemplate在发送请求的时候会被ClientHttpRequestInterceptor拦截(LoadBalancerAutoConfiguration自动配置类)
LoadBalancerInterceptor是ClientHttpRequestInterceptor的实现类,它的作用就是用于RestTemplate的负载均衡
LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer
@LoadBalanced注解定义
图片
获取服务实例列表
Ribbon使用ServerList接口抽象服务实例列表
图片
Ribbon获取服务实例有两种方法
使用配置文件:com.netflix.loadbalancer.ConfigurationBasedServerList
在没有使用注册中心的情况下,Ribbon可以通过配置文件手动列举服务实例的地址
它的命令规范是{服务名}.ribbon.listOfServers,多个服务实例用逗号隔开
示例:shop-product.ribbon.listOfServers=http://localhost:8001,http://localhost:8002
使用注册中心:com.netflix.loadbalancer.DiscoveryEnabledNIWSServerList
利用配置文件获取服务实例列表扩展性很差,因为在服务实例上线或者下线的情况下,需要手动修改配置文件,扩展性很低
一个健壮的微服务系统会采用注册中心的方式维护服务的上下线
使用参数{service-name}.ribbon.NIWSServerListClassName进行配置方案
动态更新服务实例列表
当Ribbon从注册中心获取了服务实例列表之后,Ribbon需要动态更新服务实例列表,抽象接口为ServerListUpdater
更新的方式有两种
定时拉取:com.netflix.loadbalancer.PollingServerListUpdater
Ribbon会使用一个定时任务线程池定时拉取更新数据。
Ribbon也提供了一些参数,用于控制拉取的实现细节。
更新频率:{service-name}.ribbon.ServerListRefreshInterval
定时更新的线程数目:DynamicServerListLoadBalancer.ThreadPoolSize
事件通知:com.netflix.niws.loadbalancer.EurekaNotificationServerListUpdater
如果注册中心是Eureka,可以采用事件通知的方式,即当Eureka注册中心发生注册信息变更的时候,那么就将消息发送到事件监听者
首先会创建一个Eureka监听器,当接口接受到通知事件之后,会将更新逻辑提交到线程池中执行(由eureka相关类调用通知)
Ribbon可以通过配置项{service-name}.ribbon.ServerListUpdaterClassName进行选择更新方式
对服务进行心跳检测
原理说明
服务列表中的服务实例未必一直都处于可用的状态,Ribbon会对服务实例进行检测
PingerStrategy接口抽象检测的策略,Ribbon默认采用了串行的方式进行检测(如果有必要,我们可以通过该接口实现并行的检测方式)
Pinger会定时通过PingerStrategy获取更新的服务实例,并调用监听者
IPing接口用来检测单个服务的可用性,对于Eureka来说使用的是NIWSDiscoveryPing策略
IPing实现类图
图片
IPing实现类说明
DummyPing:直接返回true,即服务是存活的(Ribbon默认实现)
PingUrl:该实现是通过ping 服务的指定url方式发送http请求判断服务是否存活
PingConstant:提供true / false 参数,指定返回服务是否存活
NoOpPing:没有执行任何逻辑,直接返回true,即服务是存活的
NIWDiscoveryPing:SpringCloud继承下默认实现,通过eurekaClient获取服务状态进而判断服务是否存活
服务路由
ServerListFilter接口的作用就是从一批接口中选择一些符合条件的接口并返回
图片
ServerListFilter实现类图
图片
Ribbon采取了区域优先的过滤策略(ZoneAffinityServerListFilter),也就是说,优先使用和当前调用者一样的区域微服务实例
RIbbon还提供ServerStats来记录每个客户端服务实例的统计信息
图片
图片
图片
图片
开发提示:可以通过扩展此接口实现根据版本号调用其他相同版本号的服务
负载均衡调度器
从ServerListFilter获取到一个微服务实例集合后,ILoadBalancer需要使用某个策略从集合中选择一个服务实例, 而策略的抽象接口为IRule
图片
IRule实现类图
图片
选择服务实例之后,ILoadBalancer在调用过程中,会记录请求的执行结果,比如请求的失败成功情况,调用耗时等,IRule接口也可以根据这些信息决定是否使用某个Server。
Ribbon提供了7种负载均衡策略
RoundRobinRule:轮训策略(默认)
RandomRule:随机策略
BestAvailableRule:过滤出故障服务器后,选择一个并发量最小的
WeightedResponseTimeRule:针对响应时间加权轮询
AvailabilityFilteringRule:可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个
ZoneAvoidanceRule:从最佳区域实例集合中选择一个最优性能的服务实例
RetryRule:选择一个Server,如果失败,重新选择一个Server重试
Feign下集成模式
在使用Feign作为客户端时,最终请求会转发成 http://<服务名称>/的格式
通过LoadBalancerFeignClient, 提取出服务标识<服务名称>,然后根据服务名称在上下文中查找对应服务的负载均衡器FeignLoadBalancer
负载均衡器负责根据既有的服务实例的统计信息,挑选出最合适的服务实例
最终会根据获取到的服务信息将<服务名>转换成IP:Port的方法调用服务
5.参考资料
深入理解Ribbon原理
掌握 SpringCloud Ribbon 核心原理
撸一撸Spring Cloud Ribbon的原理
Ribbon设计原理解析
Ribbon的使用和实现原理
《重新定义Spring Cloud实战》
《Spring Cloud微服务入门、实战与进阶》
《Spring Cloud与Docker微服务架构实战(第2版)》
如果导图对您有用,请在右上角给点个赞吧
0 条评论
下一页
为你推荐
查看更多