有同学提问,使用的Spring Boot框架,有两个微服务,为了实现追踪,使用了<artifactId>spring-cloud-sleuth-zipkin</artifactId>以及zipkin。A服务是生产者,通过RabbitMQ broker发送消息。B服务是消费者,使用了@RabbitListener。想实现将traceId(包含span详情)从A服务传递到B服务,但无法将zipkin与RabbitMQ集成并实现追踪传播。这个该怎么实现呢?
要实现Spring Boot微服务通过RabbitMQ传递Zipkin追踪信息(traceId、spanId等),需要正确配置Sleuth和Zipkin,并在消息中携带追踪上下文。
以下是详细步骤:
1. 添加依赖
在两个服务的pom.xml中添加以下依赖:
<!-- Spring Cloud Sleuth + Zipkin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<!-- RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>2. 配置文件
A服务(生产者)和B服务(消费者)的application.yml配置相同:
spring:
application:
name: 服务名# A服务填"service-a",B服务填"service-b"
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
sleuth:
sampler:
probability: 1.0# 开发环境全量采样,生产环境可调整
baggage:
remote-fields: x-b3-traceid, x-b3-spanid, x-b3-parentspanid, x-b3-sampled# 传递的追踪字段
correlation-fields: x-b3-traceid, x-b3-spanid
zipkin:
base-url: http://localhost:9411# Zipkin服务器地址3. 生产者(A服务)代码:
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProducerController {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/send")
public String sendMessage() {
String message = "Hello from Service A";
//发送消息到RabbitMQ,Sleuth会自动在消息头中添加追踪信息
rabbitTemplate.convertAndSend("test-exchange", "test.routing.key", message);
return "Message sent: " + message;
}
}4. 消费者(服务 B)代码
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import brave.Tracer;
@Component
public class Consumer {
//注入Tracer可手动获取当前追踪信息
private final Tracer tracer;
public Consumer(Tracer tracer) {
this.tracer = tracer;
}
@RabbitListener(queues = "test-queue")
public void receiveMessage(String message) {
//消费消息时,Sleuth会自动从消息头中提取追踪信息
String traceId = tracer.currentSpan().context().traceIdString();
String spanId = tracer.currentSpan().context().spanIdString();
System.out.println("Received message: " + message);
System.out.println("TraceId: " + traceId + ", SpanId: " + spanId);
}
}5. RabbitMQ配置(两个服务都需要)
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public Queue queue() {
return new Queue("test-queue", true);
}
@Bean
public TopicExchange exchange() {
return new TopicExchange("test-exchange");
}
@Bean
public Binding binding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("test.routing.key");
}
}6. 启动Zipkin服务器
使用 Docker 启动 Zipkin:
docker run -d -p 9411:9411 openzipkin/zipkin7. 验证追踪
1.启动RabbitMQ、Zipkin、A服务和B服务。
2.访问A服务的接口:http://localhost:服务A端口/send。
3.查看B服务的控制台,会输出与A服务相同的traceId。
4.访问Zipkin控制台(http://localhost:9411),可看到完整的调用链路。
关键原理
1.Spring Cloud Sleuth会自动在RabbitMQ消息头中添加X-B3-TraceId、X-B3-SpanId等追踪字段。
2.消费者接收消息时,Sleuth会从消息头中提取这些字段,实现追踪上下文的传递。
3.无需手动处理追踪信息,Sleuth与 RabbitMQ的集成是自动完成的。
如果仍有问题,可检查:
1.依赖版本是否兼容(可改为使用Spring Cloud最新稳定版)。
2.RabbitMQ是否正常运行,消息能否正常发送/接收。
3.Zipkin服务器地址是否正确配置。
有同学在问,微信公众号,可以获取微信用户的手机号吗?答案是肯定的,当然可以!但是,因为现在越来越注重用户隐私以及数据收集,微信公众号是不能直接任意获取用户手机号的,获取用户的手机号码,也不是任意微信公众号都可以做到的,有一定的要求和限制...
mui的toast默认是在底部的,并且没有参数设置位置,经过研究发现可以通过修改css的方式设置位置,具体方法如下:1.mui toast设置type为divmui.toast('hello', { type: '...
微信公众号可以把官网的网页集成进去吗?想通过微信公众号实现打开公司网站的页面,具体要怎么实现呢?其实这个功能,可以通过微信菜单的方式来实现...
今天有小伙伴问,请问丁老师可以实现扫二维码,自动选择支付方式吗?比如支付宝扫码就支付宝支付,微信扫码就微信支付,云闪付扫码就用云闪付银联支付。这种方式可以实现吗?答案是肯定的,这种扫码支付方式,不但可以实现,而且已经大范围的应用在了我们...
开源节流,控制生产成本,限制开销,是每个企业和单位都要采取的成本控制和管理措施。其中,人力成本是企业在经营中支出占比较大的一块。以IT信息化部门为例,一个负责企业软件系统运维的IT部门,至少需要配置3个员工,每个员工按照IT工程师3-5年工...
正确的USB连线,其次打开开发者选项、USB调试,这些都是老生常谈,就不说了。在确保以上操作无误后,如果还找不到真机,关闭IDE,然后去adb的目录下,即HBuilderX\plugins\launcher\tools\adbs,把adb....
在使用android studio打包app时,需要制作JKS证书,具体的命令如下:D:\Program Files\Java\jre1.8.0_301\bin keytool -genkey -v -keystore dlq6.jks -...
最近丁老师软件开发团队收到几个微信小程序二次开发的订单,客户想对他们现有的小程序进行版本迭代和功能升级,但是好多客户在提供资料时都表达不清楚,不是这个不知道就是那个不懂,今天丁老师就微信小程序二次开发,需要准备哪些资料以及流程等问题做一下介...