admin管理员组

文章数量:1559079

最近在阅读 feignclient的代码,但是一入代码深似海,所以需要跳出三界外不在代码中来梳理一下feignclient的实现原理。所以后面写的内容不是对于源码的真实描述,而是一个综合性的描述,并不一定准确。但是有助于后面去梳理这整个框架。

feignclient实现原理

对于feignclient是如何实现的呢?对于个问题,简单的回答就是反射代理。xi在java中实现即只能通过java.lang.reflect.proxy实现一个代理对象instance,有了这个instance之后业务代码就可以使用了。为了能够生成这个代理对象instance,即在使用proxy时,需要提供一个java.lang.reflect.invocationhandler 实例。

如果能够搞定这个invocationhanlder的实例,则就完成了相应的功能。那么如何搞定呢?那就是两头凑。

系统在启动时,spring boot框架会扫描我们自定义的接口feignclient 上的注解,将其解析。解析之后,其实对于每个方法则对应一个methodhanlder,这种对应是一对一的。可以简单理解单个methodhanler 实例中,有相应的该方法method的信息,比如http的url地址,调用参数key,http header key等一系列参数。

当我们使用代理对象instance进行业务方法调用时,其实被proxy拦截委托给了java.lang.reflect.invocationhandler 实例,而这个实现中根据调用method参数,将其调用委托给相应的methodhandler实例,此时这个mehthodhandler实例中,有调用业务方法的url地址,业务参数,相应的http header参数等,那么需要完成这个真实的调用,就直接使用httpclient jar包就可以完成了。这就是feignclient的实现原理,也是调用过程。

ribbon的负载均衡

写到这里了,顺便也把ribbon的负载均衡也写一下吧。在上面的feignclient的调用链路中在哪个环节插入进去呢?
从整个的过程中当然是在真正调用之前插入进去,即在methodhanlder 进行真实业务后端服务器查找插入了。所以当我们在feignclient上使用value而不使用url调用,从eureka上获取了服务器列表,则在此ribbon根据负载均衡算法帮我们选一台后面服务器,然后在methodhandler中组装相应用参数完成真实调用。默认ribbon使用算法是轮询。

本文标签: