Spring Cloud Ribbon源码分析(一)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介: Spring Cloud Ribbon源码分析(一)

一、Ribbon的作用


image.png


1,解析配置中的服务器列表



2,基于负载均衡算法来实现请求的分发


二、Ribbon做负载均衡的两种方式


1,LoadBlancerClient两种方式


image.png


2,注解方式@LoadBlancer


image.png


三、Ribbon做负载均衡的两种方式初始化


image.png


从前台代码的视角LoadBalancerClient作为入口


1,从LoadBalancerClient接口,找到其的实现类RibbonLoadBalancerClient;

2,在RibbonAutoConfiguration中,可以看到用@Bean实现RibbonLoadClient自动装配,

3,在RibbonAutoConfiguration中,同时根据@AutoConfigureBefore({LoadBalancerAutoConfiguration.class, AsyncLoadBalancerAutoConfiguration.class}),说明LoadBalancerAutoConfiguration是在RibbonAutoConfiguration之前加载的。


从@LoadBalanced的视角作为入口


1,从@LoadBalanced注解进入,发现其有@Qualifier,

在LoadBalancerAutoConfiguration中对于 @LoadBalanced private List restTemplates的自动注入,(@LoadBalanced的用法,对于A接口的实现类A1,A2,A3如果都加上@LoadBalanced;那么可以通过对List加上@LoadBalanced以及@Autowired,可以注入所有的实现类;如果对于接口A,只想注入一个类A,那么用@Qualifier(“a”)))


LoadBalancerAutoConfiguration的自动装配过程


1,通过依赖注入导入LoadBalancerInterceptor拦截器

2,RestTemplateCustomizer的作用是对修饰了@LoadBalanced注解的RestTemplate实例添加LoadBalancerInterceptor拦截器

3,SmartInitializingSingleton的作用是遍历每一个RestTemplate,用RestTemplateCustomizer定制所有被@LoadBalancer注解修饰的RestTemplate实例。

四,RestTemplate发起请求,获取IBalance以及获得Server的过程


image.png


RestTemplate发起请求的过程

1,获取负载均衡器,

2,通过负载均衡器中配置的默认负载均衡算法挑选一个合适的Server


RestTemplate.getObject()发起请求之后
1,首先会到达拦截器LoadBalancerInterceptor,调用LoadBalancerInterceptor.intercept
2,LoadBalancerClient.execute();  调用接口的execute
3,RibbonLoadBalancerClient.execute();   调用Ribbon的execute
4,获取负载均衡器 ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);
5,clientFactory.getLoadBalancer(serviceId);利用工厂模式,根据serverId获取IBalanced
6,RibbonClientConfiguration自动装配中有RibbonClientConfiguration=ZoneAwareLoadBalancer 默认的轮询策略
7,RibbonLoadBalancerClient.getServer(loadBalancer, hint); 获取服务器
8,loadBalancer.chooseServer(hint != null ? hint : "default"); 选择服务器
9,BaseLoadBalancer.chooseServer();
10,rule.choose(key)
11,PredicateBasedRule.choose(key)
12,AbstractServerPredicate.chooseRoundRobinAfterFiltering(key);
13.AbstractServerPredicate.incrementAndGetModulo()默认的轮询算法 


通过上边的步骤已经得到了 server地址,重构URL


image.png


1,request.apply(serviceInstance)
2,AsyncClientHttpRequestExecution.executeAsync()
3,
4,
5,


五,前一阶段部分总结


1,首先请求会有一个拦截器,

2,拦截器怎么做到,讲到了初始化的过程,初始化是基于自动装配进行

3,初始化涉及到两个知识点,一个是@qualifer,其相当于打了个标记,这个标记针对加了LoadBalancer注解的RestTemplate进行拦截,针对需要负载均衡的RestTemplate进行拦截

4,接着拦截器的请求就会进入拦截器的方法intercept()

5,进入拦截方法后顺着调用链往下走,

6,接着获取负载均衡器,利用工厂模式根据ServerID获取ILandbalancer的实例,使用RibbonClientConfiguration自动装配获得ZoneAwareLoadBalancer

7,将获得的ZoneAwareLoadBalancer传入到getServer(loadblance,hint);

getServer(loadblance,hint)会调用LoadBalancer.chooseServer()

LoadBalancer.chooseServer会使用上一步得到的负载均衡器

BaseLoadBalancer.chooseServer()会调用rule.chooseServer(key);

rule.chooseServer(key),rule是在RibbonClientConfiguration自动装配获得ZoneAwareLoadRule

接着在PredicateBasedRule中调用choose,默认采用轮询算法做负载均衡,也就是在 AbstractServerPredicate中调用incrementAndGetModulo()

8,获取到server之后,最后一个阶段就是对URL进行重构

AsyncLoadBalancerInterceptor调用intercept方法


通过一系列的调用链 调用RibbonLoadBalancerClient中reconstructURI重构URL

发起异步远程调用AsyncClientHttpRequestExecution.executeAsync


image.png

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
4月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
10天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
13 1
|
11天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
19 1
|
1月前
|
缓存 JavaScript Java
Spring之FactoryBean的处理底层源码分析
本文介绍了Spring框架中FactoryBean的重要作用及其使用方法。通过一个简单的示例展示了如何通过FactoryBean返回一个User对象,并解释了在调用`getBean()`方法时,传入名称前添加`&`符号会改变返回对象类型的原因。进一步深入源码分析,详细说明了`getBean()`方法内部对FactoryBean的处理逻辑,解释了为何添加`&`符号会导致不同的行为。最后,通过具体代码片段展示了这一过程的关键步骤。
Spring之FactoryBean的处理底层源码分析
|
4月前
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
7天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
13 0
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
3月前
|
负载均衡 算法 Java
SpringCloud之Ribbon使用
通过 Ribbon,可以非常便捷的在微服务架构中实现请求负载均衡,提升系统的高可用性和伸缩性。在实际使用中,需要根据实际场景选择合适的负载均衡策略,并对其进行适当配置,以达到更佳的负载均衡效果。
57 13
|
4月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14886 28
|
4月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
473 15