SpringCloud實戰 | 第五篇:SpringCloud整合OpenFeign實現微服務之間的呼叫
阿新 • • 發佈:2020-09-04
## **一. 前言**
微服務實戰系列是基於開源微服務專案 [有來商城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