ZIPKIN 整理

前言

微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。

链路追踪组件有Google的Dapper,Twitter 的Zipkin,以及阿里的Eagleeye (鹰眼)等,它们都是非常优秀的链路追踪开源组件。

始祖论文
《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》

排查问题
日志: 通过分析调用链路上的每个服务日志得到结果
zipkin:使用zipkin的web UI可以一眼看出延迟高的服务(高效

ZIPKIN

Zipkin 是基于前文所提论文实现,由Twitter开源的分布式追踪系统,通过收集分布式服务执行时间的信息来达到追踪服务调用链路、以及分析服务执行延迟等目的。
功能
1 定位和收集处理服务架构中故障延迟的时间;
2 记录微服务系统中的请求过程中的数据记录;
3 分析微服务系统在大压力下的可用性和性能。
基本流程

在这里插入图片描述

如图,各业务系统在彼此调用时,测试服务器将特定的跟踪消息传递至zipkin,zipkin在收集到跟踪信息后将其聚合处理、存储、展示等,用户可通过web UI方便获得网络延迟、调用链路、系统依赖等等。

Zipkin 会将trace(trace后文会提到)相关的信息在调用链路上传递,并在每个调用边界结束时异步的把当前调用的耗时信息上报给 Zipkin Server。Zipkin Server 在收到 trace 信息后,将其存储起来,Zipkin 支持的存储类型有 inMemory、MySql、Cassandra、以及 ElasticsSearch 几种方式。随后 Zipkin 的 Web UI 会通过 API 访问的方式从存储中将 trace 信息提取出来分析并展示。

组件
collector
storage
Query
web UI

Collector接收各service传输的数据(trace到的相关数据信息,trace后文会提到);
Storage默认存储在内存中,存储数据,常见有cassandra,mysql,es等;
Query负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用;
Web 提供简单的web界面展示数据信息。

Sleuth

Sleuth是Spring Cloud的组件之一,它为Spring Cloud实现了一种分布式追踪解决方案,兼容Zipkin,HTrace和其他基于日志的追踪系统,例如 ELK(Elasticsearch 、Logstash、Kibana)。

Sleuth引入了许多 Dapper论文中的术语:

Span ---- 基本的工作单元(一次完整的RPC调用)。无论是发送一个RPC或是向RPC发送一个响应都是一个Span。每一个Span通过一个64位ID来进行唯一标识,并通过另一个64位ID对Span所在的Trace进行唯一标识。

Span什么时候生成?
服务接受到 Request时,若当前Request没有关联任何Span,便生成一个Span,包括:Span ID、TraceID。
向下游服务发送Request时,需生成一个Span,并把新生成的Span的父节点设置成上一步生成的Span。

Span能够启动和停止,他们不断地追踪自身的时间信息,当你创建了一个Span,你必须在未来的某个时刻停止它。启动一个Trace的初始化Span被叫作 Root Span ,它的 Span ID 和 Trace Id 相同。

Trace ---- 由一系列Span 组成的一个树状结构。例如,如果你要执行一个分布式大数据的存储操作,这个Trace也许会由你的PUT请求来形成。

Annotation:用来及时记录一个事件(Event)的存在。通过引入 Brave 库,不用再去设置一系列的特别事件,从而让 Zipkin 能够知道客户端和服务器是谁、请求是从哪里开始的、又到哪里结束。
Annotation什么时候生成?
客户端发送Request、接受到Response、服务器端接受到Request、发送 Response时生成。Annotation属于某个Span,需把新生成的Annotation添加到当前上下文里Span的annotations数组里。

cs (Client Sent) - 客户端发起一个请求,这个注释指示了一个Span的开始。

sr (Server Received) - 服务端接收请求并开始处理它,如果用sr时间戳减去 cs 时间戳便能看出有多少网络延迟。

ss(Server Sent)- 注释请求处理完成(响应已发送给客户端),如果ss时间戳减去sr 时间戳便可得出服务端处理请求耗费的时间。

cr(Client Received)- 预示了一个 Span的结束,客户端成功地接收到了服务端的响应,如果用 cr 时间戳减去 cs 时间戳便可得出客户端从服务端获得响应所需耗费的整个时间。

在这里插入图片描述

如图中示例:
颜色相同的注释表示是同一个Span(这里一共有7个Span,编号从A到G),以下面这个注释为例:
Trace Id = X
Span Id = D
Client Sent

这个注释表示当前Span的Trace Id 为X,Span Id 为 D,同时,发生了Client Sent 事件。下图为父子关系的Span的调用链路(通常父子关系信息也需要被收集)

在这里插入图片描述

服务之间需传递的信息
Trace的基本信息需在上下游服务之间传递,如下信息是必须的:
Trace ID:起始(根)服务生成的TraceID
Span ID:调用下游服务时所生成的Span ID
Parent Span ID:父Span ID
Is Sampled:是否需要采样
Flags:告诉下游服务,是否是debug Reqeust

细节
当用户发起一次调用时,Zipkin 的客户端会在入口处为整条调用链路生成一个全局唯一的 trace id,并为这条链路中的每一次分布式调用生成一个 span id。span 与 span 之间可以有父子嵌套关系,代表分布式调用中的上下游关系。span 和 span 之间可以是兄弟关系,代表当前调用下的两次子调用。一个 trace 由一组 span 组成,可以看成是由 trace 为根节点,span 为若干个子节点的一棵树。

结果示例

在这里插入图片描述

下载及配置

镜像下载

https://repo1.maven.org/maven2/io/zipkin/zipkin-server/

官方文档下载及运行

Quickstart
In this section we’ll walk through building and starting an instance of Zipkin for checking out Zipkin locally. There are three options: using Java, Docker or running from source.

If you are familiar with Docker, this is the preferred method to start. If you are unfamiliar with Docker, try running via Java or from source.

-- Regardless of how you start Zipkin, browse to http://your_host:9411 to find traces!

-- Docker
The Docker Zipkin project is able to build docker images, provide scripts and a docker-compose.yml for launching pre-built images. The quickest start is to run the latest image directly:

docker run -d -p 9411:9411 openzipkin/zipkin
-- Java
If you have Java 8 or higher installed, the quickest way to get started is to fetch the latest release as a self-contained executable jar:

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

or 下载jar包运行 https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/

java -jar zipkin-server-2.12.2-exec.jar --logging.level.zipkin2=INFO
后台运行

--Running from Source
Zipkin can be run from source if you are developing new features. To achieve this, you’ll need to get Zipkin’s source and build it.

# get the latest source
git clone https://github.com/openzipkin/zipkin
cd zipkin
# Build the server and also make its dependencies
./mvnw -DskipTests --also-make -pl zipkin-server clean install
# Run the server

java -jar ./zipkin-server/target/zipkin-server-*exec.jar
Stop by and socialize with us on gitter, if you end up making something interesting!

配置修改

建立 startup.sh 文件
与zipkin.jar 在同一个目录下。

#!/usr/bin/env bash

# DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

SOURCE="${BASH_SOURCE[0]}"
while [[ -h "$SOURCE" ]]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ ${SOURCE} != /* ]] && SOURCE="$DIR/$SOURCE"
done

DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
cd ${DIR}

# export HTTP_COLLECTOR_ENABLED=true
export STORAGE_TYPE=elasticsearch
# elasticsearch 配置 不用可屏蔽
export ES_HOSTS=http://xxx.xxx.xxx.xxx:9200
export ES_INDEX=zipkin
export ES_INDEX_SHARDS=1
export ES_INDEX_REPLICAS=0
export ES_USERNAME=elastic
export ES_PASSWORD=elastic
# http收集
export HTTP_COLLECTOR_ENABLED=true
# mq 配置 不用可屏蔽
export RABBIT_ADDRESSES=xxx.xxx.xxx.xxx:5672
export RABBIT_USER=admin
export RABBIT_PASSWORD=admin
export RABBIT_QUEUE=zipkin
export RABBIT_VIRTUAL_HOST=infrastructure

export JAVA_OPTS="-Xms1024m -Xmx1024m"

maven配置

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-zipkin</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>

application.yml配置

spring:
    application:
    name: test-1
    sleuth:
        web:
        client:
            enabled: true
        sampler:
        probability: 1.0 # 将采样比例设置为 1.0,也就是全部都需要。默认是 0.1
    zipkin:
        base-url: http://xxx.xxx.xxx.xxx:9411/ # 指定了 Zipkin 服务器的地址
        rabbitmq:
        queue: zipkin
    rabbitmq:
        host: 10.2.100.11
        port: 5672
        username: admin
        password: admin
        virtual-host: infrastructure
        publisher-confirms: true
        #connection-timeout: 1000ms
        template:
        retry:
            enabled: true
        listener:
        simple:
            acknowledge-mode: auto
    server:
    port: 8088

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值