SpringCloud(十) 宣告式RESt客戶端 Feign
分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
說明:本文是個人在學習Feign模組在拜讀官方資料時,突發奇想有種翻譯的衝動,然後便成此文,僅作參考。
原文地址:http://cloud.spring.io/spring-cloud-static/Camden.SR1/#spring-cloud-feign
宣告式REST客戶端:Feign
Feign是一個宣告式的Web服務客戶端。它使得Web服務客戶端的寫入更加方便。
使用Feign建立一個介面並對其進行註釋;
具有可插拔註釋支援,包括Feign註釋和JAX-RS註釋;
支援可插拔編碼器和解碼器;
Spring Cloud增加了對Spring MVC註釋的支援,並且使用了在Spring Web中預設使用的相同的HttpMessageConverter。Spring Cloud集成了Ribbon和Eureka,在使用Feign時提供了負載均衡的http客戶端。
如何新增Feign
要在專案中新增Feign,請使用組org.springframework.cloud和artifact id spring-cloud-starter-feign的啟動器。有關使用當前的Spring Cloud釋出列設定構建系統的詳細資訊,請參閱
示例spring boot app
@[email protected]@[email protected]@EnableFeignClientspublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
StoreClinet.java
@FeignClient("stores")public interface StoreClient { @RequestMapping(method = RequestMethod.GET, value = "/stores") List<Store> getStores(); @RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json") Store update(@PathVariable("storeId") Long storeId, Store store);}
在@FeignClient註釋中,String值(以上“儲存”)是一個任意客戶端名稱,用於建立功能區負載平衡器(有關Ribbon支援的詳細資訊,請參考下文)。您還可以使用url屬性(絕對值或只是主機名)指定URL。應用程式上下文中的bean的名稱是該介面的完全限定名稱。還建立了一個別名,它是'name'屬性加'FeignClient'。對於上面的例項,可以使用@Qualifier("storesFeignClient")來引用該bean.如果要更改預設的@Qualifier值,可以使用@FeignClient中的限定符值來完成此操作。
上面的Ribbon客戶端將要發現“store”服務的實體地址。如果您的應用程式是Eureka客戶端,那麼它將解決Eureka服務登錄檔中的服務。如果您不想使用Eureka,您可以在外部配置中簡單地配置服務列表。(例如,參見上文)
覆蓋Feign預設值
Spring Cloud的Feign支援的一箇中心概念就是命名客戶端。每個feign客戶端都是組合的元件的一部分,它們一起工作以按需聯絡遠端伺服器,並且該元件具有一個名字,這個名字您將其作為使用@FeignClient註釋的應用程式開發人員。Spring Cloud使用FeignClientsConfiguration為每個命名的客戶端根據需要建立一個新的集合作為ApplicationContext。這包含(其中包括)一個feign.Decoder,一個feign.Encoder和一個feign.Contract。 Spring Cloud可以通過使用@FeignClient宣告額外的配置(在FeignClientsConfiguration之上)來完全控制feign客戶端。例:@FeignClient(name = "stores", configuration = FooConfiguration.class)public interface StoreClient { //..}
在這種情況下,客戶端由已在FeignClientsConfiguration中的元件以及FooConfiguration中的任何元件組成(後者將覆蓋前者)。警告: FooConfiguration必須使用@Configuration註釋。但請注意,它不在主應用程式上下文的@ComponentScan中,否則將用於每個@FeignClient。如果使用@ComponentScan(或@SpringBootApplication),則需要採取措施避免包含(例如將其放在一個單獨的,不重疊的包中,或者指定要在@ComponentScan中顯式掃描的包)。 注意: serviceId屬性現在已被棄用,有利於name屬性。 警告: 以前,使用url屬性,不需要name屬性。現在要使用名稱。
名稱和網址屬性支援佔位符。
@FeignClient(name = "${feign.name}", url = "${feign.url}")public interface StoreClient { //..}
Spring Cloud Netflix預設為feign(BeanType beanName: ClassName): *Decoder feignDecoder: ResponseEntityDecoder(其中包含SpringDecoder) *Encoder feignEncoder: SpringEncoder *Logger feignLogger: Slf4jLogger *Contract feignContract:SpringMvcContract *Feign.Builder feignBuilder: HystrixFeign.Builder *Client feignClient: 如果Ribbon啟用,則為LoadBalancerFeignClient,否則將使用預設的feign客戶端。
可以通過將feign.okhttp.enabled或feign.httpclient.enabled設定為true並將它們放在類路徑上來使用OKHttpClient和ApacheHttpClient feign客戶端。 Spring Cloud Netflix預設情況下不提供以下bean,但是仍然從應用程式上下文中查詢這些型別的bean以建立feign客戶端。 *Logger.Level *Retryer *ErrorDecoder *Request.Options *Collection<RequestInterceptor> 建立一個型別的bean並將其放置在@FeignClient配置(例如上面的FooConfiguration)中,可以覆蓋所描述的每個bean。例:
@Configurationpublic class FooConfiguration { @Bean public Contract feignContract() { return new feign.Contract.Default(); } @Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { return new BasicAuthRequestInterceptor("user", "password"); }}
這將使用feign.Contract.Default替換SpringMvcContract,並將RequestInterceptor新增到RequestInterceptor的集合中。可以在@EnableFeignClients屬性defaultConfiguration中以與上述相似的方式指定預設配置。不同之處在於,此配置將適用於所有feign客戶端。
Feign Hystrix支援
如果Hystrix在類路徑上,預設情況下,Feign將使用斷路器包裝所有方法。返回com.netflix.hystrixCommand也可用。這允許您使用反應模式(呼叫.toObservable()或.observe()或非同步使用(呼叫.queue())。 要禁用Feign的Hystrix支援,請設定feign.hystrix.enabled=false. 在每個客戶端基礎上禁用Hystrix支援建立一個帶有“原型”scope的vanilla Feign.Builder@Configurationpublic class FooConfiguration { @Bean @Scope("prototype") public Feign.Builder feignBuilder() { return Feign.builder(); }}
Feign Hystrix回退
Hystrix支援回退概念:當迴路開啟或執行錯誤時執行的預設程式碼路徑。要為給定的@FeignClient啟用回退,將fallback屬性設定為實現回退的類名。@FeignClient(name = "hello", fallback = HystrixClientFallback.class)protected interface HystrixClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") Hello iFailSometimes();}static class HystrixClientFallback implements HystrixClient { @Override public Hello iFailSometimes() { return new Hello("fallback"); }}
如果需要訪問導致回退觸發器的原因,可以使用@FeignClient內的fallbackFactory屬性。
@FeignClient(name = "hello", fallbackFactory = HystrixClientFallbackFactory.class)protected interface HystrixClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") Hello iFailSometimes();}@Componentstatic class HystrixClientFallbackFactory implements FallbackFactory<HystrixClient> { @Override public HystrixClient create(Throwable cause) { return new HystrixClientWithFallBackFactory() { @Override public Hello iFailSometimes() { return new Hello("fallback; reason was: " + cause.getMessage()); } }; }}
警告:
在Feign中的回退實現和Hystrix回退工作方式有侷限性。當前返回com.netflix.hystrix.HystrixCommand和rx.Observable的方法目前不支援回退。
Feign繼承支援
Feign通過單繼承介面支援樣板apis。這樣就可以將常用操作分成方便的基本介面。 UserService.javapublic interface UserService { @RequestMapping(method = RequestMethod.GET, value ="/users/{id}") User getUser(@PathVariable("id") long id);}
UserResource.java
@RestControllerpublic class UserResource implements UserService {}
UserClient.java
package project.user;@FeignClient("users")public interface UserClient extends UserService {}
注意:
通常不建議在伺服器和客戶端之間共享介面。它引入緊耦合,並且實際上並不適用於當前形式的Spring MVC(方法引數對映不被繼承)。
Feign 請求/響應壓縮
您可以考慮為您的Feign請求啟用請求或響應GZIP壓縮。您可以通過啟用其中一個屬性來執行此操作:
feign.compression.request.enabled=truefeign.compression.response.enabled=true
Feign請求壓縮為您提供與您為Web伺服器設定的類似的設定:
feign.compression.request.enabled=truefeign.compression.request.mime-types=text/xml,application/xml,application/jsonfeign.compression.request.min-request-size=2048
這些屬性可以讓您對壓縮介質型別和最小請求閾值長度有選擇性。
Feign日誌記錄
為每個建立的Feign客戶端建立一個記錄器。預設情況下,記錄器的名稱是用於建立Feign客戶端的介面的完整類名。Feign logging僅響應DEBUG級別。application.yml
logging.level.project.user.UserClient: DEBUG
您可以為每個客戶端配置的Logger.Level物件告訴Feign記錄多少。選擇是: *NONE,無記錄(DEFAULT)。 *BASIC,只記錄請求方法和URL以及響應狀態程式碼和執行時間。 *HEADERS,記錄基本資訊以及請求和響應標頭。 *FULL,記錄請求和響應的標頭檔案,正文和元資料。 例如,以下將Logger.Level設定為FULL:
@Configurationpublic class FooConfiguration { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; }}