Spring Cloud Ribbon源码分析(一)

简介: 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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
监控 Java 应用服务中间件
Spring Boot整合Tomcat底层源码分析
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
466 1
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
1478 61
|
Cloud Native Java Nacos
springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
通过本文,我们详细介绍了如何在 Spring Cloud 和 Spring Boot 中集成 Nacos 进行服务注册和配置管理,并对 Nacos 的源码进行了初步分析。Nacos 作为一个强大的服务注册和配置管理平台,为微服务架构提供
5038 14
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
627 6
|
负载均衡 监控 网络协议
SpringCloud之Ribbon使用
通过以上步骤,就可以在Spring Cloud项目中有效地使用Ribbon来实现服务调用的负载均衡,提高系统的可靠性和性能。在实际应用中,根据具体的业务场景和需求选择合适的负载均衡策略,并进行相应的配置和优化,以确保系统的稳定运行。
692 15
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
438 6
|
缓存 JavaScript Java
Spring之FactoryBean的处理底层源码分析
本文介绍了Spring框架中FactoryBean的重要作用及其使用方法。通过一个简单的示例展示了如何通过FactoryBean返回一个User对象,并解释了在调用`getBean()`方法时,传入名称前添加`&`符号会改变返回对象类型的原因。进一步深入源码分析,详细说明了`getBean()`方法内部对FactoryBean的处理逻辑,解释了为何添加`&`符号会导致不同的行为。最后,通过具体代码片段展示了这一过程的关键步骤。
253 1
Spring之FactoryBean的处理底层源码分析
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
361 5
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
389 5