SpringCloud将Netty的请求头通过feign向下游微服务传递

首先,feign想要将请求头向下游传递需要重写feign包下的RequestInterceptor(feigin的拦截器),拦截feign请求进行处理。代码

@Configuration
public class FeignRequestConfig implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        //获取当前线程的request
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headers = request.getHeaderNames();
        if(headers == null){
            return;
        }
        //将heads向下传递
        while (headers.hasMoreElements()){
            String name = headers.nextElement();
            String value = request.getHeader(name);
            requestTemplate.header(name,value);
        }
    }
}

然而在开发过程中发现,netty接收的请求没有ServletRequestAttributes 这个servlet上下文。

但是,我可以将netty请求中的参数拿到,自己建一个servlet上下文!

上代码:

首先,建一个HttpServletRequest实现类

public class HttpServletHeaderEntity implements HttpServletRequest {

    private final ContainerRequestContext containerRequestContext;

    public HttpServletHeaderEntity(ContainerRequestContext containerRequestContext){
        this.containerRequestContext = containerRequestContext;
    }

    @Override
    public Enumeration<String> getHeaderNames() {
        return Collections.enumeration(containerRequestContext.getHeaders().keySet());
    }

    @Override
    public String getHeader(String s) {
        return containerRequestContext.getHeaderString(s);
    }

}

这里我只要Header信息,所以只实现两个对header操作的方法,其他方法都是return null就不贴过来了。

第二部,过滤netty请求,拿到nety请求信息,将请求头存到前面新建的HttpServletHeaderEntity ,放入servlet上下文中。

@Service
@Provider
public class RestfulGloablInfoFilterEndpoint implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException {
        //将netty的请求头放入httpservlet上下文中,后续调用feign会从httpservlet上下文拿取传递。
        HttpServletRequest httpServletRequest = new HttpServletHeaderEntity(containerRequestContext);
        ServletRequestAttributes attributes = new ServletRequestAttributes(httpServletRequest);
        RequestContextHolder.setRequestAttributes(attributes,true);
    }

}
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值