非Spring应用使用Spring Webflux WebClient时如何生成合规traceID
非Spring应用生成符合B3规范TraceID的实现方案
生成规则
下游Spring Cloud服务默认遵循B3链路追踪协议,TraceID需满足以下要求:
- 仅由小写十六进制字符(0-9、a-f)组成
- 长度为16位(对应64位)或32位(对应128位,当前主流推荐)
- 不得包含特殊符号、大写字母
实现代码
1. 编写TraceID生成工具方法
直接用JDK自带的UUID生成即可,无需额外引入第三方依赖:
import java.util.UUID; /** * 生成符合B3规范的32位TraceID */ public static String generateB3TraceId() { // 去掉UUID的横杠,转小写,刚好得到32位十六进制字符串 return UUID.randomUUID().toString().replace("-", "").toLowerCase(); } /** * 可选:生成符合B3规范的16位SpanID,带上后下游服务兼容性更好 */ public static String generateB3SpanId() { return UUID.randomUUID().toString().replace("-", "").toLowerCase().substring(0, 16); }
2. 改造WebClient请求代码
把生成的TraceID和可选的SpanID放到请求头即可,下游Spring服务的Sleuth组件会自动识别并透传:
final var traceId = generateB3TraceId(); final var spanId = generateB3SpanId(); final var response = webClient.post() .uri("http://some-third-party-api.com/someroute") .header("X-B3-TraceId", traceId) .header("X-B3-SpanId", spanId) // 可选采样标识,1表示需要采样记录链路,0表示不采样,按需设置即可 .header("X-B3-Sampled", "1") .body(BodyInserters.fromValue(payload)) .retrieve() .bodyToMono(String.class) .block();
注意事项
- 不要生成不符合长度和字符要求的TraceID,否则下游Sleuth会识别失败,自动生成新的TraceID,导致链路断裂。
- 同一条业务请求链路如果要调用多个下游接口,需复用同一个TraceID,每次调用生成新的SpanID即可,保证链路关联。
- 无需引入任何Spring Cloud Sleuth相关依赖,只要按照规则生成字符串即可完成透传。
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

