OpenFeign底层怎样整合Ribbon完成客户端办事挪用的_奇闻趣事网

OpenFeign底层怎样整合Ribbon完成客户端办事挪用的

奇闻趣事 2023-05-04 12:30www.bnfh.cn奇闻趣事

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请求工具类,然后在一个hile死循环里面进行服务调用的逻辑,在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默认的负载均衡器是ZoneAareLoadBalancer,这里会进入这个类的chooseServer方法

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

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

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

Copyright © 2016-2025 www.bnfh.cn 怪异网 版权所有 Power by