在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实现负载均衡的源码流程就结束了
如果觉得《SpringCloud Feign 源码底层如何调用Ribbon实现服务调用的负载均衡》对你有帮助,请点赞、收藏,并留下你的观点哦!