分布式计算八大误区
- 网络可靠。
- 延迟为零。
- 带宽无限。
- 网络绝对安全。
- 网络拓扑不会改变。
- 必须有一名管理员。
- 传输成本为零。
- 网络同质化。(操作系统,协议)
链路追踪的必要性
如果能跟踪每个请求,中间请求经过哪些微服务,请求耗时,网络延迟,业务逻辑耗时等。我们就能更好地分析系统瓶颈、解决系统问题。因此链路跟踪很重要。
我们自己思考解决方案:在调用前后加时间戳。捕获异常。
链路追踪目的:解决错综复杂的服务调用中链路的查看。排查慢服务。
市面上链路追踪产品,大部分基于google的Dapper论文。
产品 | 说明 |
---|---|
zipkin | twitter开源的。是严格按照谷歌的Dapper论文来的。 |
pinpoint | 韩国的 Naver公司的。 |
Cat | 美团点评的 |
EagleEye | 淘宝的 |
链路追踪要考虑的几个问题
- 需要开率探针的性能消耗,尽量不影响 服务本体。
- 易用, 开发可以很快接入,不要浪费太多精力。
- 数据分析,要实时分析。维度足够。
1. Sleuth
1.1 简介
Sleuth是Spring cloud的分布式跟踪解决方案。
- span(跨度),基本工作单元。一次链路调用,创建一个span,
span用一个64位id唯一标识。包括:id,描述,时间戳事件,spanId,span父id。
span被启动和停止时,记录了时间信息,初始化span叫:root span,它的span id和trace id相等。 - trace(跟踪),一组共享“root span”的span组成的树状结构 称为 trace,trace也有一个64位ID,trace中所有span共享一个trace id。类似于一颗 span 树。
- 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安装
<!-- sleuth -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
gradle安装
//Sleuth
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控制台
日志的格式为:[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。
Zipkin由4个部分组成:Collector(采集器)、Storage(存储器)、Restful API(接口)、Web UI。
1.3.1 安装
安装zipkin之前首先保证安装了sleuth. 同样的, 需要上报的信息的项目都需要单独引入
.
maven安装
<!-- zipkin 依赖 sleuth -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!-- zipkin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
gradle安装
//zipkin 依赖 sleuth
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
//zipkin
implementation 'org.springframework.cloud:spring-cloud-starter-zipkin'
1.3.2 下载Zipkin的UI界面jar包并启动.
手动下载jar包并启动
打开zipkin官网: https://zipkin.io
下载最新jar包后启动:
java -jar zipkin-server-{version}-exec.jar
命令行启动
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
其他方式
访问: https://zipkin.io/pages/quickstart.html
启动后控制台
此时Zipkin的UI项目启动成功, 并且可以看到在控制台打印了接受API信息的端口地址: http://127.0.0.1:9411/
记住这个地址, 我们需要在我们的Zipkin项目中配置.
1.3.3 配置Zipkin
#配置zipkin
#上报信息地址
spring.zipkin.base-url=http://localhost:9411
#采样比例
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/
OK!