一. 前言
微服務實戰系列是基於開源微服務項目有來商城微服務框架升級為背景來開展的,本篇則是講述SpringCloud整合OpenFeign實現微服務之間的相互調用,有興趣的朋友可以給youlai-mall 個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 項目結構圖:
現在要實現這么個需求,認證中心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 | 認證中心 |
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
2.youlai-admin-api
添加OpenFeign、OkHttp依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
接口FeignClient代碼
@FeignClient("youlai-admin")
public interface UmsAdminService {
@GetMapping("/users/loadUserByUsername")
UserDTO loadUserByUsername(@RequestParam String username);
}
3.youlai-auth
添加youlai-admin-api依賴
<dependency>
<groupId>com.youlai</groupId>
<artifactId>youlai-admin-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
配置文件開啟OpenFeign使用OkHttp作為底層的client
feign:
okhttp:
enabled: true
遠程調用代碼
@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
5.OpenFeign底層httpclient選擇:HttpURLConnection、feign-httpclient、feign-okhttp?
HttpURLConnection是JDK默認的,出於性能考慮一般是不可取的。至於其他支持的HC選擇,來一波測試數據吧
添加依賴,公平起見引入都是最新版本feign-okhttp和feign-httpclient
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>11.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>11.0</version>
</dependency>
配置信息,兩個都為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去完成微服務之間的調用在后續的工作中是必要的。
源碼地址:youlai-mall