「这是我参与 11 月更文挑战的第 15 天,活动详情查看:2021最后一次更文挑战」。
你好,我是悟空呀。
那么如果让你设计一个负载均衡组件,你会怎么设计?
我们需要考虑这几个因素:
- 如何获取及同步服务器列表?涉及到与注册中心的交互。
- 如何将负载进行分摊?涉及到分摊策略。
- 如何将客户端请求进行拦截然后选择服务器进行转发?涉及到请求拦截。
抱着这几个问题,我们从负载均衡的原理 + Ribbon 的架构来学习如何设计一个负载均衡器,相信会带给你一些启发。
Ribbon 拦截请求的原理
本文最开始提出了一个问题:负载均衡器如何将客户端请求进行拦截然后选择服务器进行转发?
结合上面介绍的 Ribbon 核心组件,我们可以画一张原理图来梳理下 Ribbon 拦截请求的原理:
第一步:Ribbon 拦截所有标注@loadBalance
注解的 RestTemplate。RestTemplate 是用来发送 HTTP 请求的。
第二步:将 Ribbon 默认的拦截器 LoadBalancerInterceptor 添加到 RestTemplate 的执行逻辑中,当 RestTemplate 每次发送 HTTP 请求时,都会被 Ribbon 拦截。
第三步:拦截后,Ribbon 会创建一个 ILoadBalancer 实例。
第四步:ILoadBalancer 实例会使用 RibbonClientConfiguration 完成自动配置。就会配置好 IRule,IPing,ServerList。
第五步:Ribbon 会从服务列表中选择一个服务,将请求转发给这个服务。
作者简介:悟空,8年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:悟空聊架构
。本文已收录至 www.passjava.cn