1. 程式人生 > >SpringCloud(十) 宣告式RESt客戶端 Feign

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 Cloud Project page

示例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.java
public 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;    }}


















           

給我老師的人工智慧教程打call!http://www.captainbed.net/

這裡寫圖片描述