spring cloud Sleuth

spring cloud sleuth是日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。

首先,先弄清楚几个概念。

  Zipkin: 是 Twitter 的一个开源项目,允许开发者收集 Twitter 各个服务上的监控数据,并提供查询接口

  该系统让开发者可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。

spring cloud sleuth与zipkin的关系,sleuth集成了zipkin。

  zipkin的存储方式有多种,默认是保存在内存中,但是其不能持久保存,容器重启等一些其他情况可能导致数据的丢失,在本项目中,采用的保存到mysql数据库中。

  zipkin与sleuth集成中,数据存储方式有两种。一种是通过http,一种是通过绑定流,本项目为通过绑定rabbitmq消息流。

1、sleuth-server的建立

  1、pom引入

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>

        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq</artifactId>
            <version>3.8.2</version>
        </dependency>

前3个引入原因可以参考:https://github.com/spring-cloud/spring-cloud-sleuth

jooq指定版本号的引入,在过程中出现了一个 can‘t load 。。的错误。查询后给出的解答。

  2、配置文件

 

server:
  port: 9411

spring:
  application:
    name: zipkin-server

  datasource:
    schema: classpath:/mysql.sql
    url: jdbc:mysql://172.18.218.252:23306/zipkin?autoReconnect=true&useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    username: ***
    password: ****
    initialize: true
    continue-on-error: true
  sleuth:
    enabled: false

  rabbitmq:
    port: 5672
    host: rabbitmq
    username: ****
    password: ****

zipkin:
  storage:
      type: mysql

  3、类文件

  

@SpringBootApplication
@EnableZipkinServer
public class sleuthmqsqlApplication {
    public static void main(String[] args) {
        SpringApplication.run(sleuthmqsqlApplication.class, args);
    }
}

附上mysql.sql

建立mysql.sql的文件在resource目录下,插入一下内容

CREATE TABLE IF NOT EXISTS zipkin_spans (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT ‘If non zero, this means the trace uses 128 bit traceIds instead of 64 bit‘,
  `trace_id` BIGINT NOT NULL,
  `id` BIGINT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `parent_id` BIGINT,
  `debug` BIT(1),
  `start_ts` BIGINT COMMENT ‘Span.timestamp(): epoch micros used for endTs query and to implement TTL‘,
  `duration` BIGINT COMMENT ‘Span.duration(): micros used for minDuration and maxDuration query‘
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT ‘ignore insert on duplicate‘;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT ‘for joining with zipkin_annotations‘;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT ‘for getTracesByIds‘;
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT ‘for getTraces and getSpanNames‘;
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT ‘for getTraces ordering and range‘;

CREATE TABLE IF NOT EXISTS zipkin_annotations (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT ‘If non zero, this means the trace uses 128 bit traceIds instead of 64 bit‘,
  `trace_id` BIGINT NOT NULL COMMENT ‘coincides with zipkin_spans.trace_id‘,
  `span_id` BIGINT NOT NULL COMMENT ‘coincides with zipkin_spans.id‘,
  `a_key` VARCHAR(255) NOT NULL COMMENT ‘BinaryAnnotation.key or Annotation.value if type == -1‘,
  `a_value` BLOB COMMENT ‘BinaryAnnotation.value(), which must be smaller than 64KB‘,
  `a_type` INT NOT NULL COMMENT ‘BinaryAnnotation.type() or -1 if Annotation‘,
  `a_timestamp` BIGINT COMMENT ‘Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp‘,
  `endpoint_ipv4` INT COMMENT ‘Null when Binary/Annotation.endpoint is null‘,
  `endpoint_ipv6` BINARY(16) COMMENT ‘Null when Binary/Annotation.endpoint is null, or no IPv6 address‘,
  `endpoint_port` SMALLINT COMMENT ‘Null when Binary/Annotation.endpoint is null‘,
  `endpoint_service_name` VARCHAR(255) COMMENT ‘Null when Binary/Annotation.endpoint is null‘
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT ‘Ignore insert on duplicate‘;
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT ‘for joining with zipkin_spans‘;
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT ‘for getTraces/ByIds‘;
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT ‘for getTraces and getServiceNames‘;
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT ‘for getTraces‘;
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT ‘for getTraces‘;
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT ‘for dependencies job‘;

CREATE TABLE IF NOT EXISTS zipkin_dependencies (
  `day` DATE NOT NULL,
  `parent` VARCHAR(255) NOT NULL,
  `child` VARCHAR(255) NOT NULL,
  `call_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

2、客户端

  1、pom文件引入

  

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
        </dependency>

  绑定rabbit消息流

  2、配置文件

server:
  port: 9988
spring:
  application:
    name: clientdemo

  rabbitmq:
    host: rabbitmq
    port: 5672
    username: ****
    password: ****

  主要配置rabbit连接信息

  3、类文件

  

public class ClientApplication {
    private static Logger logger = LoggerFactory.getLogger(ClientApplication.class);
    @Autowired
    ServicedemoImpl service;

    @RequestMapping("/service")
    public String getService() {
        logger.info("i am a client message,i‘m calling service");
        return service.getService();
    }

    @RequestMapping("/")
    public String getGreed() {
        return "Client success";
    }

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }

    @RequestMapping("/ip")
    public String getIP() {
        return service.getIP();
    }

}
时间: 2024-11-12 03:13:27

spring cloud Sleuth的相关文章

Spring Cloud Sleuth 使用教程

Spring Cloud Sleuth 使用案例 Span术语(Terminology) Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标识,trace以另一个64位ID表示,span还有其他数据信息,比如摘要.时间戳事件.关键值注释(tags).span的ID.以及进度ID(通常是IP地址) span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它. Trace:一系列

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

好久没有写博客了,主要是最近有些忙,今天忙里偷闲来一篇. =======我是华丽的分割线========== 微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单元,一个请求往往会有很多个单元参与,一旦请求出现异常,想要去定位问题点真心不容易,因此需要有个东西去跟踪请求链路,记录一个请求都调用了哪些服务单元,调用顺序是怎么样的以及在各个服务单元处理的时间长短.常见的服务链路追踪组件有google的dapper.twitter的zipkin.阿里的鹰眼等,它们

业余草 SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)

这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Add sleuth to the classpath of a Spring Boot application (see below for Maven and Gradle examples), and you will see the correlation data being collected in logs, as long as you are logging re

Spring Cloud Sleuth + zipkin 实现服务追踪

服务追踪 Spring Cloud Sleuth实现了一种分布式的服务链路跟踪解决方案,通过使用Sleuth可以让我们快速定位某个服务的问题. 官方文档地址如下: http://cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/2.0.1.RELEASE/single/spring-cloud-sleuth.html 一些概念: Span,Span是基本的工作单元.Span包括一个64位的唯一ID,一个64位trace码,描述信息,时

浅尝Spring Cloud Sleuth

Spring Cloud Sleuth提供了分布式追踪(distributed tracing)的一个解决方案.其基本思路是在服务调用的请求和响应中加入ID,标明上下游请求的关系.利用这些信息,可以方便地分析服务调用链路和服务间的依赖关系. Only Sleuth 在Spring Tool Suite的文件菜单中,点击新建Spring Starter Project. 在请求处理方法内加上一行日志代码. import org.slf4j.Logger; import org.slf4j.Logg

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 request. Span It is the basic unit of work, for example a call to a service. They are identified with a span ID and a trace ID to which span is owned. T

java B2B2C电子商务平台分析之十二-----Spring Cloud Sleuth

一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可.愿意了解源码的朋友直接求求交流分享技术:二一四七七七五六三三 二.服务追踪分析 微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败.随着业务的不断扩张,服务之间互相调用会越来越复杂. 三.术语 Spr

第11章 分布式服务跟踪: Spring Cloud Sleuth

通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果, 在复杂的微服务架构系统中, 几乎每一个前端请求都会形成一条复杂的分布式服务调用链路, 在每条链路中任何一个依赖服务出现延迟过高或错误的时候都有可能引起请求最后的失败.这时候,对于每个请求, 全链路调用的跟踪就变得越来越重要, 通过实现对请求调用的跟踪可以帮助我们快速发现错误根源以及监控分析每条请求链路上的性能瓶颈等.Spring Cloud Sleuth 提供了 一套完整的解决的分布式服务跟踪问题的方案

Spring Cloud Sleuth 之Greenwich版本全攻略

微服务架构是一个分布式架构,微服务系统按业务划分服务单元,一个微服务系统往往有很多个服务单元.由于服务单元数量众多,业务的复杂性较高,如果出现了错误和异常,很难去定位.主要体现在一个请求可能需要调用很多个服务,而内部服务的调用复杂性决定了问题难以定位.所以在微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题能够快速定位的目的. 在微服务系统中,一个来自用户的请求先到达前端A(如前端界面),然后通过远程调用,到达系