本章學習Feign,包括Feign的自定義配置,實現文件上傳,進一步實現代碼的重用,Feign性能優化,Feign與RestTemplate的對比與選擇.
1 使用Feign實現遠程HTTP調用
- Feign是Netflix開源的聲明式HTTP客戶端
- 添加依賴
- 新建包及接口
- 服務實現類
2 Feign的組成
- 查找
- 默認的Feign : 使用的URLConnection性能差
- 和ribbon配合的 : 使用了代理模式,其實也就是feign-default的代理
- contract
由於feign默認的註解是非Spring MVC型的
- 通過該默認類實現了MVC註解
細粒度配置自定義
默認的Feign是不打印日誌的
- 自定義Feign日誌級別
下面將設置爲FULL級別
Java代碼方式 - 指定日誌級別
- 接口類
- 日誌配置類
- 配置文件
- 注意坑,如果在feign配置類加了該註解,就必須放在compscan包以外,以免複製上下文重複掃描問題
配置屬性方式 - 指定日誌級別
將之前的Java配置類的註解註釋掉
- 配置文件
全局配置
Java代碼方式 - 指定日誌級別
◆ 方式一:讓父子上下文ComponentScan重疊(強烈不建議使用)
◆ 方式二[唯一正確的途徑] :@EnableFeignClients(defaultConfiguration=xxx.class)
- 先將之前的細粒度配置註釋掉!
- 找到啓動類的EFC註解並指定爲配置類
配置屬性方式 - 指定日誌級別
- 恢復之前的配置文件信息並修改如下
支持的配置項
- 代碼方式
- 屬性方式
配置最佳實踐總結
- Ribbon配置 VS Feigne配置
- Feign代碼方式 VS 屬性方式
最佳實踐
- 儘量使用屬性配置,屬性方式實現不了的情況下再考慮用代碼配置
- 在同一個微服務內儘量保持單一性,比如統一使用屬性配置,不要兩種方式混用,增加定位代碼的複雜性
Feign的繼承
- UserCenter中的
- ContentCenter中的,使其繼承上面的代碼
關於繼承特性的爭議
◆ 官方觀點:不建議使用
這裏繼承會產生緊耦合
◆ 業界觀點:很多公司使用
比如User服務修改了字段,而Content服務卻不知道,沒有修改,那麼調用時就會報錯
◆ 個人觀點:權衡利弊
此處有爭議,不贅述
多參數請求構造
比如在User服務中有這樣一個請求
那麼如何使用Feign去請求這樣的API呢?
回到Content服務,寫代碼
- 寫一測試類
- 在測試啓動類添加該測試項目
- 啓動報錯,根據error提示,添加配置,之後正常啓動!
因爲現在有兩個client都叫user-client(測試類也叫user-client), 重名了,所以Spring創建代理時會有問題,加上上述配置即可解決
- 但是此刻這樣訪問依舊報錯405
- Feign端服務代碼, 還需要添加註解
- 推薦閱讀
Feign脫離Ribbon使用
在Content服務寫代碼
- 測試類添加測試項目
- 直接訪問即可!
RestTemplate VS Feign
如何選擇?
◆ 原則:儘量用Feign ,杜絕使用RestTemplate
◆ 事無絕對,合理選擇
Feign性能優化
連接池 [提升15%左右]
- 添加依賴
- 配置文件
使用okhttp同理配置如上兩步驟
日誌級別
因爲默認不打印日誌哦!建議設置爲basic,不要爲full哦
常見問題總結 - 推薦閱讀
現有架構總結
參考
- Open Feign官網
- 面向未來微服務:Spring Cloud Alibaba從入門到進階
本文由博客一文多發平臺 OpenWrite 發佈!