从RabbitMQ迁移至Kafka时Spring Cloud Sleuth依赖异常问题
解决从RabbitMQ迁移到Kafka后启用spring-cloud-sleuth-stream的异常问题
刚从RabbitMQ转到Kafka,启用spring-cloud-sleuth-stream就出问题?这种场景我碰到过好几次,大概率是绑定器冲突、配置没更新或者版本兼容性的锅,咱们一步步来排查:
1. 先搞定依赖冲突问题
Sleuth Stream默认会拉取RabbitMQ的绑定器依赖,这和你现在用Kafka的场景完全冲突。赶紧检查Gateway和CloudStream服务的pom.xml:
- 必须引入Kafka的Stream绑定器
- 排除Sleuth Stream自带的Rabbit绑定器
举个依赖配置的例子:
<!-- Sleuth Stream 依赖,排除默认的Rabbit绑定器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-stream</artifactId> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入Kafka Stream绑定器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-kafka</artifactId> </dependency>
2. 更新配置文件,彻底切换到Kafka配置
不管是Gateway还是CloudStream的application.yml,都要把Stream相关配置从RabbitMQ切换到Kafka:
CloudStream服务配置示例:
spring: cloud: stream: kafka: binder: brokers: localhost:9092 # 替换成你的Kafka集群地址 auto-create-topics: true # 测试环境可开启自动创建主题,生产建议提前手动创建 bindings: # 对应Sleuth Stream的输出绑定,名称要和Sleuth配置对齐 sleuthOutput: destination: sleuth-trace-topic content-type: application/json
Gateway服务配置示例:
spring: sleuth: stream: enabled: true # 确认Sleuth Stream已经启用 cloud: stream: kafka: binder: brokers: localhost:9092 # 和CloudStream使用同一个Kafka地址
3. 验证请求头与Sleuth上下文传递
你测试时需要携带foo和bar请求头,要确保这些头能被正确传递,同时Sleuth的Trace上下文也能跟着流转。可以在Gateway的处理方法里加日志,确认请求头和TraceId是否正常:
@GetMapping("/to_uppercase/{input}") public Mono<String> toUppercase(@PathVariable String input, @RequestHeader Map<String, String> headers) { // 打印请求头和当前TraceId,验证上下文是否正常生成 log.info("Incoming request headers: {}, Trace ID: {}", headers, TraceContextHolder.getTraceContext().traceId()); // 调用下游服务时要把请求头完整传递 return webClient.get() .uri("http://cloud-stream-service/process/" + input) .headers(h -> h.setAll(headers)) .retrieve() .bodyToMono(String.class); }
4. 针对常见异常的快速排查
如果还是报错,先看异常栈信息,对应解决:
- 连接失败:大概率是还在尝试连接RabbitMQ的5672端口,说明依赖没排除干净或者配置没更新
- 主题不存在:要么开启Kafka自动创建主题,要么手动创建对应的sleuth主题
- 序列化异常:确认Stream的
content-type设置为application/json,Sleuth的Span需要正确序列化才能在Kafka中传输
5. 版本兼容性不能忽略
最后要注意:Spring Cloud、Sleuth、Stream和Kafka绑定器的版本必须严格匹配。比如用Spring Cloud 2022.0.x(Kilburn)系列,对应的Sleuth Stream和Kafka绑定器也要用同一系列的版本,别跨版本组合导致初始化异常。
内容的提问来源于stack exchange,提问作者Keith Bennett
相关产品推荐
相关产品推荐

