【Spring Cloud】 RestTemplate基于Ribbon的负载均衡实现原理 上

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 都知道 RestTemplate 是基于 Ribbon实现的负载均衡,那么Ribbon又是如何做到的 ? 首先找到 spring-cloud-netflix-ribbon-2.1.0.RELEASE.jar 这个jar包## 1.自动配置创建RibbonAutoConfiguration ![image-20220510203440880](https://img-blog.csdnimg.cn/img_convert/f0a478e8490a71010810423dad12e169.png)查看META-INF下的spring.factories文件

RestTemplate基于Ribbon的负载均衡实现原理

都知道 RestTemplate 是基于 Ribbon实现的负载均衡,那么Ribbon又是如何做到的 ?

首先找到 spring-cloud-netflix-ribbon-2.1.0.RELEASE.jar 这个jar包

1.自动配置创建RibbonAutoConfiguration

image-20220510203440880

查看META-INF下的spring.factories文件

image-20220510203522438

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration

利用了SpringBoot自动配置机制,往容器中添加了一个自动配置类 RibbonAutoConfiguration

2. 加载 LoadBalancerAutoConfiguration

`RibbonAutoConfiguration 位于 org.springframework.cloud.netflix.ribbon 包下

image-20220510203733312

注意这个@AutoConfigureAfter注解 在当前类加载完成后,将加载 LoadBalancerAutoConfiguration 自动配置类

image-20220510204136983

跟进 LoadBalancerAutoConfiguration 自动配置类

3.找到需要定制的RestTemplate对象

来到 org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration

image-20220510204928657

首先能看到一个成员属性 restTemplates 类型是List 也就是 RestTemplate 的集合

头上标了一个 @Autowired 和一个 @LoadBalanced 注解 很迷惑对吧 什么时候 @Autowired 能和 @LoadBalanced 搭配使用了 ?

点进 @LoadBalanced 注解 可以看到有一个 @Qualifier 注解 恍然大悟了吧 原来这一步是在注入容器中 所有标记了 @LoadBalanced注解的 RestTempalte 对象

image-20220510205109223

4.定制 RestTemplate 添加拦截器

往下 来到 静态内部类的LoadBalancerInterceptorConfig的ribbonInterceptor方法 可以看到往容器中添加了一个 LoadBalancerInterceptor 对象

image-20220510210021591

继续往下看 来到 restTemplateCustomizer 方法

image-20220510205526174

返回值是一个函数式接口

image-20220510211239136

这里相当于往容器中存了一个lombad表达式(匿名实现类) 注意此时并未执行

然后我们回到上面的代码

找到 loadBalancedRestTemplateInitializerDeprecated 方法 打个断点

image-20220510210732115

` LoadBalancerAutoConfiguration.this.restTemplates 也就是上面自动注入的所有标注了@LoadBalanced 注解的RestTemplate对象集合

进行遍历 然后遍历RestTemplateCustomizer接口的匿名实现类执行customize方法 此时将真正执行lombda表达式

image-20220510211528353

回到 restTemplateCustomizer 方法 看这个lombad表达式都做了什么

image-20220510212350549

首先拿到容器中的loadBalancerInterceptor拦截器,然后给restTemplate对象添加

而loadBalancerInterceptor拦截器 就是来完成负载均衡的

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
4月前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
120 2
|
2月前
|
负载均衡 Java Nacos
Ribbon负载均衡
Ribbon负载均衡
38 1
Ribbon负载均衡
|
5月前
|
开发框架 负载均衡 Java
当热门技术负载均衡遇上 Spring Boot,开发者的梦想与挑战在此碰撞,你准备好了吗?
【8月更文挑战第29天】在互联网应用开发中,负载均衡至关重要,可避免单服务器过载导致性能下降或崩溃。Spring Boot 作为流行框架,提供了强大的负载均衡支持,通过合理分配请求至多台服务器,提升系统可用性与可靠性,优化资源利用。本文通过示例展示了如何在 Spring Boot 中配置负载均衡,包括添加依赖、创建负载均衡的 `RestTemplate` 实例及服务接口调用等步骤,帮助开发者构建高效、稳定的应用。随着业务扩展,掌握负载均衡技术将愈发关键。
141 6
|
1月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
39 6
|
1月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
63 5
|
1月前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
45 5
|
2月前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
141 5
|
1月前
|
负载均衡 Java Nacos
常见的Ribbon/Spring LoadBalancer的负载均衡策略
自SpringCloud 2020版起,Ribbon被弃用,转而使用Spring Cloud LoadBalancer。Ribbon支持轮询、随机、加权响应时间和重试等负载均衡策略;而Spring Cloud LoadBalancer则提供轮询、随机及Nacos负载均衡策略,基于Reactor实现,更高效灵活。
104 0
|
4月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
4月前
|
负载均衡 Java 对象存储
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
68 2