全鏈路spring cloud sleuth+zipkin

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

 

1、About ZipKinmysql

please googleweb

2、 Demo Scenespring




3、 Result Display
sql


4、Preparejson

一、soft versionapi

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

二、installapp

kafka+zookeeper
elasticsearch
rabbit mq
mysql

三、create four spring cloud projectelasticsearch

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.

四、configuration

4.一、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.二、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>  

 

5、Demo DownLoad

click me

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

 

6、補充

若是kafka沒有啓動,spring boot會啓動失敗,這個異常處理設計的真是缺德

/** * 一、修改背景  * 因kafka節點沒有啓動 在spring boot啓動時初始化outputBindingLifecycle、inputBindingLifecycle * 兩個bean時候鏈接kafka失敗,向外拋出了異常直到EmbeddedWebApplicationContext類 * 捕獲處理,處理方式爲:stopAndReleaseEmbeddedServletContainer()致使整個應用中止啓動  * 二、修改方案 * 干預上面兩個bean的初始化,在鏈接kafka異常時,將異常處理掉,不向上層拋出 * 三、修改步驟 * 3.一、使用自定義MyBindingLifecycle的bean將BindingServiceConfiguration中的兩個bean初始化替換掉 * 3.二、在自定bean中啓動線程MyBindingThread來控制兩個bean的初始化 * 四、解決啓動問題以後,實際上kafka仍是沒有鏈接的,此時向kafka發送span時會失敗,默認的處理方案是捕獲到異常以後使用 *   handleError處理,再次發送新的span,這就致使循環發送 *   參見:ErrorHandlingTaskExecutor中的execute方法 *   catch (Throwable t)  *   { *        ErrorHandlingTaskExecutor.this.errorHandler.handleError(t); *     } * 五、解決方案 * 重寫ErrorHandler的handleError方法 * 六、跟蹤代碼發現 * 跟蹤發現ErrorHandler對線對象是在SourcePollingChannelAdapterFactoryBean初始化時候設置的 * spca.setErrorHandler(this.pollerMetadata.getErrorHandler()); * 進一步發現是在pollerMetadata對象中,因此須要在pollerMetadata對象初始化時候作修改 * 七、修改步驟 * 自定義MyPollerMetadata且須要@Configuration,重寫handleError方法以下 * @author zhangdingxin、yangxi */

相關文章
相關標籤/搜索