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