我有两个非常简单的spring-cloud-stream应用程序。消息生成器Service3通过binder-kafka向消费者Service4发送消息。
我使用spring-cloud-sleuth来追踪它们之间的跨度。但是只有zip3服务器中的Service3中有跨度。 Service4没有跨度显示。
服务3
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.springframework.cloud:spring-cloud-starter-sleuth')
// Marshal spans over a Spring cloud stream binder
compile('org.springframework.cloud:spring-cloud-sleuth-stream')
compile('org.springframework.cloud:spring-cloud-stream-binder-kafka')
testCompile group: 'junit', name: 'junit', version: '4.11'
}
@SpringBootApplication
public class Service3 {
public static void main(String[] args) {
SpringApplication.run(Service3.class, args);
}
}
@Controller
@EnableBinding(Source.class)
public class WebController {
@Autowired
private Source source;
@GetMapping("/srv4")
private String getSrv4Info(){
String msg = "Hello Service 4";
this.source.output().send(MessageBuilder.withPayload(msg).build());
return "srv4";
}
}
服务4
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.cloud:spring-cloud-starter-sleuth')
// Marshal spans over a Spring cloud stream binder
compile('org.springframework.cloud:spring-cloud-sleuth-stream')
compile('org.springframework.cloud:spring-cloud-sleuth-zipkin-stream')
compile('org.springframework.cloud:spring-cloud-stream-binder-kafka')
runtime('io.zipkin.java:zipkin-autoconfigure-ui')
testCompile group: 'junit', name: 'junit', version: '4.11'
}
@SpringBootApplication
@EnableZipkinStreamServer
public class Service4 {
public static void main(String[] args) {
SpringApplication.run(Service4.class, args);
}
}
@EnableBinding(Sink.class)
public class MsgReceiver {
@StreamListener(Sink.INPUT)
private void listen(Message<String> msg){
System.out.println(msg.getPayload());
}
}
Servic4 (message consumer) is not traced
我错过了什么?
答案 0 :(得分:0)
这是猜测。
Kafka没有消息标题的概念(存储跨度的地方)。
因此,SCSt必须在有效负载中嵌入消息头。当前版本要求您选择&#34;选择加入&#34;你希望以这种方式传输哪些标题。
spring.cloud.stream.kafka.binder.headers
将由活页夹传输的自定义标头列表。
默认值:空。
不幸的是,目前不支持模式,您必须单独列出标题。我们considering adding support for patterns和/或默认传输所有标头。
答案 1 :(得分:0)
最后,我发现了与我的应用程序相关的2个问题。 1.无法跟踪@EnalbeZipkinStreamServer的应用程序。这看起来像是一个设计。 2.如果将kafka用作绑定程序,则应用程序应将标题指定为以下内容:
class Apod
def self.get_apod_info
apod_url = "https://api.nasa.gov/planetary/apod?api_key=#{ENV['NASA_API_KEY']}"
response = Net::HTTP.get(URI(apod_url))
JSON.parse(response)
end
end