200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > SpringCloud Feign 源码底层如何调用Ribbon实现服务调用的负载均衡

SpringCloud Feign 源码底层如何调用Ribbon实现服务调用的负载均衡

时间:2023-08-21 19:40:34

相关推荐

SpringCloud Feign 源码底层如何调用Ribbon实现服务调用的负载均衡

在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实现负载均衡的源码流程就结束了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。