1. 程式人生 > >微服務實戰SpringCloud之Spring Cloud Feign替代HTTP Client

微服務實戰SpringCloud之Spring Cloud Feign替代HTTP Client

## 簡介 在專案中我們有時候需要呼叫第三方的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