Spring Cloud Gateway添加自定义traceId

网关中增加全局过滤器

@Bean
public GlobalFilter c() {
    return (exchange, chain) -> {
        exchange.getRequest().mutate().header("traceId", UUID.randomUUID().toString()).build();
        return chain.filter(exchange);
    };
}

下游系统获取

@GetMapping("/test”)
public JSONObject search(@RequestHeader String traceId){
	log.info("traceId {}",traceId);
}
Spring Cloud Gateway 中实现请求日志流水号(trace ID)通常需要集成分布式链路追踪工具,例如 Sleuth 和 Zipkin。Sleuth 会自动生成 trace ID 并将其注入到请求的上下文中,同时将该信息传递给下游服务,以实现完整的请求链路追踪。 ### 实现步骤 #### 1. 添加依赖 首先,在项目的 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> ``` 这些依赖将启用 Sleuth 和 Zipkin 集成,帮助生成和传播 trace ID。 #### 2. 配置 Sleuth 和 Zipkin 在 `application.yml` 或 `application.properties` 文件中配置 Sleuth 和 Zipkin 的相关参数。例如: ```yaml spring: application: name: gateway-service zipkin: base-url: http://localhost:9411 # Zipkin Server 地址 sleuth: sampler: probability: 1.0 # 设置采样率,1.0 表示记录所有请求 ``` 此配置将启用 Sleuth 并将追踪数据发送到 Zipkin Server。 #### 3. 自定义日志格式 为了在日志中显示 trace ID,可以修改日志框架的配置文件(如 `logback-spring.xml` 或 `log4j2.xml`)。以下是使用 Logback 的配置示例: ```xml <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg [traceId: %X{traceId:-}, spanId: %X{spanId:-}]%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="STDOUT"/> </root> </configuration> ``` 此配置会在日志中打印出 trace ID 和 span ID,方便后续追踪。 #### 4. 使用 MDC 手动注入 trace ID 如果某些情况下 trace ID 没有被自动注入,可以通过编写一个全局过滤器手动将 trace ID 注入到 MDC 中。以下是一个简单的实现示例: ```java import org.slf4j.MDC; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.OrderedGatewayFilter; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; @Component public class TraceIdGlobalFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String traceId = exchange.getRequest().getHeaders().getFirst("X-B3-TraceId"); if (traceId != null) { MDC.put("traceId", traceId); } return chain.filter(exchange).doOnTerminate(MDC::clear); } } ``` 此过滤器从请求头中获取 trace ID,并将其存储到 MDC 上下文中,以便日志框架能够正确记录。 #### 5. 验证 trace ID 是否生效 启动应用后,可以通过访问任意接口并查看日志文件来验证 trace ID 是否成功记录。例如: ``` 14:30:00.123 [http-nio-8080-exec-1] INFO com.example.controller.HomeController - Hello World [traceId: abcdef1234567890, spanId: 1234567890abcdef] ``` 通过这种方式,可以确保每个请求的日志都包含唯一的 trace ID,便于后续排查问题。 ### 总结 通过集成 Sleuth 和 Zipkin,并适当配置日志框架,可以在 Spring Cloud Gateway 中轻松实现请求日志流水号(trace ID)的追踪功能[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值