菜单
本页目录

OpenFeign详解

1.覆盖OpenFeign默认值

每个 feign 客户端都是组件集合(这个集合是所以提供相同服务的客户端)的一部分,这些组件协同工作以按需联系远程服务器(由feign客户端主动的去联系服务器,这个服务器可以是Consul),并且该集合具有一个名称,您可以作为应用程序开发人员使用注释为其提供该名称。 Spring Cloud 允许您通过使用声明其他配置(在 之上)来完全控制假客户端。 例如注解:@FeignClient ,通过传入指定参数,对服务名称进行定义以控制

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

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

NOTE

FeignClientsConfigurationSpring Cloud 提供的一个默认配置类,主要用于配置 Feign 客户端。它包含了 Feign 客户端的基本设置,如编码器、解码器、契约、日志记录等。 在 Spring Cloud 中,当你使用 @EnableFeignClients@FeignClient 注解时,FeignClientsConfiguration 会自动加载并应用到你的 Feign 客户端。这使得 Feign 客户端能够以 Spring 的方式进行配置和管理。

NOTE

FooConfiguration 不需要使用 @Configuration 进行注解。然而,如果确实进行了注解,那么需要注意将其排除在任何会包含此配置的 @ComponentScan 之外,否则它将成为默认的 feign.Decoderfeign.Encoderfeign.Contract 等配置源。可以通过将它放在与任何 @ComponentScan@SpringBootApplication 不重叠的包中来避免这种情况,或者可以在 @ComponentScan 中显式地将其排除。

NOTE

使用 @FeignClient注解中的 contextId属性,除了更改客户端集合的名称外,它还会覆盖客户端名称的别名,并且将被用作为该客户端创建的配置 bean 的名称的一部分。

WARNING

以前,使用 url 属性时,不需要指定 name 属性。现在使用时,name 属性是必需的。

支持使用占位符在 name 和 url 属性。

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

spring-cloud-starter-openfeign 支持 spring-cloud-starter-loadbalancer。但是,由于它是一个可选依赖项,如果你想使用它,需要确保已将其添加到你的项目中。

要使用基于 OkHttpClient 的 Feign 客户端,请确保 OKHttpClient 位于类路径中,并设置 spring.cloud.openfeign.okhttp.enabled=true

对于基于 Apache HttpClient 5 的 Feign 客户端,只需确保 HttpClient 5 在类路径中即可,但你仍然可以通过设置 spring.cloud.openfeign.httpclient.hc5.enabled=false 来禁用其在 Feign 客户端中的使用。在使用 Apache HC5 时,你可以通过提供一个 org.apache.hc.client5.http.impl.classic.CloseableHttpClient 类型的 bean 来自定义使用的 HTTP 客户端。

你还可以通过在属性中设置值进一步自定义 HTTP 客户端。仅以 spring.cloud.openfeign.httpclient.xxx 为前缀的那些将适用于所有客户端,以 httpclient 为前缀的那些适用于 Apache HttpClient 5,以 httpclient.okhttp 为前缀的那些适用于 OkHttpClient。你可以在附录中找到可以自定义的属性的完整列表。

TIP

Spring Cloud OpenFeign 默认不为 Feign 提供以下 Bean,但仍然会从应用程序上下文中查找所需要的 Bean 来创建 Feign 客户端。