• Springboot给每个接口设置traceId,并添加到返回结果中


    原理

    slf4j有个MDC的类,是ThreadLocal的实现,保存在这里的变量会绑定到某个请求线程,于是在该请求的线程里的日志代码都可以使用设入的变量。 

    实现

    一、引入依赖

    这个是可选项,用于生成唯一uid,我人懒,就直接用这个工具,你们要自定义uid格式的,就可以不用导入。

    1. <dependency>
    2. <groupId>cn.hutoolgroupId>
    3. <artifactId>hutool-allartifactId>
    4. <version>5.7.20version>
    5. dependency>

    二、设置拦截器

    因为要给每一个请求都利用所以建议利用MDC绑定traceId,所以需要用拦截器拦截每一个请求。

    先给设置一个拦截器配置InterceptorConfig.class并实现重写WebMvcConfigurer,如下:

    1. @Configuration
    2. public class InterceptorConfig implements WebMvcConfigurer {
    3. /**
    4. * http请求拦截器
    5. * @param registry
    6. */
    7. @Override
    8. public void addInterceptors(InterceptorRegistry registry) {
    9. registry.addInterceptor(new TraceIdInterceptor());
    10. }
    11. }

    里面的new TraceIdInterceptor()就是我们的核心配置类了,用于MDC绑定traceId到线程中,首先,新建一个TraceIdInterceptor.class,代码及注释如下:

    1. @Component
    2. public class TraceIdInterceptor implements HandlerInterceptor {
    3. /**
    4. * preHandle为请求前拦截
    5. */
    6. @Override
    7. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    8. // 在日志框架中的MDC中添加请求的唯一标识(用于返回接口及保存mysql)
    9. String traceId = String.valueOf(UUID.randomUUID());
    10. // 绑定key值到线程中
    11. MDC.put("traceId", traceId);
    12. response.addHeader("traceId",traceId);
    13. // 继续执行接口请求
    14. return true;
    15. }
    16. }

    三、设置返回体

    然后通过【MDC.get("traceId")】实现获取traceId,这个可以用在统一返回的结果包装类里,如下: 

    1. /**
    2. * 接口返回统一包装
    3. */
    4. @Data
    5. @NoArgsConstructor
    6. @AllArgsConstructor
    7. public class Result {
    8. private String traceId;
    9. private Integer code;
    10. private String msg;
    11. private Object data;
    12. /**
    13. * 成功,且返回体有数据
    14. * @param code
    15. * @param msg
    16. * @param data
    17. * @return
    18. */
    19. public static Result success(Integer code, String msg, Object data) {
    20. // 获取MDC中绑定的traceId
    21. String traceId = MDC.get("traceId");
    22. return new Result(traceId, code, msg, data);
    23. }
    24. /**
    25. * 成功,但返回体没数据
    26. * @param code
    27. * @param msg
    28. * @return
    29. */
    30. public static Result success(Integer code, String msg) {
    31. // 获取MDC中绑定的traceId
    32. String traceId = MDC.get("traceId");
    33. return new Result(traceId, code, msg, null);
    34. }
    35. }

    四、效果测试

     

  • 相关阅读:
    dubbo协议与triple协议的对比
    TensorFlow学习(5)数据结构 & 自定义组件(损失函数,激活函数,初始化,正则化和约束,层)
    推荐一款管理系统专用 低 代码工具,一天开发一个系统不是梦
    Reading Notes For Introduction To Linux
    最新 Java 高频面试集锦,让你“金九银十”轻松斩获offer
    RK3399 Android10 移除应用权限(包含USB)申请弹框
    七牛云 OSS 文件上传demo
    css3 hover效果
    linux统计程序耗时和最大内存消耗
    弹幕逆向signature、a_bogus
  • 原文地址:https://blog.csdn.net/weixin_42966151/article/details/133764236