声明性REST客户端:Feign

Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。

如何加入Feign

要在您的项目中包含Feign,请使用组org.springframework.cloud和工件IDspring-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 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值。

以上的Ribbon客户端将会发现“商店”服务的物理地址。如果您的应用程序是Eureka客户端,那么它将解析Eureka服务注册表中的服务。如果您不想使用Eureka,您可以简单地配置外部配置中的服务器列表(例如,参见

上文)。

覆盖Feign默认值

Spring Cloud的Feign支持的中心概念是指定的客户端。每个假装客户端都是组合的组件的一部分,它们一起工作以根据需要联系远程服务器,并且该集合具有您将其作为应用程序开发人员使用@FeignClient注释的名称。Spring Cloud根据需要,使用FeignClientsConfiguration为每个已命名的客户端创建一个新的集合ApplicationContext。这包含(除其他外)feign.Decoder,feign.Encoder和feign.Contract。

Spring Cloud可以通过使用@FeignClient声明额外的配置(FeignClientsConfiguration)来完全控制假客户端。例:

@FeignClient(name = "stores", configuration = FooConfiguration.class)

public interface StoreClient {

    //..

}

在这种情况下,客户端由FeignClientsConfiguration中的组件与FooConfiguration中的任何组件组成(后者将覆盖前者)。

注意FooConfiguration不需要使用@Configuration注释。但是,如果是,则请注意将其从任何@ComponentScan中排除,否则将包含此配置,因为它将成为feign.Decoder,feign.Encoder,feign.Contract等的默认来源,指定时。这可以通过将其放置在任何@ComponentScan或@SpringBootApplication的单独的不重叠的包中,或者可以在@ComponentScan中明确排除。

注意serviceId属性现在已被弃用,有利于name属性。

警告以前,使用url属性,不需要name属性。现在需要使用name。

name和url属性支持占位符。

@FeignClient(name = "${feign.name}", url = "${feign.url}")

public interface StoreClient {

    //..

}

Spring Cloud Netflix默认为feign(BeanTypebeanName:ClassName)提供以下bean:

DecoderfeignDecoder:ResponseEntityDecoder(其中包含SpringDecoder)

EncoderfeignEncoder:SpringEncoder

LoggerfeignLogger:Slf4jLogger

ContractfeignContract:SpringMvcContract

Feign.BuilderfeignBuilder:HystrixFeign.Builder

ClientfeignClient:如果Ribbon启用,则为LoadBalancerFeignClient,否则将使用默认的feign客户端。

可以通过将feign.okhttp.enabled或feign.httpclient.enabled设置为true,并将它们放在类路径上来使用OkHttpClient和ApacheHttpClient feign客户端。

Spring Cloud Netflix 默认情况下提供以下bean,但是仍然从应用程序上下文中查找这些类型的bean以创建假客户机:

Logger.Level

Retryer

ErrorDecoder

Request.Options

Collection

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中以与上述相似的方式指定默认配置。不同之处在于,此配置将适用于所有假客户端。

注意如果您需要在RequestInterceptor`s you will need to either set the

thread isolation strategy for Hystrix to `SEMAPHORE中使用ThreadLocal绑定变量,或在Feign中禁用Hystrix。

application.yml

# To disable Hystrix in Feign

feign:

  hystrix:

    enabled: false

# To set thread isolation to SEMAPHORE

hystrix:

  command:

    default:

      execution:

        isolation:

          strategy: SEMAPHORE

你可能感兴趣的:(声明性REST客户端:Feign)