接续之前的Ribbon调用远程服务笔记:
对项目发起请求调用,debug模式在API调用处打断点,或者在被调用实现处打断点再回退,找到feign的根调用类ReflectiveFeign,里面有一个invoke方法,由该方法开始跟踪断点即可(需要注意的是:要跟进方法最后面的return的地方,如下图)
跟进executeAndDecode方法,再跟进里面的execute方法
进入RibbonClient类的execute方法,如图
里面有一个executeWithLoadBalancer方法,此处就是调用负载均衡算法的地方,跟进去,前面有一个getRequestSpecificRetryHandler方法
该方法里面先获取了一个OkToRetryOnAllOperations配置属性,然后做了判断,如果该属性为true则将配置设置为true,否则继续判断请求类型,不是get请求就设置为false,是get请求则设置为true。
在之前的try语句里有一个submit方法,点进去可以看到里面用到了观察者模式,进入selectServer方法,先创建一个被观察者也就是服务提供方,然后回到上图调用submit的地方
submit方法后面有一个single方法跟进去有一个blockForSingle方法,里面有一个subscribe方法是用来订阅的;
再跟进,在try语句块里有一个onSubscribeStart和call方法,跟进进入到了lift方法(此处每看明白怎么调的,请原谅)
里面的call方法就是调用的前边selectServer里面的call方法,跟进getServerFromLoadBalancer方法里面的chooseServer方法就是调用负载均衡器的,接着跟进BaseLoadBalancer类的chooseServer方法里面有一个choose方法就是调用负载均衡策略的。
负载均衡器的顶级父类是ILoadBalancer,子类如下图
其中AbstractLoadBalancer是一个抽象类没有实现
所有负载策略的父类是IRule接口,具体介绍不写了,可以看下面这位的