本文目录导读:

Brave分布式链路追踪集成指南
Brave是一个Java库,用于实现分布式追踪,它实现了OpenZipkin的API规范,下面是完整的集成指南:
基础依赖配置
Maven依赖
<!-- Brave核心库 -->
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave</artifactId>
<version>5.13.9</version>
</dependency>
<!-- 自动配置Spring集成 -->
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-spring-beans</artifactId>
<version>5.13.9</version>
</dependency>
<!-- HTTP集成 -->
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-http</artifactId>
<version>5.13.9</version>
</dependency>
<!-- Servlet集成 -->
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-servlet</artifactId>
<version>5.13.9</version>
</dependency>
<!-- Spring Web集成 -->
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-spring-web</artifactId>
<version>5.13.9</version>
</dependency>
<!-- 数据传输 -->
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-sender-okhttp3</artifactId>
<version>2.16.3</version>
</dependency>
<!-- Kafka传输(可选) -->
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-sender-kafka</artifactId>
<version>2.16.3</version>
</dependency>
核心配置实现
1 基础配置类
import brave.Tracing;
import brave.http.HttpTracing;
import brave.propagation.CurrentTraceContext;
import brave.propagation.ThreadLocalCurrentTraceContext;
import brave.sampler.Sampler;
import zipkin2.reporter.AsyncReporter;
import zipkin2.reporter.okhttp3.OkHttpSender;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BraveTracingConfig {
@Bean
public Tracing tracing() {
return Tracing.newBuilder()
.localServiceName("your-service-name")
.spanReporter(spanReporter())
.sampler(Sampler.ALWAYS_SAMPLE) // 采样率配置
.currentTraceContext(ThreadLocalCurrentTraceContext.create())
.build();
}
@Bean
public HttpTracing httpTracing(Tracing tracing) {
return HttpTracing.create(tracing);
}
private AsyncReporter spanReporter() {
OkHttpSender sender = OkHttpSender.create("http://localhost:9411/api/v2/spans");
return AsyncReporter.create(sender);
}
}
2 Spring Boot自动配置
# application.yml
brave:
service-name: your-service-name
zipkin:
base-url: http://localhost:9411
sampler:
probability: 1.0 # 采样率:0~1,1表示100%采样
常用组件集成
1 SQL数据库集成
// Maven依赖
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-jdbc</artifactId>
<version>5.13.9</version>
</dependency>
// 配置JdbcTracing
import brave.Span;
import brave.Tracing;
import brave.jdbc.JdbcTracing;
import javax.sql.DataSource;
@Bean
public DataSource dataSource(Tracing tracing) {
// 普通数据源
DataSource realDataSource = createDataSource();
// 包装为追踪数据源
JdbcTracing jdbcTracing = JdbcTracing.create(tracing);
return jdbcTracing.wrap(realDataSource);
}
2 HTTP客户端集成
// OkHttp集成
import brave.okhttp3.TracingInterceptor;
import okhttp3.OkHttpClient;
@Bean
public OkHttpClient okHttpClient(HttpTracing httpTracing) {
return new OkHttpClient.Builder()
.addInterceptor(TracingInterceptor.create(httpTracing))
.build();
}
// RestTemplate集成
import brave.spring.web.TracingClientHttpRequestInterceptor;
import org.springframework.web.client.RestTemplate;
@Bean
public RestTemplate restTemplate(HttpTracing httpTracing) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(
Collections.singletonList(
TracingClientHttpRequestInterceptor.create(httpTracing)
)
);
return restTemplate;
}
3 消息队列集成
// RabbitMQ集成
import brave.spring.rabbit.SpringRabbitTracing;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
@Bean
public SpringRabbitTracing rabbitTracing(Tracing tracing) {
return SpringRabbitTracing.create(tracing);
}
@Bean
public RabbitTemplate rabbitTemplate(SpringRabbitTracing rabbitTracing) {
RabbitTemplate template = new RabbitTemplate();
rabbitTracing.setTracing(template);
return template;
}
// Kafka集成
import brave.kafka.clients.KafkaTracing;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
@Bean
public KafkaTracing kafkaTracing(Tracing tracing) {
return KafkaTracing.create(tracing);
}
@Bean
public Producer<String, String> kafkaProducer(KafkaTracing tracing) {
Producer<String, String> producer = createKafkaProducer();
return tracing.producer(producer);
}
自定义Span创建
1 在业务代码中使用
import brave.Span;
import brave.Tracer;
import brave.Tracing;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BusinessService {
@Autowired
private Tracing tracing;
@Autowired
private Tracer tracer;
public void businessMethod(String orderId) {
// 创建自定义Span
Span span = tracer.nextSpan()
.name("process-order")
.tag("order.id", orderId)
.start();
try {
// 执行业务逻辑
processOrder(orderId);
// 添加自定义注解
span.annotate("order.processed");
} catch (Exception e) {
span.error(e);
throw e;
} finally {
span.finish();
}
}
private void processOrder(String orderId) {
// 嵌套Span示例
Span subSpan = tracer.nextSpan()
.name("validate-order")
.tag("order.id", orderId)
.start();
try {
// 子任务逻辑
Thread.sleep(100);
} finally {
subSpan.finish();
}
}
}
2 上下文传播
import brave.propagation.CurrentTraceContext;
import brave.propagation.TraceContext;
@Service
public class ContextPropagationService {
@Autowired
private Tracing tracing;
public void executeAsync(Runnable task) {
// 获取当前上下文
TraceContext context = tracing.currentTraceContext().get();
// 在新线程中传递上下文
executorService.submit(() -> {
try (CurrentTraceContext.Scope scope =
tracing.currentTraceContext().newScope(context)) {
task.run();
}
});
}
}
自定义标签与注解
1 添加业务标签
import brave.Span;
import brave.Tracer;
@Service
public class TracingTagService {
@Autowired
private Tracer tracer;
public void addCustomTags(String userId, String operation) {
Span span = tracer.currentSpan();
if (span != null) {
span.tag("user.id", userId);
span.tag("operation.type", operation);
span.tag("environment", System.getProperty("spring.profiles.active"));
}
}
}
2 错误追踪
import brave.Span;
import brave.Tracer;
@Component
public class ErrorTracingAspect {
@Autowired
private Tracer tracer;
@Around("@annotation(org.springframework.web.bind.annotation.ExceptionHandler)")
public Object traceException(ProceedingJoinPoint pjp) throws Throwable {
try {
return pjp.proceed();
} catch (Exception e) {
Span span = tracer.currentSpan();
if (span != null) {
span.error(e);
span.tag("error.code", getErrorCode(e));
span.tag("error.type", e.getClass().getName());
}
throw e;
}
}
}
性能优化与最佳实践
1 采样策略配置
import brave.sampler.RateLimitingSampler;
import brave.sampler.Sampler;
@Bean
public Sampler sampler() {
// 每秒限制100个span
return RateLimitingSampler.create(100);
// 或者按比例采样
// return Sampler.create(0.1f); // 10%采样率
}
2 Span优化
// 避免过多标签
Span span = tracer.nextSpan()
.name("api-request")
.tag("endpoint", "users") // 不要用动态URL
.tag("method", "GET")
.start();
// 使用注解代替大量标签
span.annotate("cache.miss");
span.annotate("db.query");
完整配置示例
import brave.Tracing;
import brave.http.HttpTracing;
import brave.propagation.CurrentTraceContext;
import brave.propagation.ThreadLocalCurrentTraceContext;
import brave.sampler.Sampler;
import brave.spring.web.TracingClientHttpRequestInterceptor;
import brave.spring.webmvc.SpanCustomizingHandlerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class FullBraveConfig implements WebMvcConfigurer {
@Bean
public Tracing tracing() {
return Tracing.newBuilder()
.localServiceName("user-service")
.spanReporter(AsyncReporter.create(
OkHttpSender.create("http://zipkin:9411/api/v2/spans")))
.sampler(Sampler.ALWAYS_SAMPLE)
.currentTraceContext(ThreadLocalCurrentTraceContext.create())
.build();
}
@Bean
public HttpTracing httpTracing(Tracing tracing) {
return HttpTracing.create(tracing);
}
@Bean
public RestTemplate restTemplate(HttpTracing httpTracing) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(
List.of(TracingClientHttpRequestInterceptor.create(httpTracing))
);
return restTemplate;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 自动为所有Controller添加追踪
registry.addInterceptor(SpanCustomizingHandlerInterceptor.create());
}
}
验证与调试
1 日志配置
logging:
level:
brave: DEBUG
zipkin: DEBUG
2 测试配置
@TestConfiguration
public class TestTracingConfig {
@Bean
public Tracing tracing() {
return Tracing.newBuilder()
.localServiceName("test-service")
.spanReporter(span -> {
// 打印到控制台
System.out.println("Span: " + span);
})
.build();
}
}
这个集成指南涵盖了Brave的主要功能,你可以根据实际需求选择合适的组件进行集成,分布式追踪的目的是帮助你理解系统行为,而不是增加不必要的开销,合理配置采样率非常重要。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播