feignclient的实现原理的理解

最近在阅读 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使用算法是轮询。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值