OpenFeign 架构原理(九):OpenFeign 如何与 Ribbon 整合的原理

·  阅读 615

上次我们深入讲解了 Ribbon 的架构原理,这次我们再来看下 Feign 远程调用的架构原理。

上次我们已经梳理了 OpenFeign 发送请求的原理,接着我们就来顺着这个核心流程来讲解 ## OpenFeign 如何与 Ribbon 整合的原理.

本文以开源 SpringCloud 项目 PassJava 作为示例。

开源地址: github.com/Jackson0714…

喜欢的小伙伴来点个 Star 吧,冲 2K Star。

为了验证 Ribbon 的负载均衡,我们需要启动两个 passjava-study 服务,这里我启动了两个服务,端口号分别为 12100 和 12200,IP 地址都是本机 IP:192.168.10.197。

接着上面的源码继续看,client.execute() 方法其实会调用 LoadBalancerFeignClient 的 exceute 方法。

这个方法里面的执行流程如下图所示:

  • 将服务名称 passjava-study 从 Request 的 URL 中删掉,剩下的如下所示:
GET http:///study/list/test/1 HTTP/1.1
复制代码
  • 根据服务名从缓存中找 FeignLoadBalancer,如果缓存中没有,则创建一个 FeignLoadBalancer。
  • FeignLoadBalancer 会创建出一个 command,这个 command 会执行一个 sumbit 方法。
  • submit 方法里面就会用 Ribbon 的负载均衡算法选择一个 server。源码如下:
Server svc = lb.chooseServer(loadBalancerKey);
复制代码

通过 debug 调试,我们可以看到两次请求的端口号不一样,一个是 12200,一个是 12100,说明确实进行了负载均衡。

  • 然后将 IP 地址和之前剔除服务名称的 URL 进行拼接,生成最后的服务地址。
  • 最后 FeignLoadBalancer 执行 execute 方法发送请求。

那大家有没有疑问,Ribbon 是如何拿到服务地址列表的? 这个就是上一讲 Ribbon 架构里面的内容。

Ribbon 的核心组件 ServerListUpdater,用来同步注册表的,它有一个实现类 PollingServerListUpdater ,专门用来做定时同步的。默认1s 后执行一个 Runnable 线程,后面就是每隔 30s 执行 Runnable 线程。这个 Runnable 线程就是去获取注册中心的注册表的。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改