全链路spring cloud sleuth+zipkin

一、About ZipKin

please google

二、 Demo Scene

三、 Result Display

四、Prepare

1、soft version

kafka:2.10-0.10.2.0

zokeeper:3.4.10

elasticsearch:5.2.2

jdk:1.8

spring boot:1.5.3.RELEASE

sprign cloud:Dalston.RELEASE

rabbit mq:3.6.9

2、install

kafka+zookeeper

elasticsearch

rabbit mq

mysql

3、create four spring cloud project

web-api、user-api、order-api、zipkin

ps:

why i will create zipkin project use spring boot by myself not use zipkin.jar from http://zipkin.io/,actually,zipkin.jar is a spring boot project,check it’s dependency lib you will find it din’t use spring-cloud-sleuth-stream,but i will send trace info to kafka for zipkin server collector ,so i must use spring-cloud-sleuth-stream in my service

and the message send to kafka is a sleuth.span object and use kafka default serialized,but zipkin.jar only receive zipkin.span and json or thrift encode,so it’s not matching,That’s the reason i create zipkin server

but if you use rabbit mq,that’s no problem.

4、configuration
4.1、the service web-api、user-api、order-api config part like:
pom.xml

[html] view plain copy

  1. org.springframework.cloud groupId >
  2. spring-cloud-sleuth-zipkin-stream artifactId >
  3. dependency >
  4. org.springframework.cloud groupId >
  5. spring-cloud-starter-stream-kafka artifactId >
  6. dependency >

application.properties
[html] view plain copy

  1. spring.sleuth.sampler.percentage=1.0
  2. spring.cloud.stream.kafka.binder.brokers=10.20.1.11:9092,10.20.1.12:9092
  3. spring.cloud.stream.kafka.binder.zkNodes=10.20.1.11:2181,10.20.1.12:2181

4.2、the zipkinconfig part like:

pom.xml

[html] view plain copy

  1. io.zipkin.java groupId >
  2. zipkin artifactId >
  3. 1.24.0 version >
  4. dependency >
  5. org.springframework.cloud groupId >
  6. spring-cloud-sleuth-zipkin-stream artifactId >
  7. dependency >
  8. org.springframework.cloud groupId >
  9. spring-cloud-starter-stream-kafka artifactId >
  10. dependency >
  11. io.zipkin.java groupId >
  12. zipkin-autoconfigure-storage-elasticsearch-http artifactId >
  13. 1.24.0 version >
  14. true optional >
  15. dependency >

application.properties

[html] view plain copy

  1. kafka config

  2. spring.sleuth.enabled=false
  3. spring.sleuth.sampler.percentage=1.0
  4. spring.cloud.stream.kafka.binder.brokers=10.20.1.11:9092,10.20.1.12:9092
  5. spring.cloud.stream.kafka.binder.zkNodes=10.20.1.11:2181,10.20.1.12:2181
  6. elasticsearch config

  7. zipkin.storage.type=elasticsearch
  8. zipkin.storage.elasticsearch.hosts=10.20.1.11:9200,10.20.1.12:9200
  9. zipkin.storage.elasticsearch.cluster=elasticsearch
  10. zipkin.storage.elasticsearch.index=zipkin
  11. zipkin.storage.elasticsearch.index-shards=5
  12. zipkin.storage.elasticsearch.index-replicas=1

ZipKin Server Startup class configuration

[java] view plain copy

  1. “font-size:14px;”>@SpringBootApplication
  2. @EnableZipkinStreamServer
  3. public class ZkingApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ZkingApplication.class, args);
  6. }
  7. }

五、Demo DownLoad

click me

全链路spring cloud sleuth+zipkin

by the way,spring cloud is a pretty boy,i like its combination of terseness and elegance

六、补充

如果kafka没有启动,spring boot会启动失败,这个异常处理设计的真是缺德

/*
* 1、修改背景
* 因kafka节点没有启动 在spring boot启动时初始化outputBindingLifecycle、inputBindingLifecycle
* 两个bean时候连接kafka失败,向外抛出了异常直到EmbeddedWebApplicationContext类
* 捕获处理,处理方式为:stopAndReleaseEmbeddedServletContainer()导致整个应用停止启动
* 2、修改方案
* 干预上面两个bean的初始化,在连接kafka异常时,将异常处理掉,不向上层抛出
* 3、修改步骤
* 3.1、使用自定义MyBindingLifecycle的bean将BindingServiceConfiguration中的两个bean初始化替换掉
* 3.2、在自定bean中启动线程MyBindingThread来控制两个bean的初始化
* 4、解决启动问题之后,实际上kafka还是没有连接的,此时向kafka发送span时会失败,默认的处理方案是捕获到异常之后使用
* handleError处理,再次发送新的span,这就导致循环发送
* 参见:ErrorHandlingTaskExecutor中的execute方法
* catch (Throwable t)
* {
* ErrorHandlingTaskExecutor.this.errorHandler.handleError(t);
* }
* 5、解决方案
* 重写ErrorHandler的handleError方法
* 6、跟踪代码发现
* 跟踪发现ErrorHandler对线对象是在SourcePollingChannelAdapterFactoryBean初始化时候设置的
* spca.setErrorHandler(this.pollerMetadata.getErrorHandler());
* 进一步发现是在pollerMetadata对象中,所以需要在pollerMetadata对象初始化时候做修改
* 7、修改步骤
* 自定义MyPollerMetadata且需要@Configuration,重写handleError方法如下
* @author zhangdingxin、yangxi
/

Original: https://www.cnblogs.com/danghuijian/p/7472981.html
Author: dhj
Title: 全链路spring cloud sleuth+zipkin

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541930/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球