全链路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)

大家都在看

  • zookeeper客户端之curator

    curator简介 curator是netflix公司开源的一个zk客户端 连接对象异步创建,需要开发人员自行编码等待 连接没有自动重连超时机制 watcher一次注册生效一次 不…

    Java 2023年6月8日
    093
  • Spring boot 处理 error 的套路

    Spring boot 处理 error 的基本流程: Controller -> 发生错误 -> BasicErrorController -> 根据 @Req…

    Java 2023年5月30日
    072
  • Java Excel 文件导出导入

    1 import com.fasterxml.jackson.databind.exc.InvalidFormatException; 2 import com.sensetime…

    Java 2023年5月29日
    072
  • Canal高可用架构部署

    一、前言 canal 是阿里的一款开源项目,纯 Java 开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了 MySQL(也支持 mariaDB)。 ca…

    Java 2023年6月6日
    082
  • HTML

    HTML5 一、标签 提示信息 placehod 锚链接: 顶部 回到顶部 空格:& nbsp; 序列 有序列表: java java 无序列表: java 自定义列表 d…

    Java 2023年6月8日
    082
  • 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之业务数据增删改查(七)

    基于Vue和Quasar的前端SPA项目实战之业务数据(七) 回顾 通过上一篇文章基于Vue和Quasar的前端SPA项目实战之表关系(六)的介绍,元数据设计功能全部实现了,本文主…

    Java 2023年6月6日
    087
  • spring 是如何注入对象的和bean 创建过程分析

    文章目录: 首先需要知道一个大致实现 这个注入过程肯定是在 BeanPostProcessor 中实现的 spring 是在 beanFactory.getBean 进行 bean…

    Java 2023年6月5日
    090
  • 注入属性文件的值

    按照以往的方式,我们总是直接把具体的字面量值填入代码进行字面量值的注入。如下所示: 可以看到Music定义了三个属性。其值直接填在代码里,由@Value注解注入。直觉告诉我们,这种…

    Java 2023年6月5日
    087
  • 就这么一个简单的校验,80%的程序员却做不到,更不理解!

    在学生管理系统里,其中会有学生信息采集的功能。程序结构不外乎下面的分层实现方式。 开发出来这个功能,我觉得大家都易如反掌了。 当然易如反掌。 OK,我要说的是数据校验,以最简单的非…

    Java 2023年6月15日
    081
  • Java Servlet(十二):Servlet、Listener、Filter之间的执行流程分析

    时隔几年后,看到本系列文章讲解的内容缺少了不少内容:周末无事分析了Spring Security是如何被集成到Web Servlet(SpringMVC)时,需要重新理清Filte…

    Java 2023年5月29日
    099
  • 【Git 系列】基础知识全集

    Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用 Git 来做自己的文档版本管理工具…

    Java 2023年6月5日
    068
  • 十四、集合(完结)

    十四、集合 14.1 集合的引入及好处 前面我们保存多个数据使用的是数组,那么数组有不足的地方,我们分析一下 14.1.1 数组的缺陷 数组的长度声明时候就固定好了,无法修改 数组…

    Java 2023年6月5日
    078
  • mybatis oracle批量插入保存

    1:XML脚本 <insert id="importExcel"> insert all <foreach collection="…

    Java 2023年5月30日
    079
  • 重写并自定义依赖的原生的Bean方法

    转载请注明出处: 在项目开发过程中,往往是直接应用很多jar包中依赖且声明好的Bean,拿来即用,但很多场景也需要对这些原生的Bean 进行自定义,定制化封装,这样在项目使用的过程…

    Java 2023年6月8日
    074
  • Java 包、包的编译

    Java 包 Java 采用包的概念来对相关的类进行管理。 包可以避免名称冲突,并且通过包名进行分类后,代码的维护性会有所提高。 包本质上就是一个个文件夹 以上都是 Java 的内…

    Java 2023年6月5日
    098
  • 模拟tomcat服务器,sun公司,webapp开发者

    模拟tomcat服务器,sun公司,webapp开发者 首先我们思考一下一个动态web应用需要哪些角色参与,角色与角色之间又有多少协议? 1.有4种角色,分别是(浏览器开发团队[如…

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