Ribbon 拦截请求的原理

「这是我参与 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

Guess you like

Origin juejin.im/post/7032456477847584799