【feign】OpenFeign自定义配置

SpringBoot-feign之自定义配置

概述

使用Feign默认配置可能不能满足需求,这时就需要我们实现自己的Feign配置,配置方式:

  • application.properties(.yml)全局和局部(针对单个Feign接口)
  • spring java config全局配置和局部(针对单个Feign接口)

示例说明

具体配置项如下,如何配置可以参考FeignClientsConfigurationFeign.Builder类:
Logger.Level:日志级别
Retryer: 重试机制
ErrorDecoder:错误解码器
Request.Options:
RequestInterceptor:请求拦截器
Contract:处理Feign接口注解,Spring Cloud Feign 使用SpringMvcContract 实现,处理Spring mvc 注解,也就是我们为什么可以用Spring mvc 注解的原因。
Client:Http客户端接口,默认是Client.Default,但是我们是不使用它的默认实现,Spring Cloud Feign为我们提供了okhttp3ApacheHttpClient两种实现方式,只需使用maven引入以下两个中的一个依赖即可,版本自由选择。
Encoder:编码器,将一个对象转换成http请求体中, Spring Cloud Feign 使用 SpringEncoder
Decoder:解码器, 将一个http响应转换成一个对象,Spring Cloud Feign 使用 ResponseEntityDecoder
FeignLoggerFactory:日志工厂参考Spring Cloud Feign 之日志自定义扩展
Feign.BuilderFeign接口构建类,覆盖默认Feign.Builder,比如:HystrixFeign.Builder
FeignContext管理了所有的java config 配置

  • 方式一: application.properties(.yml)局部(针对单个Feign接口)
feign:
  client:
    config:
      feignName:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full
        errorDecoder: com.example.SimpleErrorDecoder
        retryer: com.example.SimpleRetryer
        requestInterceptors:
          - com.example.FooRequestInterceptor
          - com.example.BarRequestInterceptor
        decode404: false
        encoder: com.example.SimpleEncoder
        decoder: com.example.SimpleDecoder
        contract: com.example.SimpleContract
        client: com.example.SimpleClient
  • 方式二: application.properties(.yml)全局(针对所有Feign接口)
feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: basic
        # ... (该处省略,属性同局部设置)
  • 方式三: spring java config局部(针对单个Feign接口)
@Configuration
public class FooConfiguration {
    @Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }

    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("user", "password");
    }
}
@FeignClient(name = "user", url = "${user.url}", configuration = UserFeignClientConfig.class)
public interface UserFeign {
    @GetMapping("/{id}")
    User getUserByID(@PathVariable("id") String id);
}
  • 方式四: spring java config全局
@EnableFeignClients(defaultConfiguration = FeignClientsConfig.class)
@SpringBootApplication
public class FeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }
}

自定义配置优先级

下面代码就是处理配置使之生效,FeignClientFactoryBean#configureFeign :

protected void configureFeign(FeignContext context, Feign.Builder builder) {
	FeignClientProperties properties = applicationContext.getBean(FeignClientProperties.class);

	FeignClientConfigurer feignClientConfigurer = getOptional(context, FeignClientConfigurer.class);
	setInheritParentContext(feignClientConfigurer.inheritParentConfiguration());

	if (properties != null && inheritParentContext) {
		if (properties.isDefaultToProperties()) {
			configureUsingConfiguration(context, builder);
			configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()), builder);
			configureUsingProperties(properties.getConfig().get(contextId), builder);
		}
		else {
			configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()), builder);
			configureUsingProperties(properties.getConfig().get(contextId), builder);
			configureUsingConfiguration(context, builder);
		}
	}
	else {
		configureUsingConfiguration(context, builder);
	}
}

第一种:配置文件无配置

使用 java config 配置,优先级有低到高进行单个配置覆盖

  1. FeignClientsConfiguration Spring Cloud Feign 全局默认配置。
  2. @EnableFeignClients#defaultConfiguration 自定义全局默认配置。
  3. FeignClient#configuration 单个Feign接口局部配置。

第二种:feign.client.default-to-properties=true(默认true)

java configapplication.properties(.yml)配置,优先级有低到高进行单个配置覆盖

  1. FeignClientsConfiguration Spring Cloud Feign 全局默认配置。
  2. @EnableFeignClients#defaultConfiguration 自定义全局默认配置。
  3. FeignClient#configuration 单个Feign接口局部配置。
  4. application.properties(.yml)配置文件全局默认配置,配置属性feign.client.default-config指定默认值(defult)
  5. application.properties(.yml)配置文件局部配置,指定@FeignClient#name局部配置。

第三种:feign.client.default-to-properties=false(默认true)

java configapplication.properties(.yml)配置,优先级有低到高进行单个配置覆盖

  1. application.properties(.yml)配置文件全局默认配置,配置属性feign.client.default-config指定默认值(defult)
  2. application.properties(.yml)配置文件局部配置,指定@FeignClient#name局部配置。
  3. FeignClientsConfiguration Spring Cloud Feign 全局默认配置。
  4. @EnableFeignClients#defaultConfiguration 自定义全局默认配置。
  5. FeignClient#configuration 单个Feign接口局部配置。

参考

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值