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

大家都在看

  • [Java] 详细解说final关键字

    final final 可以修饰变量、方法和类,表示所修饰的内容一旦赋值之后就不会再被改变。例如 String类就是一个 final类型的类。 1.具体使用场景 1.1 变量 1….

    Java 2023年6月5日
    095
  • 22条API设计的最佳实践

    曾经因为一个糟糕的API而感到沮丧吗? 在这个微服务的世界里,后端API的一致性设计是必不可少的。 今天,我们将讨论一些可遵循的最佳实践。我们将保持简短和甜蜜——所以系好安全带,出…

    Java 2023年6月5日
    080
  • Golang中的闭包

    一、全局变量和局部变量的特点 1.全局变量:定义在全局中,常驻内存,可能会污染全局。 2.局部变量:定义在方法中,不常驻内存,不污染全局。 3.闭包的作用:使变量常驻内存且不污染全…

    Java 2023年6月13日
    083
  • Java 基本数据类型 sizeof 功能

    这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字。 实现的想法是这样的:java…

    Java 2023年5月29日
    086
  • webStorage的分类及使用

    相关API: xxxStorage.setItem(‘key’, ‘value’); 该方法接受一个键和值作为参数,会把键值对添加到…

    Java 2023年6月13日
    077
  • Java SE 多态

    多态数组:数组的定义类型为父类类型,里面保存的实际元素类型为子类类型 public class PloyArray { public static void main(String…

    Java 2023年6月7日
    0185
  • Spring框架完整学习!!!

    1.Spring 1.1、简介 1.2、优点 1.3、组成 1.4、拓展 2.IOC思想解析 2.1、场景模拟 2.2、概念解析 2.3、总结 3.初涉Spring 3.1、 基础…

    Java 2023年6月8日
    0117
  • Sharepoint 高级筛选

    先看看效果吧………….. 默认情况下:不做任何筛选. 添加一个筛选条件: 条件:如果是int类型那么可以有> < = 等…

    Java 2023年6月7日
    0110
  • 0008绩效工资管理系统-java毕设

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年5月29日
    091
  • crudapi增删改查接口零代码产品成功案例之金茶王投票系统

    crudapi增删改查接口零代码产品成功案例之金茶王投票系统 简介 2020年由于疫情原因,金茶王投票活动改成线上云投票,所以需要一套投票系统进行比赛。参赛选手包括两种类型,分别为…

    Java 2023年6月6日
    0105
  • 标准输出流与日志文件

    一、PrintStream 标准的字节输出流,默认输出到控制台 1.构造方法 PrintStream(File file) 使用指定的文件创建一个新的打印流,而不需要自动换行。 P…

    Java 2023年6月9日
    077
  • python协程–asyncio模块(基础并发测试)

    在高并发的场景下,python提供了一个多线程的模块threading,但似乎这个模块并不近人如意,原因在于cpython本身的全局解析锁(GIL)问题,在一段时间片内实际上的执行…

    Java 2023年6月14日
    077
  • Spring(三)——AOP

    (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(2)通俗描述:不通过…

    Java 2023年6月16日
    067
  • 常用命令

    tcpdump 获取80 端口 http请求内容 tcpdump ‘tcp port 80 and (((ip[2:2] – ((ip[0]&0xf)<>2))…

    Java 2023年6月16日
    066
  • java项目命令启动 JAVA-jar包运行及日志输出

    一般情况下运行jar包,当前是可运行的jar包,直接命令 java -jar common.jar按下ctrl+C ,关闭当前ssh或者直接关闭窗口,当前程序都会退出。 我们在命令…

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