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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月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)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
|
3天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
11 0
|
3月前
|
开发框架 负载均衡 Java
当热门技术负载均衡遇上 Spring Boot,开发者的梦想与挑战在此碰撞,你准备好了吗?
【8月更文挑战第29天】在互联网应用开发中,负载均衡至关重要,可避免单服务器过载导致性能下降或崩溃。Spring Boot 作为流行框架,提供了强大的负载均衡支持,通过合理分配请求至多台服务器,提升系统可用性与可靠性,优化资源利用。本文通过示例展示了如何在 Spring Boot 中配置负载均衡,包括添加依赖、创建负载均衡的 `RestTemplate` 实例及服务接口调用等步骤,帮助开发者构建高效、稳定的应用。随着业务扩展,掌握负载均衡技术将愈发关键。
75 6
|
3月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
3月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
9天前
|
负载均衡 监控 网络协议
SpringCloud之Ribbon使用
通过以上步骤,就可以在Spring Cloud项目中有效地使用Ribbon来实现服务调用的负载均衡,提高系统的可靠性和性能。在实际应用中,根据具体的业务场景和需求选择合适的负载均衡策略,并进行相应的配置和优化,以确保系统的稳定运行。
34 15
|
9天前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
23 5
|
1月前
|
Java Spring 容器
Spring底层原理大致脉络
Spring底层原理大致脉络
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
126 9
|
2月前
|
负载均衡 Java 对象存储
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
49 2