OpenFeign详解
1.覆盖OpenFeign默认值
每个 feign 客户端都是组件集合(这个集合是所以提供相同服务的客户端)的一部分,这些组件协同工作以按需联系远程服务器(由feign客户端主动的去联系服务器,这个服务器可以是Consul),并且该集合具有一个名称,您可以作为应用程序开发人员使用注释为其提供该名称。
Spring Cloud 允许您通过使用声明其他配置(在 之上)来完全控制假客户端。
例如注解:@FeignClient
,通过传入指定参数,对服务名称进行定义以控制
@FeignClient(name = "stores", configuration = FooConfiguration.class)
public interface StoreClient {
//..
}
在这种情况下,客户端由已存在FooConfiguration以及 FeignClientsConfiguration 中的任何组件组成(其中前者将覆盖后者)
FeignClientsConfiguration
是 Spring Cloud
提供的一个默认配置类,主要用于配置 Feign 客户端。它包含了 Feign 客户端的基本设置,如编码器、解码器、契约、日志记录等。
在 Spring Cloud 中,当你使用 @EnableFeignClients
或 @FeignClient
注解时,FeignClientsConfiguration
会自动加载并应用到你的 Feign 客户端。这使得 Feign 客户端能够以 Spring 的方式进行配置和管理。
FooConfiguration
不需要使用 @Configuration
进行注解。然而,如果确实进行了注解,那么需要注意将其排除在任何会包含此配置的 @ComponentScan
之外,否则它将成为默认的 feign.Decoder
、feign.Encoder
、feign.Contract
等配置源。可以通过将它放在与任何 @ComponentScan
或 @SpringBootApplication
不重叠的包中来避免这种情况,或者可以在 @ComponentScan
中显式地将其排除。
使用 @FeignClient
注解中的 contextId
属性,除了更改客户端集合的名称外,它还会覆盖客户端名称的别名,并且将被用作为该客户端创建的配置 bean 的名称的一部分。
以前,使用 url 属性时,不需要指定 name 属性。现在使用时,name 属性是必需的。
支持使用占位符在 name 和 url 属性。
@FeignClient(name = "${feign.name}", url = "${feign.url}")
public interface StoreClient {
//..
}
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。你可以在附录中找到可以自定义的属性的完整列表。
Spring Cloud OpenFeign 默认不为 Feign 提供以下 Bean,但仍然会从应用程序上下文中查找所需要的 Bean 来创建 Feign 客户端。