Spring Cloud實戰 | 第五篇:Spring Cloud整合OpenFeign實現微服務之間的調用

一. 前言

微服務實戰系列是基於開源微服務項目有來商城微服務框架升級爲背景來開展的,本篇則是講述SpringCloud整合OpenFeign實現微服務之間的相互調用,有興趣的朋友能夠給youlai-mall 個star,很是感謝。git

二. 什麼是OpenFeign?

想知道什麼是OpenFeign,首先要知道何爲Feign?github

Feign是SpringCloud組件中一個輕量級RESTFul的HTTP客戶端。spring

Feign內置了Ribbon實現客戶端請求的負載均衡。可是Feign是不支持Spring MVC註解的,因此便有了OpenFeign,OpenFeign在Feign的基礎上支持Spring MVC註解好比 @RequestMapping等。api

OpenFeign的@FeignClient能夠解析SpringMVC的@RequestMapping註解下的接口,經過動態代理生成實現類,實現類作負載均衡並調用其餘服務。併發

三. 項目信息

有來商城youlai-mall 項目結構圖:app

如今要實現這麼個需求,認證中心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

相關文章
相關標籤/搜索