一、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