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使用算法是轮询。
本文标签:
j9九游会老哥俱乐部交流区的版权声明:本文标题:feignclient的实现原理的理解 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1727372386a1111336.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论