springcloud Feign实现原理

一、Feign OpenFeign spring-cloud-feign 三者的区别

feign 是netflix 开源的组件 后不在维护,交由社区维护,所以更改名称为openfeign

springcloud 对openfeign 做了增强,集成了springmvc 的注解,方便springboot开发的一个组件

二、openfeign 解决的主要问题

开发人员的开发效率问题,使得我们调用一个接口就像调用本地方法一样,省去了http连接和数据解析处理的步骤

三、openfeign 的核心原理

java 原生支持的基于接口的方式实现动态代理

四、openfeign的实现步骤

1.在spring启动的过程中,会检查被@FeignClient 注解标记的接口,然后将其注入到spring容器中,这里以DemoService接口为例

2.在spring getBean的实现逻辑中,spring会尝试获取DemoService的实现类,由于我们没有实现类,Feign 框架就会扩展spring的getbean的处理逻辑,就会为DemoService 生成一个动态接口代理对象,并把这个对象注入到spring容器中

3.当调用接口时,对于DemoService的调用统一转发到代理类的invocationhandler中,将hostname 转为http的格式请求,并把数据解析为接口返回格式返回

五、第四步可以简单理解为

1.我们定义的DemoService ,由于添加了@FeignClient这个注解,就会生成一个虚假的该接口的动态代理实现类

2.使用这个接口的地方,最终拿到的都是一个虚假的DemoServiceProxy 代理类对象

3.所有发生在DemoServiceProxy 上的调用,都会转发给Feign 框架,将请求转为http发送出去,并解析结构返回

六、总结

1.通过@EnableFeignClients 触发spring 应用程序对classpass 中的加了@FeignClient修饰类的扫描

2.解析到@FeignClient修饰的类后,Feign 框架会扩展springbean Definition bean的注册逻辑,最终注册一个FeignClientFactoryBean 到容器

3.spring容器在初始化其他用到@FeignClient修饰的类时,获得的是一个FeignClentFactoryBean 生成的一个代理proxy

4.基于java 原生动态代理机制,针对proxy的调用都会转发给Feign框架定义的一个invocationHandler,由该handler 完成后续的http转换,发送、接受、翻译http响应工作

原文借鉴:https://www.cnblogs.com/651434092qq/p/14260784.html

原文地址:https://www.cnblogs.com/lufei33180/p/14493935.html