赞
踩
Springcloud项目会有一个很严重的问题.加入我们的项目运行过程中报错了,我们该如何快速定位到具体错误的地方?这就需要我们的链路追踪技术.
在大型系统的微服务化构建中,一个系统被拆分成了许多微服务。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心【区域】,也就意味着这种架构形式也会存在一些问题:
分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上IP、每个服务节点的请求状态200 500等等。
常见的链路追踪技术有下面这些:
(1)cat 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。 集成
方案是通过代码埋点的方式来实现监控,比如: 拦截器,过滤器等。 对代码的侵入性很大,集成成本较高。风险较大。
(2)zipkin 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微
服务架构中的延迟问题,包括:数据的收集、存储、查找和展现《图形化》。该产品结合spring-cloud-sleuth 使用较为简单, 集成很方便, 但是功能较简单。
(3)pinpoint Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点
是支持多种插件,UI功能强大,接入端无代码侵入。
(3)skywalking 【未来企业会使用的多】
SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多
种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。
(4)Sleuth (日志记录每一条链路上的所有节点,以及这些节点所在的机器,和耗时。)log4j
SpringCloud 提供的分布式系统中链路追踪解决方案。
注意:SpringCloud alibaba技术栈中并没有提供自己的链路追踪技术的,我们可以采用Sleuth +
Zipkin来做链路追踪解决方案
Springcloud 并不是自己技术---而是把所有框架整合在一起 来解决微服务上的问题。
SpringCloud Sleuth主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计, 先来了解一下Sleuth中的术语和相关概念。
Trace (一条完整链路--包含很多span(微服务接口))
由一组Trace Id(贯穿整个链路)相同的Span串联形成一个树状结构。为了实现请求跟踪,当请求到达分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的标识(即TraceId),同时在分布式系统内部流转的时候,框架始终保持传递该唯一值,直到整个请求的返回。那么我们就可以使用该唯一标识将所有的请求串联起来,形成一条完整的请求链路。
Span
代表了一组基本的工作单元。为了统计各处理单元的延迟,当请求到达各个服务组件的时候,也通过一个唯一标识(SpanId)来标记它的开始、具体过程和结束。通过SpanId的开始和结束时间戳,就能统计该span的调用时间,除此之外,我们还可以获取如事件的名称。请求信息等元数据。
举个例子,一条业务链会生成一个统一的traceId,每个服务都会生成各自的spanId,traceId就好比是一条线,他将整个业务链经过的服务都串起来,这根"线"上的每个服务都对应着一个spanId.
只需要在父工程中引入sleuth依赖即可
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-sleuth</artifactId>
- </dependency>
- </dependencies>
然后重启所有的服务
重启后会发现多了这些内容:
我们模拟下单业务,他需要走gateway网关服务,然后到order服务,oreder服务再去调取product服务最终实现下单功能.
gateway中的控制台输出内容:
同样order服务和product服务中也会生成开始时间,结束时间,以及traceId和各自的spanId.
我们可以同过计算每个服务执行的时间来得出每个服务执行完总共需要的时间.计算的方式是这样的:
现在我们假设:gateway显示一共花费了5.5s,order中显示花费4s,product中显示花费了1s,那么真正product花费的时间为:1s,order花费的时间为4-1=3s,gateway实际花费的时间为5.5-4=1.5s.那么这样一算就会发现order中花费的时间最多,那么极大可能就是order中出现了问题.
通过我上述的例子你不难会发现,难不成我以后出了问题还得我扒拉着代码然后一条一条去看嘛?未来项目上线了也没有代码让我看啊?所以聪明的前辈们就发明了另一个插件----Zipkin
Zipkin 是 Twitter 的一个开源项目,它基于Google Dapper实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储展现、查找和我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源
除了面向开发的 API 接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。
Zipkin 提供了可插拔数据存储方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。
上图展示了 Zipkin 的基础架构,它主要由 4 个核心组件构成:
Zipkin 分为两端,一个是 Zipkin 服务端,一个是 Zipkin 客户端,客户端也就是微服务的应用。客户端会配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监听,并生成相应的 Trace 和 Span 信息发送给服务端。
zipkin的引入需要zipkin-server-2.12.9-exec.jar这个东东.这个东西某某DN上绝对有,本来想上传一个再把连接放这里,某某DN提示我资源在该站已存在,真无语
在该文件所在目录启动cmd黑窗口,然后输入命名运行该jar
java -jar zipkin-server-2.12.9-exec.jar
我们可以看到它的端口号默认为9411
这时图形化界面已经有了,我们访问这个页面
我们需要在每个服务中引入该依赖,或者我们可以直接在父工程中引入依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-zipkin</artifactId>
- </dependency>
- #zipkin的地址
- spring.zipkin.base-url=http://localhost:9411
- #禁止nacos注册zikpin
- spring.zipkin.discovery-client-enabled=false
- #设置采样的比例(企业中一般为3%,也就是0.03,我们这模拟的小项目直接1.0就行)
- spring.sleuth.sampler.probability=1.0
我们可以把这些配置放到Nacos配置中心里面,作为公共配置,然后在每个服务中引入这个公共配置,未来配置需要修改的话就不需要动代码了.
配置中心的内容:
bootstrap.properties中的内容:
重新访问我们的下单业务
查看zikpin图形化界面的内容:
我们刚刚执行的业务的链路就显示到了zikpin中.我们点进去看看:
我们可以看到它将这个业务所有经过的服务以及每个业务消耗的时间都显示出来了.我们模拟报错的场景,在order服务的controller层加点料让他报错:
这时我们再访问我们的下单业务:成功报错.
我们再去zikpin中查看:多了一个报错的链路
只有真正出错的服务,才会显示错误信息:
gateway显示的内容:
order中显示的内容:
可以看到,zikpin在order中给我们提示了错误信息,提示了具体的异常类型,以及发生异常的服务的ip+端口号,我们可以一眼追踪到出错的地方是在我们的order服务的下单接口中出现了问题,非常的nice.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。