带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(11)https://developer.aliyun.com/article/1340058?groupCode=taobaotech
ThreadLocal示例
鹰 眼 链 路 ThreadLocal 的 使 用 EagleEye(鹰眼)作为全链路监控系统在集团内部被广泛使用,traceId、rpcId、压测标等信息存储在EagleEye 的ThreadLocal变量中,并在HSF/Dubbo服务调用间进行传递。EagleEye通过Filter将数据初始化到ThreadLo- cal中,部分相关代码如下:
EagleEyeHttpRequest eagleEyeHttpRequest = this.convertHttpRequest(httpRequest); // 1. 初始化,将traceId、rpcId等数据存储到鹰眼的ThreadLocal变量中EagleEyeRequestTracer.startTrace(eagleEyeHttpRequest, false); try { chain.doFilter(httpRequest, httpResponse); } finally { // 2. 清理ThreadLocal变量值EagleEyeRequestTracer.endTrace(this.convertHttpResponse(httpResponse)); }
在EagleEyeFilter中,通过EagleEyeRequestTracer.startTrace方法进行初始化,在前置入参转换后,通过startTrace重载方法将鹰眼上下文参数存入ThreadLocal中,相关代码如下:
EagleEyeFilter在finally代码块中,通过EagleEyeRequestTracer.endTrace方法结束调用链,通过clear方法将 ThreadLocal中的数据进行清理,相关代码实现如下:
带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(13)https://developer.aliyun.com/article/1340056?groupCode=taobaotech