feign接口调用使用header

2022年7月31日12:16:38

场景:

在做运营平台调用AIID项目接口,需要将header里面的语言传递给AIID项目。但是AIID里面取不到header里面的数据

解决:

1、修改hytrix配置,配置hytrix的 strategy为 SEMAPHORE。

Hystrix 提供两种执行隔离策略( ExecutionIsolationStrategy ) :SEMAPHORE 、THREAD

  • SEMAPHORE :信号量,命令在调用线程执行。
  • THREAD :线程池,命令在线程池执行

如果不修改配置,默认配置的为THREAD,因为不在同一个线程中,无法获得请求的上下文对象,无法执行第二步操作

feign:
  httpclient:
    enabled: false
  okhttp:
    enabled: true
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          strategy: SEMAPHORE
          thread:
            timeoutInMilliseconds: 30000

2、增加拦截器

feign提供的 RequestInterceptor 接口会默认拦截feign发出去所有请求,所以在这里拦截运营平台的服务operation发送给AIID服务的请求,然后再请求头中添加language

如果再第一步没有修改 hystrix 的 strategy,则这一步中 RequestContextHolder.getRequestAttributes()的结果无法获取到,结果为null

拦截器写在operation项目中

@Slf4j
@Component
public class FeignTokenInterceptor implements RequestInterceptor {
 
    @Override
    public void apply(RequestTemplate template) {
        HttpServletRequest request = getServletRequest();
        if (null == request){
            return;
        }
        template.header("language", getHeaders(request));
    }
 
    private HttpServletRequest getServletRequest() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        return ((ServletRequestAttributes) requestAttributes).getRequest();
    }
 
    private String getHeaders(HttpServletRequest request){
        String lang = request.getHeader("lang");
        if("cn".equals(lang)){
            lang="zh";
        }
        log.info("lang:{}",lang);
        return lang;
    }
}
这样 在运营平台operation项目里面添加了拦截器并且更改Hystrix策略,这样B项目里面就可以直接取到header里面的参数了。
  • 作者:muum_sun
  • 原文链接:https://blog.csdn.net/sunzhitao1990/article/details/114580716
    更新时间:2022年7月31日12:16:38 ,共 1340 字。