OpenFeign底层如何整合Ribbon实现客户端服务调用的底层原理

之前工作中有个刚工作不久的同事问过我,OpenFeign是如何整合Ribbon实现微服务里面的服务调用的负载均衡,既然这个同事问到我了,而我刚好也知道,这里就写一篇文章记录一下这个问题,接下来本文就来探究一下这里面的原理。

做过SpringCloud微服务开发的同学都知道,在SpringCloud微服务中调用一般都不是直接用Ribbon进行服务调用,因为那样的化项目中的代码量会增加很多,微服务之间的调用是用Feign来进行调用,下面就是普通的一个接口调用例子


这样就可以进行服务间的调用了,那么Feign底层源码是如何调用Ribbon对服务提供者进行负载均衡的调用呢,这里调用的源码入口是FeignInvocationHandler这个类,调用上图的orderFeignService.findOrderByUserId(id)其实就是在调用这个FeignInvocationHandler的invoke方法

其实Feign底层是基于动态代理实现的,这里面的细节我们放到后面再讲

因为方法的名字是findOrderByUserId,这里会进到this.dispatch.get(method)).invoke()方法,这里会进到SynchronousMethodHandler类的invoke方法里面

这里首先构造了一个RequestTemplate请求工具类,然后在一个while死循环里面进行服务调用的逻辑,在catch块里面进行重试的逻辑处理,我们这里重点关注this.executeAndDecode这个方法

在这里核心的逻辑就是this.client.excute(request,options),而this.client就是LoadBalancerFeignClient这个类,也就是调用LoadBalancerFeignClient的execute方法,这个LoadBalancerFeignClient类是在何时初始化的就不做过多描述,这个类是基于SpringBoot的自动装配机制进行实例化的

接着我们看看LoadBalancerFeignClient里面execute里面进行了哪些逻辑处理

在这个方法里面,首先构造了一个RibbonRequest对象,然后封装了一个配置参数,最后调用lbClient(clientName) .executeWithLoadBalancer(ribbonRequest, requestConfig).toResponse()这个方法

接着会调用LoadBalancerCommand的submit方法

在这个方法里面又会调用this.selectServer()方法,我们继续跟进去源码

这个方法里面的就是去获取最终要调用的服务地址的逻辑,也是进行负载均衡的逻辑处理,这里最终会调用到LoadBalancerContext类的getServerFromLoadBalancer方法

这里面主要的逻辑就是先拿到一个负载均衡器ILoadBalancer,然后如果有多个服务提供者,调用chooseServer方法进行服务的选取,最后返回Server对象给外层调用,这里我们看看这个lb.chooseServer方法,Ribbon默认的负载均衡器是ZoneAwareLoadBalancer,这里会进入这个类的chooseServer方法

这里会进入到else的分支逻辑,最终又会调用到父类BaseLoadBalancer的choose方法

这个rule接口就是Ribbon实现的负载均衡的算法接口类,最终在这里完成了对服务调用的负载均衡,到这里整个Feign底层调用Ribbon实现负载均衡的源码流程就结束了。

总结

其实这些开源组件都会预留一些可扩展的接口,当第三方框架去适配的时候,只要实现这些接口就可以了。但是这些扩展底层其实都是基于Spring、SpringBoot的一些扩展点来完成整合,所以学好Spring和SpringBoot对我们来说非常重要,后续也会跟大家分享Spring相关的源码

展开阅读全文

页面更新:2024-04-26

标签:均衡器   底层   提供者   负载   源码   客户端   逻辑   接口   同事   原理   对象   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top