跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Spring MVC: 如何自动生成 RequestID 并在需要时访问
未分類
9 2 月 2021

Spring MVC: 如何自动生成 RequestID 并在需要时访问

Spring MVC: 如何自动生成 RequestID 并在需要时访问

資深大佬 : feng32 4

目前的程序结构大概是这样的:

// base controller 中定义了异常情况下的 API 返回 public class BaseController {     @ExceptionHandler(CodeMessageException.class)     @ResponseBody     protected ResultModel<Long> exception(CodeMessageException e) {         log.error("{}", e.getMessage(), e);         return new ResultModel<>(e.getCode(), e.getMessage());     } }  // 有一个 Filter 已经实现了打印 Request / Response Body (通过 Filter 实现了一些全局的处理逻辑) public class HttpLogFilter implements Filter {     @Override     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {         ...     } }  // 业务 Controller 继承 BaseController @Controller public class DeviceController extends BaseController {     @PostMapping("/device/activate")     @ResponseBody     public ResultModel<Long> activateDevice(@RequestBody ActivateDeviceRequest request) {         return deviceService.activateDevice(request.getSn());     }  // Service 层可以进行必要的参数检查,然后直接抛一个异常出来 // 异常被 BaseController 捕捉,然后转成 JSON,这样代码看上去就很干净 public ResultModel<Long> activateDevice(String sn) {     if (sn == null) {         throw new CodeMessageException(ERROR_PARAM_MISSING, "Parameter sn is missing");     }     ... } 

问题来了,现在需要给每个 Request 生成一个 RequestID (UUID),这个 ID 是后端生成的,调用者不需要写对应的代码,但是调用者在 Response 中可以看到这个 Request ID

如何以尽量小的侵入性实现这个特性呢?基本的需求是 Service 层以及 BaseController (异常处理逻辑) 都能够比较简单地取到这个值并返回

同时希望打印 Request (包括 url / body)的时候,也能够把 Request ID 打印出来,否则请求量大的时候,日志还是会对不上

大佬有話說 (12)

  • 資深大佬 : ltoddy

    你为什么要在服务端生成啊,不应该是 nginx 或者 api-gateway 那里生成嘛,然后把 request id 透传。

  • 資深大佬 : huifer

    spring boot 里面写个 starter 可以吗. 或者引入统一拦截器,或者用 gateway 上面加入这个

  • 資深大佬 : buliugu

    不如老实上一套 APM

  • 資深大佬 : zhiguang

    requestwrapper

  • 資深大佬 : cs419

    生成 reqId:Filter + ThreadLocal
    resp 添加 reqId: HandlerMethodReturnValueHandler

  • 資深大佬 : jaynos

    之前好像实现过一个,通过声明一个 Request 作用域的 Bean 实现,构造函数里直接随机一个字符串

  • 資深大佬 : lychs1998

    这个我以前做过,相当于链路追踪用的 ID 呗?

    大致的逻辑给你一个参考:
    1.返回的 response 结构是我自己定义的,里面一个属性是 TraceId 。
    2.然后实现一个 Context 类,见代码片段: https://gist.github.com/lychs1998/1679bc9c155744ba23ea99307244dad8

  • 資深大佬 : choice4

    filter+threadlocal 保存 id,responsebodyadvice 包装响应

  • 資深大佬 : Geraltt

    生成 logId,放到 threadlocal 和 mdc 里面 直接打印,最后包装

  • 資深大佬 : luozic

    除了 context 加,也可以通过 jvm 的后门加进去,instrument 机制,不过推荐对接 metrics 架构,可以平滑由日志到 apm 平台。

  • 資深大佬 : samun

    用的 nginx+lua 处理的

  • 資深大佬 : axbx

    filte 添加一个 trace_id,然后从 Context 中获取

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具