1. 程式人生 > >全鏈路spring cloud sleuth+zipkin

全鏈路spring cloud sleuth+zipkin

arc owa version public kafka 分享 cli self 兩個

http://blog.csdn.net/qq_15138455/article/details/72956232

一、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. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-stream-kafka</artifactId>
  8. </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. <!-- the first one dependency below,In principle, there is no need,beause sleuth-zipkin-stream 1.5.3 will Introduce zipkin version1.19 Automaticly,but 1.19 only support elasticsearch version 2.X -->
  2. <dependency>
  3. <groupId>io.zipkin.java</groupId>
  4. <artifactId>zipkin</artifactId>
  5. <version>1.24.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.cloud</groupId>
  9. <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-starter-stream-kafka</artifactId>
  14. </dependency>
  15. <dependency>
  16. <groupId>io.zipkin.java</groupId>
  17. <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
  18. <version>1.24.0</version>
  19. <optional>true</optional>
  20. </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. <span style="font-size:14px;">@SpringBootApplication
  2. //@EnableZipkinServer //this is used by interface receive trace info
  3. @EnableZipkinStreamServer //can be used kafka,rabbit
  4. public class ZkingApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ZkingApplication.class, args);
  7. }
  8. }</span>

五、Demo DownLoad

click me

技術分享

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
*/

全鏈路spring cloud sleuth+zipkin