微服務實戰SpringCloud之Spring Cloud Feign替代HTTP Client
阿新 • • 發佈:2020-09-07
## 簡介
在專案中我們有時候需要呼叫第三方的API,微服務架構中這種情況則更是無法避免——各個微服務之間通訊。比如一般的專案中,有時候我們會使用 HTTP Client 傳送 HTTP 請求來進行呼叫,而在微服務架構,Spring Cloud 全家桶中,Spring Cloud Feign 則是更常見的選擇。那麼,我如何只使用 Spring Cloud Feign 而不引入整個 Spring Cloud 呢?
## 什麼是Feign?
Feign是一個宣告式的Web Service客戶端,它的目的就是讓Web Service呼叫更加簡單。Feign提供了HTTP請求的模板,通過編寫簡單的介面和插入註解,就可以定義好HTTP請求的引數、格式、地址等資訊。
而Feign則會完全代理HTTP請求,我們只需要像呼叫方法一樣呼叫它就可以完成服務請求及相關處理。Feign整合了Ribbon和Hystrix,可以讓我們不再需要顯式地使用這兩個元件。
總起來說,Feign具有如下特性:
- 可插拔的註解支援,包括Feign註解和JAX-RS註解;
- 支援可插拔的HTTP編碼器和解碼器;
- 支援Hystrix和它的Fallback;
- 支援Ribbon的負載均衡;
- 支援HTTP請求和響應的壓縮。
這看起來有點像我們springmvc模式的Controller層的RequestMapping對映。這種模式是我們非常喜歡的。Feign是用@FeignClient來對映服務的。
## 首先找一個AIP
免費的API特別多,github上也有免費API地址彙總的repo,但這些都太正式了。有趣的事物總是會相互吸引的,無意間我發現了這麼一個網站,“渣男:說話的藝術”([lovelive.tools](https://lovelive.tools)) ,每次請求都可以獲取一句甜言蜜語(渣男語錄),特別良心的是,作者提供了API列表,給作者點贊!
## 如何呼叫第三方服務?
首先,我們先快速構建一個 Spring Boot 的 web 專案,這裡我就省略了。然後在pom中新增feign的相關依賴
```xml
```
然後,在啟動類新增響應的註解 @EnableFeignClients:
```java
@SpringBootApplication
@EnableFeignClients
public class SpringbootMiddlewareFeignApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMiddlewareFeignApplication.class, args);
}
}
```
接著,我們便可以配置我們的 Client 了,我們先建立一個介面類,比如叫BadGuyFeignClient ,並宣告為 FeignClient:
```java
@FeignClient
public interface BadGuyFeignClient {
}
```
@FeignClient有以下幾個較常用屬性:
| 屬性名 | 預設值 | 作用 | 備註 |
| --------------- | ---------- | ------------------------------------------------------------ | ------------------------------------------- |
| value | 空字串 | 呼叫服務名稱,和name屬性相同,如果專案使用了 Ribbon,name屬性會作為微服務的名稱,用於服務發現; | |
| serviceId | 空字串 | 服務id,作用和name屬性相同 | 已過期 |
| name | 空字串 | 呼叫服務名稱,和value屬性相同,如果專案使用了 Ribbon,name屬性會作為微服務的名稱,用於服務發現; | |
| url | 空字串 | url一般用於除錯,可以手動指定@FeignClient呼叫的地址 | |
| decode404 | false | 配置響應狀態碼為404時是否應該丟擲FeignExceptions | |
| configuration | {} | Feign配置類,可以自定義 Feign的 Encoder、Decoder、LogLevel、Contract; | 參考FeignClientsConfiguration |
| fallback | void.class | 定義容錯的處理類,當呼叫遠端介面失敗或超時時,會呼叫對應介面的容錯邏輯,fallback指定的類必須實現@FeignClient標記的介面 | 底層依賴hystrix,啟動類要加上@EnableHystrix |
| fallbackFactory | void.class | 工廠類,用於生成fallback類示例,通過這個屬性我們可以實現每個介面通用的容錯邏輯,減少重複的程式碼 | |
| path | 空字串 | 自動給所有方法的requestMapping前加上字首,類似與controller類上的requestMapping | |
然後,我們便可以配置對應的屬性,這裡我們只是用來實現類似於 HTTP Client 的功能,所以只是簡單配置了url和path這些屬性:
```java
@FeignClient(name = "badGuy", url = "${bab.guy.url}", path = "api")
public interface BadGuyFeignClient {
/**
* 隨機獲取一句甜言蜜語
*
* @return
*/
@GetMapping("SweetNothings")
String getSweetNothings();
/**
* 獲取 count 條甜言蜜語
*
* @param count 獲取甜言蜜語條數
* @return Json 格式的結果
*/
@GetMapping("SweetNothings/{count}/Serialization/Json")
Retu