1. Spring Cloud Sleuth与Spring Cloud Gateway整合
- 引入依赖:在Spring Cloud Gateway项目的
pom.xml
中引入Spring Cloud Sleuth相关依赖,如spring-cloud-starter-sleuth
,确保项目能够使用Sleuth的功能。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
- 配置传递:在Gateway的过滤器中配置传递Sleuth的上下文信息,使链路追踪信息在请求转发过程中得以保留。可以通过自定义全局过滤器实现,如下示例:
import brave.Tracing;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Configuration
public class SleuthGatewayConfig {
private final Tracing tracing;
public SleuthGatewayConfig(Tracing tracing) {
this.tracing = tracing;
}
@Bean
public GlobalFilter sleuthHeaderFilter() {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
HttpHeaders headers = request.getHeaders();
brave.Span span = tracing.tracer().currentSpan();
if (span != null) {
headers.put(HttpHeaders.TRACE_ID, span.context().traceIdString());
headers.put(HttpHeaders.SPAN_ID, span.context().spanIdString());
}
ServerHttpRequest newRequest = request.mutate().headers(headers).build();
ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
return chain.filter(newExchange);
};
}
}
2. Spring Cloud Sleuth与Hystrix整合
- 引入依赖:在包含Hystrix的项目
pom.xml
中添加Spring Cloud Sleuth依赖,确保Hystrix能感知Sleuth的链路上下文。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
- 配置整合:通过配置Hystrix的
HystrixConcurrencyStrategy
来传递Sleuth的上下文。自定义一个策略类,示例如下:
import brave.Tracing;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.strategy.HystrixPlugins;
import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy;
import com.netflix.hystrix.strategy.eventnotifier.HystrixEventNotifier;
import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook;
import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisher;
import com.netflix.hystrix.strategy.properties.HystrixPropertiesStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SleuthHystrixConfig {
@Autowired
private Tracing tracing;
@Bean
public HystrixConcurrencyStrategy hystrixConcurrencyStrategy() {
return new SleuthAwareHystrixConcurrencyStrategy(tracing);
}
@Bean
public void registerHystrixConcurrencyStrategy() {
HystrixPlugins.getInstance().registerConcurrencyStrategy(hystrixConcurrencyStrategy());
}
static class SleuthAwareHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
private final Tracing tracing;
public SleuthAwareHystrixConcurrencyStrategy(Tracing tracing) {
this.tracing = tracing;
}
@Override
public <T> Callable<T> wrapCallable(Callable<T> callable) {
brave.Span span = tracing.tracer().currentSpan();
if (span != null) {
return () -> {
try (brave.Tracer.SpanInScope ws = tracing.tracer().withSpanInScope(span)) {
return callable.call();
}
};
}
return callable;
}
}
}
3. 整合过程中可能遇到的问题
- 性能问题:过多的链路追踪信息传递和处理可能导致性能下降,特别是在高并发场景下,增加了系统的额外开销。
- 版本兼容性:Spring Cloud Sleuth、Spring Cloud Gateway和Hystrix不同版本之间可能存在兼容性问题,导致整合失败或功能异常。
- 配置复杂:不同组件的配置项繁多,整合时需要对每个组件的配置有深入理解,配置不当可能导致链路追踪不准确。
- 异步处理:在异步场景下,如Hystrix的异步执行,链路上下文传递可能出现丢失或错误,导致链路不完整。
4. 优化措施
- 性能优化:
- 采样率调整:通过配置Sleuth的采样率,减少不必要的链路追踪,如设置
spring.sleuth.sampler.probability=0.1
,表示10%的请求会被采样进行链路追踪。
- 异步优化:对于异步操作,使用异步上下文传播机制,确保链路上下文在异步任务中正确传递,例如使用
brave.context.slf4j.MDCScopeDecorator
。
- 版本管理:
- 仔细查阅官方文档,确定各个组件版本之间的兼容性列表,选择合适的版本组合。
- 关注社区更新和版本发布说明,及时更新组件版本以修复兼容性问题。
- 配置优化:
- 整理详细的配置文档,确保每个配置项的含义和作用清晰明确,便于团队成员维护和排查问题。
- 采用自动化配置工具或脚本,减少手动配置错误的可能性。
- 异步处理优化:
- 在异步任务启动时,手动传递链路上下文,例如在Hystrix的
wrapCallable
方法中传递当前的Sleuth Span上下文。
- 使用
brave.instrumentation.async.AsyncSpanFinishingTracer
来处理异步操作中的链路追踪,确保链路完整性。