背景需求
springmvc 可以直接通过拦截器Interceptor和过滤器filter拦截请求头header,从而获取必要的验证信息作为我们业务逻辑服务。比如权限验证,多租户的权限范围等等。
但是在springcloud中微服务的调用其实最终也是远程调用了http,那么能不能在客户端调用的时候发给服务端的header中添加自定义的信息呢,比如业务线ID或者auhtor信息等等进而和springmvc的业务逻辑部分统一避免额外的代码实现。
Feign设置header目前有两种方式
1.实现拦截器RequestInterceptor 统一处理
2.手工创建Feignclient配置拦截器
3.RequestInterceptor +ThreadLocal实现动态传参
拦截器统一处理
我们可以直接在接口的interface的公共包中加入如下配置,这样同样的调用都会经过这个拦截器处理,进而实现统一的header处理。
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@Slf4j
public class HeaderInterceptor implements RequestInterceptor {
@Value("${feign.contract-op.businessId:sys}")
private String businessId;
@Override
public void apply(RequestTemplate requestTemplate) {
log.info("requestTemplate.header get value feign.contract-op.businessId: {}= {} ",ContractRequestHeaders.BUSINESS_ID,businessId);
if(businessId!=null && !"sys".equals(businessId)){
requestTemplate.header("businessId", businessId);
}
}
}
接口类这里直接配置为configuration,这样每次调用时它都执行一次HeaderInterceptor 拦截器
@FeignClient(
url = "${feign.contract-op.url:https://192.168.1.1:50003/contract-op-service}/billInfo",
name = "contractOpClient",
contextId = "billInfoClient",configuration = ContractFeignConfiguration.class
)
public interface BillInfoClient {
@ApiOperation(value = "分页")
@GetMapping
PageInfo<BillInfoListResponse

最低0.47元/天 解锁文章
1673

被折叠的 条评论
为什么被折叠?



