1. 程式人生 > >Spring Cloud之Feign客戶端

Spring Cloud之Feign客戶端

電子商務 springcloud spring cloud springcloud微服務 微服務雲架構

Feign是一個聲明式的Web服務客戶端。這使得Web服務客戶端的寫入更加方便 要使用Feign創建一個界面並對其進行註釋。它具有可插入註釋支持,包括Feign註釋和JAX-RS註釋。Feign還支持可插拔編碼器和解碼器。Spring Cloud增加了對Spring MVC註釋的支持,並使用Spring Web中默認使用的HttpMessageConvertersSpring Cloud集成Ribbon和Eureka以在使用Feign時提供負載均衡的http客戶端。

如何加入Feign

要在您的項目中包含Feign,請使用組org.springframework.cloud和工件ID spring-cloud-starter-feign

的啟動器。有關使用當前的Spring Cloud發布列表設置構建系統的詳細信息,請參閱Spring Cloud項目頁面

示例spring boot應用

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@EnableFeignClients
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

StoreClient.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負載平衡器(有關Ribbon支持的詳細信息,請參閱下文))。您還可以使用url屬性(絕對值或只是主機名)指定URL。應用程序上下文中的bean的名稱是該接口的完全限定名稱。要指定您自己的別名值,您可以使用@FeignClient註釋的qualifier值。

Spring Cloud的Feign支持的中心概念是指定的客戶端。每個假裝客戶端都是組合的組件的一部分,它們一起工作以根據需要聯系遠程服務器,並且該集合具有您將其作為應用程序開發人員使用@FeignClient註釋的名稱。Spring Cloud根據需要,使用FeignClientsConfiguration為每個已命名的客戶端創建一個新的集合ApplicationContext這包含(除其他外)feign.Decoderfeign.Encoderfeign.Contract

Spring Cloud可以通過使用@FeignClient聲明額外的配置(FeignClientsConfiguration)來完全控制假客戶端。例:

@FeignClient(name = "stores", configuration = FooConfiguration.class)
public interface StoreClient {
    //..
}

在這種情況下,客戶端由FeignClientsConfiguration中的組件與FooConfiguration中的任何組件組成(後者將覆蓋前者)。

nameurl屬性支持占位符。

@FeignClient(name = "${feign.name}", url = "${feign.url}")
public interface StoreClient {
    //..
}

Spring Cloud Netflix默認為feign(BeanType beanName:ClassName)提供以下bean:

  • 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.enabledfeign.httpclient.enabled設置為true,並將它們放在類路徑上來使用OkHttpClient和ApacheHttpClient feign客戶端。

Spring Cloud Netflix 默認情況下提供以下bean,但是仍然從應用程序上下文中查找這些類型的bean以創建假客戶機:

  • Logger.Level

  • Retryer

  • ErrorDecoder

  • Request.Options

  • Collection<RequestInterceptor>

  • SetterFactory

創建一個類型的bean並將其放置在@FeignClient配置(例如上面的FooConfiguration)中)允許您覆蓋所描述的每個bean。例:

@Configuration
public class FooConfiguration {
    @Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }

    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("user", "password");
    }
}

這將SpringMvcContract替換為feign.Contract.Default,並將RequestInterceptor添加到RequestInterceptor的集合中。

可以在@EnableFeignClients屬性defaultConfiguration中以與上述相似的方式指定默認配置。不同之處在於,此配置將適用於所有假客戶端。



源碼來源下載地址

Spring Cloud之Feign客戶端