一、Spring Cloud各组件小结
- Nacos【name sever】:注册中心,解决服务的注册与发现
- Ribbon:客户端负载均衡器,解决微服务集群负载均衡的问题
- Openfeign:声明式HTTP客户端,解决微服务之间远程调用问题
- Sentinel:微服务流量防卫兵,以流量为入口,保护微服务,防止服务雪崩
- Gateway:微服务网关,服务集群的入口,路由转发以及负载均衡(全局认证,流控)
二、为什么要链路追踪
随着服务的越来越多,对调用链的分析会越来越复杂,定位问题越来越困难,具体表现为:
- 微服务之间的调用错综复杂,用户发送的请求经历哪些服务,调用链不清楚。
- 无法快速定位调用链中哪个环节出现了问题。
- 无法快速定位调用链中哪个环节比较耗时。
运维人员希望能够通过查看日志和查看服务之间的调用关系来定位问题,而Spring Cloud sleuth组件正是为了解决微服务跟踪的组件。链路追踪的出现正是为了解决这种问题,它可以在复杂的服务调用中定位问题,除此之外,如果某个接口突然耗时增加,也不必再逐个服务查询耗时情况,我们可以直观地分析出服务的性能瓶颈,方便在流量激增的情况下精准合理地扩容。
微服务调用三、什么是链路追踪
单纯的理解链路追踪,就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。
四、链路追踪相关产品
4.1 cat
由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。 集成方案是通过代码埋点的方式来实现监控,比如: 拦截器,过滤器等。 对代码的侵入性很大,集成成本较高。风险较大。
4.2 zipkin
由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。该产品结合spring-cloud-sleuth使用较为简单, 集成很方便, 但是功能较简单。
4.3 pinpoint
Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件, UI功能强大,接入端无代码侵入。
4.4 skywalking
本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件, UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。
4.5 Sleuth
SpringCloud 提供的分布式系统中链路追踪解决方案。
注意:SpringCloud alibaba技术栈中并没有提供自己的链路追踪技术的,我们可以采用Sleuth +Zinkin来做链路追踪解决方案
五、Sleuth简介
5.1 什么是Sleuth
Spring Cloud Sleuth 为 Spring Cloud 实现了分布式跟踪解决方案。兼容 Zipkin,HTrace 和其他基于日志的追踪系统,例如 ELK(Elasticsearch 、Logstash、 Kibana)。Spring Cloud Sleuth 提供了以下功能:
-
链路追踪:通过 Sleuth 可以很清楚的看出一个请求都经过了哪些服务,可以很方便的理清服务间的调用关系等。
-
性能分析:通过 Sleuth 可以很方便的看出每个采样请求的耗时,分析哪些服务调用耗时,当服务调用的耗时随着请求量的增大而增大时, 可以对服务的扩容提供一定的提醒。
-
数据分析,优化链路:对于频繁调用一个服务,或并行调用等,可以针对业务做一些优化措施。
-
可视化错误:对于程序未捕获的异常,可以配合 Zipkin 查看。
5.2 Sleuth基本概念
Sleuth基本概念涉及到三个专业术语: span、Trace、Annotations。
5.2.1 Span
基本工作单位,每次发送一个远程调用服务就会产生一个 Span。Span 是一个 64 位的唯一 ID。通过计算 Span 的开始和结束时间,就可以统计每个服务调用所花费的时间。
5.2.2 Trace
一系列 Span 组成的树状结构,一个 Trace 认为是一次完整的链路,内部包含 n 多个 Span。Trace 和 Span 存在一对多的关系,Span 与 Span 之间存在父子关系。
5.2.3 Annotations
用来及时记录一个事件的存在,一些核心 annotations 用来定义一个请求的开始和结束。
cs - Client Sent:客户端发起一个请求,这个 annotation 描述了这个 span 的开始;
sr - Server Received:服务端获得请求并准备开始处理它,如果 sr 减去 cs 时间戳便可得到网络延迟;
ss - Server Sent:请求处理完成(当请求返回客户端),如果 ss 减去 sr 时间戳便可得到服务端处理请求需要的时间;
cr - Client Received:表示 span 结束,客户端成功接收到服务端的回复,如果 cr 减去 cs 时间戳便可得到客户端从服务端获取回复的所有所需时间。
核心:为什么能够进行整条链路的追踪?其实就是一个 Trace ID 将 一连串的 Span 信息连起来了。根据 Span 记录的信息再进行整合就可以获取整条链路的信息。
span、trace Annotations六、Sleuth + Zipkin
6.1 Zipkin介绍
Zipkin主要有四个组件:collector,storage,API,web UI。collector用于收集各服务发送到zipkin的数据,storage用于存储这些链路数据,目前支持Cassandra,ElasticSearch(推荐使用,易于大规模扩展)和MySQL,API用来查找和检索跟踪链,提供给界面UI展示。
Zipkin链路的追踪原理:跟踪器位于应用程序中,记录发生的操作的时间和元数据,收集的跟踪数据称为Span,将数据发送到Zipkin的仪器化应用程序中的组件称为Reporter,Reporter通过几种传输方式(http,kafka)之一将追踪数据发送到Zipkin收集器(collector),然后将跟踪数据进行存储(storage),由API查询存储以向UI提供数。
网友评论