Feign拦截器RequestInterceptor优先级排序详解

RequestInterceptor接口是Feign请求拦截接口,可以在请求发送之前添加header、记录日志等操作;

一、RequestInterceptor接口
public interface RequestInterceptor {

  /**
   * 每个请求都会调用apply方法
   */
  void apply(RequestTemplate template);
}

其实现类有BaseRequestInterceptor抽象拦截器,主要用来添加子类的header信息,其实现类有两个,FeignAcceptGzipEncodingInterceptor用来添加 Accept-Encoding、gzip、deflate头信息,FeignContentGzipEncodingInterceptor用来添加Content-Encoding、gzip、deflate头信息;BasicAuthRequestInterceptor用来添加认证Authorization头信息;OAuth2FeignRequestInterceptor用来添加OAuth2认证相关信息;这五个默认实现只有开启相关配置后才可以启用,优先级是最低的;

二、RequestInterceptor接口实现类优先级

自定义拦截器会希望有一个优先级顺序,那如何确定优先级呢?可以通过PriorityOrdered>Ordered>@Order来设置优先级顺序,但是系统已经实现的优先级因为没有设置上述排序字段,所以优先级永远是最低的;

org.springframework.cloud.openfeign.FeignClientFactoryBean#configureUsingConfiguration方法在系统启动时排序:

		if (requestInterceptors != null) {
			List<RequestInterceptor> interceptors = new ArrayList<>(requestInterceptors.values());
      // 对拦截器进行排序
			AnnotationAwareOrderComparator.sort(interceptors);
			builder.requestInterceptors(interceptors);
		}

feign.SynchronousMethodHandler#targetRequest方法在发送请求时轮询调用拦截器apply方法:

  Request targetRequest(RequestTemplate template) {
    for (RequestInterceptor interceptor : requestInterceptors) {
      interceptor.apply(template);
    }
    return target.apply(template);
  }

GitHub地址:https://github.com/mingyang66/spring-parent

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值