5.png

分布式计算八大误区

  1. 网络可靠。
  2. 延迟为零。
  3. 带宽无限。
  4. 网络绝对安全。
  5. 网络拓扑不会改变。
  6. 必须有一名管理员。
  7. 传输成本为零。
  8. 网络同质化。(操作系统,协议)

链路追踪的必要性

如果能跟踪每个请求,中间请求经过哪些微服务,请求耗时,网络延迟,业务逻辑耗时等。我们就能更好地分析系统瓶颈、解决系统问题。因此链路跟踪很重要。

我们自己思考解决方案:在调用前后加时间戳。捕获异常。

链路追踪目的:解决错综复杂的服务调用中链路的查看。排查慢服务。

市面上链路追踪产品,大部分基于google的Dapper论文。

产品 说明
zipkin twitter开源的。是严格按照谷歌的Dapper论文来的。
pinpoint 韩国的 Naver公司的。
Cat 美团点评的
EagleEye 淘宝的

链路追踪要考虑的几个问题

  1. 需要开率探针的性能消耗,尽量不影响 服务本体。
  2. 易用, 开发可以很快接入,不要浪费太多精力。
  3. 数据分析,要实时分析。维度足够。

1. Sleuth

1.1 简介

Sleuth是Spring cloud的分布式跟踪解决方案。

  1. span(跨度),基本工作单元。一次链路调用,创建一个span,
    span用一个64位id唯一标识。包括:id,描述,时间戳事件,spanId,span父id。
    span被启动和停止时,记录了时间信息,初始化span叫:root span,它的span id和trace id相等。
  2. trace(跟踪),一组共享“root span”的span组成的树状结构 称为 trace,trace也有一个64位ID,trace中所有span共享一个trace id。类似于一颗 span 树。
  3. annotation(标签),annotation用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束。
    • CS(Client Send客户端发起请求)。客户端发起请求描述了span开始。
    • SR(Server Received服务端接到请求)。服务端获得请求并准备处理它。SR-CS=网络延迟。
    • SS(Server Send服务器端处理完成,并将结果发送给客户端)。表示服务器完成请求处理,响应客户端时。SS-SR=服务器处理请求的时间。
    • CR(Client Received 客户端接受服务端信息)。span结束的标识。客户端接收到服务器的响应。CR-CS=客户端发出请求到服务器响应的总时间。

其实Sleuth的数据结构是一颗树,从root span 开始。

1.2 基本使用

1.2.1 安装

Sleuth 需要安装到每个Eureka Client上。
maven安装

  1. <!-- sleuth -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-sleuth</artifactId>
  5. </dependency>

gradle安装

  1. //Sleuth
  2. implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'

1.2.2 测试

在user_center 和 order_center项目都装上Sleuth, 然后启动, 打开浏览器输入: http://localhost:9000/collect/orders/v3/1 返回结果

ORDER_CENTER未知异常, 已降级处理

查看user_center控制台image.png
日志的格式为:[application name, traceId, spanId, export]

  • application name: — 应用的名称,也就是application.properties中的spring.application.name参数配置的属性。
  • traceId: — 为一个请求分配的ID号,用来标识一条请求链路。
  • spanId: — 表示一个基本的工作单元,一个请求可以包含多个步骤,每个步骤都拥有自己的spanId。一个请求包含一个TraceId,多个SpanId
  • export: — 布尔类型。表示是否要将该信息输出到类似Zipkin这样的聚合器进行收集和展示。

1.3 Sleuth整合zipkin

Zipkin 是一个开放源代码分布式的跟踪系统,每个服务向zipkin报告计时数据,zipkin会根据调用关系通过Zipkin UI生成依赖关系图。
Zipkin提供了可插拔数据存储方式:In-Memory(本机内存)、MySql、Cassandra以及Elasticsearch。默认采用In-Memory方式进行存储,生产数据量大的情况则推荐使用Elasticsearch。
9. 链路追踪 - 图3

Zipkin由4个部分组成:Collector(采集器)、Storage(存储器)、Restful API(接口)、Web UI。

1.3.1 安装

安装zipkin之前首先保证安装了sleuth. 同样的, 需要上报的信息的项目都需要单独引入.

  • maven安装

    1. <!-- zipkin 依赖 sleuth -->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-starter-sleuth</artifactId>
    5. </dependency>
    6. <!-- zipkin -->
    7. <dependency>
    8. <groupId>org.springframework.cloud</groupId>
    9. <artifactId>spring-cloud-starter-zipkin</artifactId>
    10. </dependency>
  • gradle安装

    1. //zipkin 依赖 sleuth
    2. implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
    3. //zipkin
    4. implementation 'org.springframework.cloud:spring-cloud-starter-zipkin'

    1.3.2 下载Zipkin的UI界面jar包并启动.

  • 手动下载jar包并启动

打开zipkin官网: https://zipkin.io
image.png
image.png
下载最新jar包后启动:

  1. java -jar zipkin-server-{version}-exec.jar
  • 命令行启动

    1. curl -sSL https://zipkin.io/quickstart.sh | bash -s
    2. java -jar zipkin.jar
  • 其他方式

访问: https://zipkin.io/pages/quickstart.html

启动后控制台
image.png
此时Zipkin的UI项目启动成功, 并且可以看到在控制台打印了接受API信息的端口地址: http://127.0.0.1:9411/
记住这个地址, 我们需要在我们的Zipkin项目中配置.

1.3.3 配置Zipkin

  1. #配置zipkin
  2. #上报信息地址
  3. spring.zipkin.base-url=http://localhost:9411
  4. #采样比例
  5. spring.sleuth.sampler.rate=1

这里的base-url是zipkin服务端的地址, 也就是我们的刚刚启动的ZipkinUI项目的默认接受地址.

1.3.4 测试

确保user_center和order_center项目使用了seluth+zipkin, 启动Eureka, user_center和order_center项目, 启动zipkinUI客户端.
浏览器输入: http://localhost:9000/collect/orders/v3/1, 返回结果:

{“code”:”0000”,”msg”:”success”,”rersult”:[{“name”:”name1”,”id”:”100034”},{“name”:”name2”,”id”:”100035”},{“name”:”name3”,”id”:”100036”}]}

打开zipkinUI项目默认客户端地址: http://127.0.0.1:9411/
image.png
OK!