配置讲解-业务过滤器的讲解

举报
幼儿园老大* 发表于 2024/11/27 15:41:04 2024/11/27
【摘要】 过滤器的作用在业务服务中通过需要一些公共参数,比如分布式链路traceId、用户id、平台code等,按道理说这些这些参数是由Gateway网关传递而来,放到了request请求头中,业务服务需要的时候直接去request中获取就可以了。但由于request的范围是ThreadLocal,是和线程绑定的,在使用线程池的情况下,request会丢失,所以有了线程池组件、Hystrix组件。在线...

过滤器的作用


在业务服务中通过需要一些公共参数,比如分布式链路traceId、用户id、平台code等,按道理说这些这些参数是由Gateway网关传递而来,放到了request请求头中,业务服务需要的时候直接去request中获取就可以了。


但由于request的范围是ThreadLocal,是和线程绑定的,在使用线程池的情况下,request会丢失,所以有了线程池组件、Hystrix组件。


在线程池组件和Hystrix组件中,对公共配置中的线程绑定工具BaseParameterHolder做了适配,这个工具其实是ThreadLocal,但线程池的组件和Hystrix的组件对此工具做了增强,只要将数据放到BaseParameterHolder里,就会正常的拿到


过滤器


@Slf4j
public class BaseParameterFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) throws ServletException, IOException {
        log.info("current thread doFilterInternal : {}",Thread.currentThread().getName());
        String traceId = request.getHeader(TRACE_ID);
        String gray = request.getHeader(GRAY_PARAMETER);
        String userId = request.getHeader(USER_ID);
        String code = request.getHeader(CODE);
        try {
            if (StringUtil.isNotEmpty(traceId)) {
                    BaseParameterHolder.setParameter(TRACE_ID,traceId);
                MDC.put(TRACE_ID,traceId);
            }
            if (StringUtil.isNotEmpty(gray)) {
                BaseParameterHolder.setParameter(GRAY_PARAMETER,gray);
                MDC.put(GRAY_PARAMETER,gray);
            }
            if (StringUtil.isNotEmpty(userId)) {
                BaseParameterHolder.setParameter(USER_ID,userId);
                MDC.put(USER_ID,userId);
            }
            if (StringUtil.isNotEmpty(code)) {
                BaseParameterHolder.setParameter(CODE,code);
                MDC.put(CODE,code);
            }
            filterChain.doFilter(request, response);
        }finally {
            BaseParameterHolder.removeParameter(TRACE_ID);
            MDC.remove(TRACE_ID);
            BaseParameterHolder.removeParameter(GRAY_PARAMETER);
            MDC.remove(GRAY_PARAMETER);
            BaseParameterHolder.removeParameter(USER_ID);
            MDC.remove(USER_ID);
            BaseParameterHolder.removeParameter(CODE);
            MDC.remove(CODE);
        }
    }
}


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。