Spring Cloud sleuth with zipkin over RabbitMQ demo

本项目是sleuth和zipkin在spring cloud环境中使用,其中sleuth和zipkin是通过RabbitMQ进行通信,同时zipkin的数据是存储在mysql中。

Spring Cloud的版本是目前最新的Greenwich.SR2版本,对应的Spring boot是2.1.8.RELEASE。

本教程要解决的问题:

  1. zipkin server的搭建(基于mysql和rabbitMQ)
  2. 客户端环境的依赖
  3. 如何调用

zipkin server的搭建(基于mysql和rabbitMQ)

最新的zipkin官网建议使用zipkin提供的官方包来启动zipkin server。 步骤如下:

  1. 下载最新的zipkin server jar包:

    curl -sSL https://zipkin.io/quickstart.sh | bash -s

  2. 配置环境变量,并启动zipkin server,见startServer.sh:

  1. #!/bin/bash
  2. #rabbit mq config
  3. export RABBIT_CONCURRENCY=1
  4. export RABBIT_CONNECTION_TIMEOUT=60000
  5. export RABBIT_QUEUE=zipkin
  6. export RABBIT_ADDRESSES=127.0.0.1:5672
  7. export RABBIT_PASSWORD=guest
  8. export RABBIT_USER=guest
  9. export RABBIT_VIRTUAL_HOST=zipkin
  10. export RABBIT_USE_SSL=false
  11. #mysql config
  12. export STORAGE_TYPE=mysql
  13. export MYSQL_DB=zipkin
  14. export MYSQL_USER=root
  15. export MYSQL_PASS=123456
  16. export MYSQL_HOST=127.0.0.1
  17. export MYSQL_TCP_PORT=3306
  18. export MYSQL_MAX_CONNECTIONS=10
  19. export MYSQL_USE_SSL=false
  20. nohup java -jar zipkin.jar &
  21. echo $! > pid.txt

请将rabbit mq 和 mysql 的配置修改成你对应的环境变量。

  1. mysql数据库脚本:

官方脚本地址

这里我也列出来了:

  1. --
  2. -- Copyright 2015-2019 The OpenZipkin Authors
  3. --
  4. -- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
  5. -- in compliance with the License. You may obtain a copy of the License at
  6. --
  7. -- http://www.apache.org/licenses/LICENSE-2.0
  8. --
  9. -- Unless required by applicable law or agreed to in writing, software distributed under the License
  10. -- is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
  11. -- or implied. See the License for the specific language governing permissions and limitations under
  12. -- the License.
  13. --
  14. CREATE TABLE IF NOT EXISTS zipkin_spans (
  15. `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  16. `trace_id` BIGINT NOT NULL,
  17. `id` BIGINT NOT NULL,
  18. `name` VARCHAR(255) NOT NULL,
  19. `remote_service_name` VARCHAR(255),
  20. `parent_id` BIGINT,
  21. `debug` BIT(1),
  22. `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
  23. `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
  24. PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
  25. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
  26. ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
  27. ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
  28. ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
  29. ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
  30. CREATE TABLE IF NOT EXISTS zipkin_annotations (
  31. `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  32. `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
  33. `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
  34. `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
  35. `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
  36. `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
  37. `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
  38. `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
  39. `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
  40. `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
  41. `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
  42. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
  43. ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
  44. ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
  45. ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
  46. ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
  47. ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
  48. ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
  49. ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
  50. CREATE TABLE IF NOT EXISTS zipkin_dependencies (
  51. `day` DATE NOT NULL,
  52. `parent` VARCHAR(255) NOT NULL,
  53. `child` VARCHAR(255) NOT NULL,
  54. `call_count` BIGINT,
  55. `error_count` BIGINT,
  56. PRIMARY KEY (`day`, `parent`, `child`)
  57. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

在正式环境中,官方推荐的使用Elastricsearch做数据存储,因为zipkin收集的数据会比较多,使用mysql可能会有性能问题。后面有机会我们再讲怎么用Elastricsearch作数据存储。

  1. 运行 sh startServer.sh即可启动zipkin server.

客户端环境的依赖

如果想要在客户端使用sleuth+ rabbitMQ,需要如下配置:

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-dependencies</artifactId>
  6. <version>${release.train.version}</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>
  12. <dependency>
  13. <groupId>org.springframework.cloud</groupId>
  14. <artifactId>spring-cloud-starter-zipkin</artifactId>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.amqp</groupId>
  18. <artifactId>spring-rabbit</artifactId>
  19. </dependency>

本实例中我们使用了eureka, 其实它不是必须的。大家在实际使用中可以自己取舍。

我们看一下zipkin客户端的配置文件:

  1. spring:
  2. application:
  3. name: service2
  4. rabbitmq:
  5. host: localhost
  6. port: 5672
  7. username: guest
  8. password: guest
  9. virtual-host: zipkin
  10. zipkin:
  11. sender:
  12. type: rabbit
  13. rabbitmq:
  14. queue: zipkin
  15. sleuth:
  16. sampler:
  17. probability: 1.0

spring.application.name 很好理解,就是应用程序的名字,会被默认作为zipkin服务的名字。

我们使用rabbitMQ ,所以需要spring.rabbitmq的配置信息。

spring.zipkin.sender.type=rabbit 表示我们需要使用rabbit MQ来收集信息。当然你也可以设置成为web或者kafka。

这里spring.zipkin.rabbitmq.queue=zipkin表示使用MQ时候的queue名字,默认是zipkin。

spring.sleuth.sampler.probability=1.0 这个是采样信息,1.0表示是100%采集。如果要在线上使用,可以自定义这个百分比。

如何调用

最后我们看下如何调用。

在service2中,我们定义了如下的方法:

  1. @RestController
  2. @RequestMapping("/serviceTwo")
  3. public class ServiceTwoController {
  4. @GetMapping("callServiceTwo")
  5. public String callServiceOne(){
  6. log.info("service two is called!");
  7. return "service two is called!";
  8. }
  9. }

我们在service1中用restTemplet来调用它:

  1. @RestController
  2. @RequestMapping("/serviceOne")
  3. public class ServiceOneController {
  4. @GetMapping("callServiceOne")
  5. public String callServiceOne(){
  6. log.info("service one is called!");
  7. restTemplate().getForObject("http://localhost:9000/serviceTwo/callServiceTwo",String.class);
  8. return "service one and two are called!";
  9. }
  10. @Bean
  11. RestTemplate restTemplate() {
  12. return new RestTemplate();
  13. }
  14. }

这样,我们用get 去请求http://loalhost/serviceOne/callServiceOne 就会将调用信息发送到MQ,并被zipkin Server 处理。 我们就可以在zipkin web页面看到调用信息啦 。

have fun !

更多教程请参考 flydean的博客

Spring Cloud sleuth with zipkin over RabbitMQ教程的更多相关文章

  1. 跟我学SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    SpringCloud系列教程 | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪 Springboot: 2.1.6.RELEASE SpringCloud: ...

  2. Distributed traceability with Spring Cloud: Sleuth and Zipkin

    I. Sleuth 0. Concept Trace A set of spans that form a call tree structure, forms the trace of the re ...

  3. spring cloud 入门系列八:使用spring cloud sleuth整合zipkin进行服务链路追踪

    好久没有写博客了,主要是最近有些忙,今天忙里偷闲来一篇. =======我是华丽的分割线========== 微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单 ...

  4. Spring Cloud Sleuth 和 Zipkin 进行分布式跟踪使用指南

    分布式跟踪允许您跟踪分布式系统中的请求.本文通过了解如何使用 Spring Cloud Sleuth 和 Zipkin 来做到这一点. 对于一个做所有事情的大型应用程序(我们通常将其称为单体应用程序) ...

  5. springcloud --- spring cloud sleuth和zipkin日志管理(spring boot 2.18)

    前言 在spring cloud分布式架构中,系统被拆分成了许多个服务单元,业务复杂性提高.如果出现了异常情况,很难定位到错误位置,所以需要实现分布式链路追踪,跟进一个请求有哪些服务参与,参与的顺序如 ...

  6. springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...

  7. 【spring cloud】spring cloud Sleuth 和Zipkin 进行分布式链路跟踪

    spring cloud 分布式微服务架构下,所有请求都去找网关,对外返回也是统一的结果,或者成功,或者失败. 但是如果失败,那分布式系统之间的服务调用可能非常复杂,那么要定位到发生错误的具体位置,就 ...

  8. 使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    原文:http://www.cnblogs.com/ityouknow/p/8403388.html 随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成, ...

  9. spring cloud深入学习(十三)-----使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...

随机推荐

  1. 关于C#三层架构增删改查中的“查询”问题

    序:问题总是反复出现,可能只是一个小小的问题,但是就像肉中刺. 问题: 关于“姓名”字段的拼接问题 姓名字段的拼接:this.Repeater1.DataSource = db.GetList(&qu ...

  2. Vue引用阿里图标库

    首先进入官网http://www.iconfont.cn/ 转载:https://blog.csdn.net/qq_34802010/article/details/81451278 选择图标库 在里 ...

  3. 1018 Public Bike Management (30 分)

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  4. HTML5+CSS+JQuery 实现简单的进度条功能

    样式: <style type="text/css"> .processcontainer2{ width:450px; border:1px solid #6C9C2 ...

  5. USB2.0/YTPE-C音频芯片DP108T集成晶振替代DP108 CM108

    DP108T是一种高集成度的USB/YTPE-C音频芯片.嵌入了所有必要的模拟模块,包括双DAC 和音频驱动.麦克风增益器 .PLL.稳压器和 USB 收发器.此外,音频音量可以很容易地通过专门的 H ...

  6. Spring (六):整合Mybatis

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  7. 曹工说Redis源码(4)-- 通过redis server源码来理解 listen 函数中的 backlog 参数

    文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...

  8. C语言 生日快乐

    #include <stdio.h> #include <math.h> #include <stdlib.h> #define I 20 #define R 34 ...

  9. 36 Thread 多线程

    /* * 多线程的实现方式: * 方式1:一种方法是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例 * * Thread * Str ...

  10. Mysql fundamental knowledge

    Mysql 5.1, 5.5 are more stable than other versions. postgresql has more strict "sql standard &q ...