工作纪实_19-微服务Feign调用实现header透传

工作背景
项目框架:cloud微服务、gateway网关、openfeign
需求:服务间调用,网关层面我使用jwt做了用户的认证,登录后的token以及用户信息,网关层会在请求的header进行添加,token、user_info,如果是网关->A服务,此时是可以在A服务中拿到header的token、user_info字段的,但是如果是网关->A服务->B服务,在B服务中想要拿到token和user_info,则在A->B服务的过程中,需要对介质Feign(http+ribbon)的拦截器加以改造

查询了一下官网的文档,如果要在feign级别使用RequestInteceptor的拦截,需要满足以下两个任意一个条件:
1.feign调用禁用hystrix
2.如果没有禁用hystrix,需要将hystrix的隔离级别改为semaphone

官网使用规范工作纪实_19-微服务Feign调用实现header透传_第1张图片

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.Optional;

@Slf4j
public class FeignRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            Enumeration<String> headerNames = request.getHeaderNames();
            Optional.ofNullable(headerNames).ifPresent(headers -> {
                while (headers.hasMoreElements()) {
                    String name = headers.nextElement();
                    String value = request.getHeader(name);
                    requestTemplate.header(name, value);
                    log.info("feign header set key:{}, value:{}", name, value);
                }
            });
        }
    }

}

在会产生fein调用的地方,直接把当前bean注入进去即可【网关层面的feign调用,可以不禁用hystrix,只需要禁用服务之间的feign调用】

你可能感兴趣的:(工作纪实)