「这是我参与 11 月更文挑战的第 16 天,活动详情查看:2021最后一次更文挑战」。
你好,我是悟空呀。
那么如果让你设计一个负载均衡组件,你会怎么设计?
我们需要考虑这几个因素:
- 如何获取及同步服务器列表?涉及到与注册中心的交互。
- 如何将负载进行分摊?涉及到分摊策略。
- 如何将客户端请求进行拦截然后选择服务器进行转发?涉及到请求拦截。
抱着这几个问题,我们从负载均衡的原理 + Ribbon 的架构来学习如何设计一个负载均衡器,相信会带给你一些启发。
本篇我们来讲解 Ribbon 初始化的原理:
Ribbon 初始化的原理
当我们去剖析 Ribbon 源码的时候,需要找到一个突破口,而 @LoadBalanced 注解就是一个比较好的入口。
先来一张 Ribbon 初始化的流程图:
添加注解的代码如下所示:
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
复制代码
第一步:Ribbon 有一个自动配置类 LoadBalancerAutoConfiguration,SpringBoot 加载自动配置类,就会去初始化 Ribbon。
第二步:当我们给 RestTemplate 或者 AsyncRestTemplate 添加注解后,Ribbon 初始化时会收集加了 @LoadBalanced 注解的 RestTemplate 和 AsyncRestTemplate ,把它们放到一个 List 里面。
第三步:然后 Ribbon 里面的 RestTemplateCustomizer 会给每个 RestTemplate 进行定制化,也就是加上了拦截器:LoadBalancerInterceptor。
第四步:从 Eureka 注册中心获取服务列表,然后存到 Ribbon 中。
第五步:加载 YMAL 配置文件,配置好负载均衡配置,创建一个 ILoadbalancer 实例。
作者简介:悟空,8年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:悟空聊架构
。本文已收录至 www.passjava.cn