Spring Cloud
為開發者提供了在分布式系統中的一些常用的組件(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線,一次性令牌,全局鎖定,決策競選,分布式會話集群狀態)。使用Spring Cloud開發人員可以快速地完成實現這些模式的服務和應用程序。它們在任何分布式環境中都能很好地工作
Feign
注解式的 Feign
使得 Java HTTP 客戶端編寫更方便。Feign
靈感來源於安卓網絡編程框架 Retrofit
、JAXRS-2.0
和 WebSocket
,支持可插拔編碼器和解碼器,降低 HTTP API 的復雜度,通過最少的資源和代碼來實現和 HTTP API
的連接。通過可定制的解碼器和錯誤處理,可以編寫任意的HTTP API。Spring Cloud Feign
封裝了 Ribbon
這一組件,所以在使用 Feign
同時還能提供負載均衡的功能,這一切只需要一個 @FeignClient
即可完成。
早期版本的 Feign
被 Spring Cloud
團隊集成在 spring-cloud-netflix
子項目下,但如今 Spring Cloud
團隊將 Spring Cloud Feign
獨立成一個單獨的 spring-cloud-openfeign
項目
Try
准備三個工程,分別是 eureka-server
、order-server
、product-server
Eureka Server
詳情參考第一章,或從文末的 GITHUB 鏈接獲取對應篇幅的完整代碼
Product Server
一個普通的 Eureka Client
即可,詳情參考上一章,或從文末的 GITHUB 鏈接獲取對應篇幅的完整代碼
Order Server
這個例子也是在上一章的基礎之上做了擴展
依賴
對比上一章,此處多了一個 spring-cloud-starter-openfeign
的依賴
1 |
<dependencies> |
配置文件
在 src/main/resources
目錄下創建一個 bootstrap.yml
的文件,寫上 eureka 相關配置信息
1 |
server: |
ProductClient 接口
創建一個 ProductClient
,是不是感覺和 XxxxService
看起來類似(用法都類似),都是接口文件只不過在這個文件的上方多了一個 @FeignClient
注解,多種寫法,總有一款適合你
name
:指定FeignClient
的名稱,該屬性會作為微服務的名稱,用於服務發現value
:同name
字段互通serviceId
:指定服務ID,每個注冊到注冊中心上的客戶端都會有對應的serviceId
一般是spring.application.name
,與name
和value
互通url
: 一般用於調試,可以指定一個詳細地址(http://localhost:8080/products)path
: 請求統一路徑,可以看成@RequestMapping("/products")
decode404
:404 錯誤時,調用decoder
進行解碼,否則拋出FeignException
fallback
:發生錯誤時,回調hystrix
類/方法(后面會詳細介紹)
1 |
package com.battcn.api; |
OrderController
直接使用 @Autowired
注入進去即可,然后調用就好了,對比較 Ribbon
這里我們看不到 RestTemplate
的代碼了,也無需自己做解碼映射,Spring Cloud Feign
默認都替我們實現好了,我們只需要遵循既定的標准即可
1 |
package com.battcn.controller; |
主函數
通過 @EnableFeignClients
注解開啟對 Feign
的支持,用習慣 Dubbo
的朋友喜歡將 API 打包成獨立的 JAR ,這個時候需要指定 basePackage
屬性。
1 |
package com.battcn; |