1、做法
在Spring Cloud中,FeignClient
是一个声明式的Web服务客户端,让调用远程服务就像调用本地方法一样简单。拦截器可以用于在发送请求之前或者获得响应之后执行一些操作,比如添加公共的Header、记录日志、做一些统计等。
在Feign中,拦截器是通过实现feign.RequestInterceptor
接口来定义的。如果你想为FeignClient
添加多个拦截器,可以声明多个RequestInterceptor
的Bean。
下面是如何定义和注册多个拦截器的步骤:
1、创建多个实现了feign.RequestInterceptor
接口的类:
import feign.RequestInterceptor;
import feign.RequestTemplate;public class FirstInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {// 在这里添加你的逻辑,比如添加Headertemplate.header("First-Header", "first-value");}
}public class SecondInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {// 在这里添加你的逻辑,比如添加Headertemplate.header("Second-Header", "second-value");}
}
2、在Spring的配置类中注册这些拦截器的Bean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FeignConfig {@Beanpublic FirstInterceptor firstInterceptor() {return new FirstInterceptor();}@Beanpublic SecondInterceptor secondInterceptor() {return new SecondInterceptor();}
}
3、然后,你可以在FeignClient
接口上使用@FeignClient
注解的configuration
属性来指定使用哪个配置类:
@FeignClient(name = "your-service", configuration = FeignConfig.class)
public interface YourServiceClient {// 定义你的方法
}
当Feign准备发起请求时,所有注册的RequestInterceptor
会按照它们注册的顺序被调用,并且每个拦截器都可以对请求RequestTemplate
进行修改。
如果不想全局应用某些拦截器,也可以在配置类中使用条件注解(如@Profile
、@ConditionalOnProperty
等)根据不同的环境或条件来决定是否实例化特定的拦截器。
2、如何控制拦截器的注册顺序?
1、使用@Order
或@Priority
注解:
在Spring中,可以使用@Order
注解或JSR-250的@Priority
注解来指定Bean的加载顺序。这些注解可以直接加在拦截器的Bean定义方法上,或者加在拦截器类上:
import org.springframework.core.annotation.Order;
import javax.annotation.Priority;@Configuration
public class FeignConfig {@Bean@Order(1)public FirstInterceptor firstInterceptor() {return new FirstInterceptor();}@Bean@Order(2)public SecondInterceptor secondInterceptor() {return new SecondInterceptor();}
}
或者在类上使用
@Order(1)
public class FirstInterceptor implements RequestInterceptor {// ...
}@Order(2)
public class SecondInterceptor implements RequestInterceptor {// ...
}
2、使用Ordered
接口:
拦截器可以实现org.springframework.core.Ordered
接口来提供排序信息:
public class FirstInterceptor implements RequestInterceptor, Ordered {// ...@Overridepublic int getOrder() {return 1; // 优先级较高}
}public class SecondInterceptor implements RequestInterceptor, Ordered {// ...@Overridepublic int getOrder() {return 2; // 优先级较低}
}
3、设置全局拦截器
如果你需要为某个特定的Feign客户端提供特定的配置,并只为该客户端应用特定的拦截器,而不使用全局拦截器。否则所有的全局拦截器对他都有效。