图解 Ribbon 初始化的原理

724 阅读2分钟

「这是我参与 11 月更文挑战的第 16 天,活动详情查看:2021最后一次更文挑战」。

你好,我是悟空呀。

那么如果让你设计一个负载均衡组件,你会怎么设计?

我们需要考虑这几个因素:

  • 如何获取及同步服务器列表?涉及到与注册中心的交互。
  • 如何将负载进行分摊?涉及到分摊策略。
  • 如何将客户端请求进行拦截然后选择服务器进行转发?涉及到请求拦截。

抱着这几个问题,我们从负载均衡的原理 + Ribbon 的架构来学习如何设计一个负载均衡器,相信会带给你一些启发。

本篇我们来讲解 Ribbon 初始化的原理:

Ribbon 初始化的原理

当我们去剖析 Ribbon 源码的时候,需要找到一个突破口,而 @LoadBalanced 注解就是一个比较好的入口。

先来一张 Ribbon 初始化的流程图:

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