1. 程式人生 > >SpringCloud實戰 | 第五篇:SpringCloud整合OpenFeign實現微服務之間的呼叫

SpringCloud實戰 | 第五篇:SpringCloud整合OpenFeign實現微服務之間的呼叫

## **一. 前言** 微服務實戰系列是基於開源微服務專案 [有來商城youlai-mall](https://github.com/hxrui/youlai-mall) 版本升級為背景來開展的,本篇則是講述SpringCloud整合OpenFeign實現微服務之間的相互呼叫,有興趣的朋友可以進去給個star,非常感謝。 ## **二. 什麼是OpenFeign?** **想知道什麼是OpenFeign,首先要知道何為Feign?** Feign是SpringCloud元件中一個輕量級RESTFul的HTTP客戶端。 Feign內建了Ribbon實現客戶端請求的負載均衡。但是Feign是不支援Spring MVC註解的,所以便有了OpenFeign,OpenFeign在Feign的基礎上支援Spring MVC註解比如 @RequestMapping等。 OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping註解下的介面,通過動態代理生成實現類,實現類做負載均衡並呼叫其他服務。 ## **三. 專案資訊** **[有來商城youlai-mall](https://github.com/hxrui/youlai-mall) 專案結構圖:** ![](https://i.loli.net/2020/09/04/QlwEB6yNYKMimta.png) 現在要實現這麼個需求,**認證中心youlai-auth登入認證時需要呼叫youlai-admin介面**,這個介面在youlai-admin的請求路徑是/users/loadUserByUsername。因為牽涉到微服務之間的呼叫,所以需要引入HTTP客戶端,也就是本篇所說的OpenFeign。 其中youlai-admin-api模組作為youlai-admin模組對外提供FeignClient給其他微服務引用,比如此次的youlai-auth,這樣做的好處是無需在youlai-auth去寫有關於youlai-admin的FeignClient,直接引入youlai-admin-api即可。而把youlai-admin的FeignClient編寫交給負責youlai-admin模組的開發人員,就是讓更熟悉此模組的人編寫其對外開放的FeignClient。 **本篇設計的專案模組如下:** 工程名 | 埠 | 描述 ---|---|--- nacos-server | 8848 | 註冊中心和配置中心 youlai-auth | 8000 | API閘道器 youlai-admin |8080| 平臺服務 **版本宣告:** Nacos Server: 1.3.2 SpringBoot: 2.3.0.RELEASE SpringCloud: Hoxton.SR5 SpringCloud Alibaba: 2.2.1.RELEASE ## **四. 專案實戰** **1.youlai-admin** 提供介面/users/loadUserByUsername,完整程式碼下載地址[有來商城youlai-mall](https://github.com/hxrui/youlai-mall) ![](https://i.loli.net/2020/09/03/Q6AhpcumiNUOxGK.png) **2.youlai-admin-api** 新增OpenFeign、OkHttp依賴 ``` org.springframework.cloud spring-cloud-starter-openfeign io.github.openfeign feign-okhttp ``` 介面FeignClient程式碼 ``` @FeignClient("youlai-admin") public interface UmsAdminService { @GetMapping("/users/loadUserByUsername") UserDTO loadUserByUsername(@RequestParam String username); } ``` **3.youlai-auth** 新增youlai-admin-api依賴 ``` com.youlai
youlai-admin-api 1.0.0-SNAPSHOT
``` 配置檔案開啟OpenFeign使用OkHttp作為底層的client ``` feign: okhttp: enabled: true ``` 遠端呼叫程式碼 ![](https://i.loli.net/2020/09/04/bUyn5aBf1j96mX4.png) ``` @Autowired private UmsAdminService umsAdminService; @GetMapping("/loadUserByUsername") public Result loadUserByUsername(){ UserDTO userDTO = umsAdminService.loadUserByUsername("admin"); return Result.success(userDTO); } ``` **4.微服務呼叫測試** 依次啟動專案nacos-server,youlai-auth,youlai-admin,使用介面測試工具測試介面[http://localhost:8000/oauth/loadUserByUsername](http://localhost:8000/oauth/loadUserByUsername) ![](https://i.loli.net/2020/09/03/NprkJCjH5sTxIzR.png) **5.OpenFeign底層httpclient選擇:HttpURLConnection、feign-httpclient、feign-okhttp?** HttpURLConnection是JDK預設的,出於效能考慮一般是不可取的。至於其他支援的HC選擇,來一波測試資料吧 新增依賴,公平起見引入都是最新版本feign-okhttp和feign-httpclient ``` io.github.openfeign
feign-okhttp 11.0
io.github.openfeign feign-httpclient 11.0 ``` 配置資訊,兩個都為false則預設使用的是HttpURLConnection,開啟一方另一方選擇關閉。 ``` feign: httpclient: enabled: false okhttp: enabled: false ``` 修改配置後重啟youlai-auth進行測試,我這裡是單次單次的請求測試,沒有模擬高併發的環境去測試。(單位:ms) 次數 | HttpURLConnection| feign-httpclient| feign-okhttp ---|---|---|--- 1|17.79 |18.97|16.39 2|18.02 |17.45|16.96 3|16.67 |16.25|16.27 4|16.65 |17.28|14.79 5|23.03 |17.62|15.06 6|16.37 |16.80|15.14 7|17.01 |18.51|15.71 8|16.15 |17.12|14.93 9|16.86 |16.79|15.76 10|16.28|17.26|15.05 由資料可大概瞭解到在單次請求測試下,HttpURLConnection和feign-httpclient相差無幾,但是feign-okhttp卻有著相較於其他兩者有著些許的效能優勢。所以我最後選擇了feign-okhttp,這裡只是給大家做個參照。 ## **五. 結語** 至此SpringCloud整合OpenFeign實現微服務之間的相互呼叫已經完成。還有至於OpenFeign為什麼選擇使用OkHttp作為底層的client給大家做個測試參考。熟悉如何使用OpenFeign去完成微服務之間的呼叫在後續的工作中是必要的。 [本篇完整程式碼下載](https://github.com/hxrui/youla