ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

10. 软件设计架构-微服务-链路追踪

10. 软件设计架构-微服务-链路追踪 文章目录前言一、链路追踪介绍1. 什么是链路追踪2. 常见的链路追踪技术有下面这些二、Sleuth入门1. Sleuth介绍2. Sleuth入门三、Zipkin的集成1. ZipKin介绍2. ZipKin服务端安装3. Zipkin客户端集成四、Zipkin数据持久化1. 使用mysql实现数据持久化2. 使用elasticsearch实现数据持久化前言链路追踪--Sleuth‌在大型系统的微服务化构建中一个系统被拆分成了许多模块。这些模块负责不同的功能组合成系统最终可以提供丰富的功能。在这种架构中一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上这些软件模块有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器横跨多个不同的数据中心也就意味着这种架构形式也会存在一些问题如何快速发现问题如何判断故障影响范围如何梳理服务依赖以及依赖的合理性如何分析链路性能问题以及实时容量规划那么应该怎么解决呢 这时候就需要通过**分布式链路追踪Distributed Tracing**记录并分析请求在微服务之间传递的全过程包括请求的起点、流经的每个服务、服务的处理时间、请求的返回路径等以帮助开发者和运维人员快速定位问题、分析性能瓶颈。一、链路追踪介绍1. 什么是链路追踪用于监控和分析微服务架构中请求传递过程的技术。分布式链路追踪将一次分布式请求还原成调用链路进行日志记录性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。2. 常见的链路追踪技术有下面这些cat由大众点评开源基于Java开发的实时应用监控平台包括实时应用监控业务监控 。 集成方案是通过代码埋点的方式来实现监控比如 拦截器过滤器等。 对代码的侵入性很大集成成本较高。风险较大。zipkin由Twitter公司开源开放源代码分布式的跟踪系统用于收集服务的定时数据以解决微服务架构中的延迟问题包括数据的收集、存储、查找和展现。该产品结合spring-cloud-sleuth使用较为简单 集成很方便 但是功能较简单。pinpointPinpoint是韩国人开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件UI功能强大接入端无代码侵入。skywalkingSkyWalking是本土开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件UI功能较强接入端无代码侵入。目前已加入Apache孵化器。SleuthSpringCloud 提供的分布式系统中链路追踪解决方案。注意1.大部分都是基于 google 发表的‌Dapper‌。Dapper 阐述了分布式系统特别是微服务架构中链路追踪的概念、数据表示埋点、传递、收集存储与展示等技术细节。2.Spring Cloud Alibaba技术栈中并没有提供自己的链路追踪技术的我们可以采用‌Sleuth Zinkin‌来做链路追踪解决方案二、Sleuth入门Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案并且兼容支持了 zipkin你只需要在 pom 文件中引入相应的依赖即可。它大量借用了Google Dapper的设计 先来了解一下Sleuth中的术语和相关概念。1. Sleuth介绍Trace由一组Trace Id相同的Span串联形成一个树状结构。为了实现请求跟踪当请求到达分布式系统的入口端点时只需要服务跟踪框架为该请求创建一个唯一的标识即TraceId同时在分布式系统内部流转的时候框架始终保持传递该唯一值直到整个请求的返回。那么我们就可以使用该唯一标识将所有的请求串联起来形成一条完整的请求链路。Span代表了一组基本的工作单元。为了统计各处理单元的延迟当请求到达各个服务组件的时候也通过一个唯一标识SpanId来标记它的开始、具体过程和结束。通过SpanId的开始和结束时间戳就能统计该span的调用时间除此之外我们还可以获取如事件的名称。请求信息等元数据。Annotation用它记录一段时间内的事件内部使用的重要注释csClient Send客户端发出请求开始一个请求的生命srServer Received服务端接受到请求开始进行处理 srcs 网络延迟服务调用的时间ssServer Send服务端处理完毕准备发送到客户端ss - sr 服务器上的请求处理时间crClient Reveived客户端接受到服务端的响应请求结束。 cr - sr 请求的总时间2. Sleuth入门‌微服务名称, traceId, spanid‌,是否将链路的追踪结果输出到第三方平台[api-gateway,3977125f73391553,3977125f73391553,false][service-order,3977125f73391553,57547b5bf71f8242,false][service-product,3977125f73391553,449f5b3f3ef8d5c5,false]接下来通过之前的项目案例整合Sleuth完成入门案例的编写。修改父工程引入Sleuth依赖!--链路追踪 Sleuth--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-sleuth/artifactId/dependency启动微服务调用之后我们可以在控制台观察到sleuth的日志输出其中‌5399d5cb061971bd‌ 是‌TraceId‌‌5399d5cb061971bd‌ 是‌SpanId‌依次调用有一个全局的TraceId将调用链路串起来。仔细分析每个微服务的日志不难看出请求的具体过程。查看日志文件并不是一个很好的方法当微服务越来越多日志文件也会越来越多通过‌Zipkin‌可以将日志聚合并进行可视化展示和全文检索。三、Zipkin的集成1. ZipKin介绍Zipkin 是 Twitter 的一个开源项目它基于Google Dapper实现它致力于收集服务的定时数据以解决微服务架构中的延迟问题包括数据的收集、存储、查找和展现。我们可以使用它来收集各个服务器上请求链路的跟踪数据并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口之外它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细比如可以查询某段时间内各用户请求的处理时间等。Zipkin 提供了可插拔数据存储方式In-Memory、MySql、Cassandra 以及 Elasticsearch。上图展示了 Zipkin 的基础架构它主要由 4 个核心组件构成Collector收集器组件它主要用于处理从外部系统发送过来的跟踪信息将这些信息转换为Zipkin内部处理的 Span 格式以支持后续的存储、分析、展示等功能。Storage存储组件它主要对处理收集器接收到的跟踪信息默认会将这些信息存储在内存中我们也可以修改此存储策略通过使用其他存储组件将跟踪信息存储到数据库中。RESTful APIAPI 组件它主要用来提供外部访问接口。比如给客户端展示跟踪信息或是外接系统访问以实现监控等。Web UIUI 组件 基于API组件实现的上层应用。通过UI组件用户可以方便而有直观地查询和分析跟踪信息。Zipkin分为两端一个是 Zipkin服务端一个是 Zipkin客户端客户端也就是微服务的应用。 客户端会配置服务端的 URL 地址一旦发生服务间的调用的时候会被配置在微服务里面的 Sleuth 的监听器监听并生成相应的 Trace 和 Span 信息发送给服务端。2. ZipKin服务端安装第1步: 下载ZipKin的jar包https://search.maven.org/remote_content?gio.zipkin.javaazipkinservervLATESTcexec访问上面的网址即可得到一个jar包这就是ZipKin服务端的jar包第2步: 通过命令行输入下面的命令启动ZipKin Serverjava-jarzipkin-server-2.12.9-exec.jar第3步通过浏览器访问 http://localhost:9411访问3. Zipkin客户端集成ZipKin客户端和Sleuth的集成非常简单只需要在微服务中添加其依赖和配置即可。第1步在每个微服务上添加依赖dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-zipkin/artifactId/dependency第2步添加配置spring:zipkin:base-url:http://127.0.0.1:9411/#zipkin server的请求地址discoveryClientEnabled:false#让nacos把它当成一个URL而不要当做服务名sleuth:sampler:probability:1.0#采样的百分比第3步: 访问微服务http://localhost:7000/order-serv/order/prod/1第4步: 访问zipkin的UI界面观察效果第5步点击其中一条记录可观察一次访问的详细线路。四、Zipkin数据持久化Zipkin Server默认会将追踪数据信息保存到内存但这种方式不适合生产环境。Zipkin支持将追踪数据持久化到mysql数据库或elasticsearch中。1. 使用mysql实现数据持久化第1步: 创建mysql数据环境CREATETABLEIFNOTEXISTSzipkin_spans(trace_id_highBIGINTNOTNULLDEFAULT0COMMENTIf non zero, this means the trace uses 128 bit traceIds instead of 64 bit,trace_idBIGINTNOTNULL,idBIGINTNOTNULL,nameVARCHAR(255)NOTNULL,parent_idBIGINT,debugBIT(1),start_tsBIGINTCOMMENTSpan.timestamp(): epoch micros used for endTs query and to implement TTL,durationBIGINTCOMMENTSpan.duration(): micros used for minDuration and maxDuration query)ENGINEInnoDBROW_FORMATCOMPRESSEDCHARACTERSETutf8COLLATEutf8_general_ci;ALTERTABLEzipkin_spansADDUNIQUEKEY(trace_id_high,trace_id,id)COMMENTignore insert on duplicate;ALTERTABLEzipkin_spansADDINDEX(trace_id_high,trace_id,id)COMMENTfor joining with zipkin_annotations;ALTERTABLEzipkin_spansADDINDEX(trace_id_high,trace_id)COMMENTfor getTracesByIds;ALTERTABLEzipkin_spansADDINDEX(name)COMMENTfor getTraces and getSpanNames;ALTERTABLEzipkin_spansADDINDEX(start_ts)COMMENTfor getTraces ordering and range;CREATETABLEIFNOTEXISTSzipkin_annotations(trace_id_highBIGINTNOTNULLDEFAULT0COMMENTIf non zero, this means the trace uses 128 bit traceIds instead of 64 bit,trace_idBIGINTNOTNULLCOMMENTcoincides with zipkin_spans.trace_id,span_idBIGINTNOTNULLCOMMENTcoincides with zipkin_spans.id,a_keyVARCHAR(255)NOTNULLCOMMENTBinaryAnnotation.key or Annotation.value if type -1,a_valueBLOBCOMMENTBinaryAnnotation.value(), which must be smaller than 64KB,a_typeINTNOTNULLCOMMENTBinaryAnnotation.type() or -1 if Annotation,a_timestampBIGINTCOMMENTUsed to implement TTL; Annotation.timestamp or zipkin_spans.timestamp,endpoint_ipv4INTCOMMENTNull when Binary/Annotation.endpoint is null,endpoint_ipv6BINARY(16)COMMENTNull when Binary/Annotation.endpoint is null, or no IPv6 address,endpoint_portSMALLINTCOMMENTNull when Binary/Annotation.endpoint is null,endpoint_service_nameVARCHAR(255)COMMENTNull when Binary/Annotation.endpoint is null)ENGINEInnoDBROW_FORMATCOMPRESSEDCHARACTERSETutf8COLLATEutf8_general_ci;ALTERTABLEzipkin_annotationsADDUNIQUEKEY(trace_id_high,trace_id,span_id,a_key,a_timestamp)COMMENTIgnore insert on duplicate;ALTERTABLEzipkin_annotationsADDINDEX(trace_id_high,trace_id,span_id)COMMENTfor joining with zipkin_spans;ALTERTABLEzipkin_annotationsADDINDEX(trace_id_high,trace_id)COMMENTfor getTraces/ByIds;ALTERTABLEzipkin_annotationsADDINDEX(endpoint_service_name)COMMENTfor getTraces and getServiceNames;ALTERTABLEzipkin_annotationsADDINDEX(a_type)COMMENTfor getTraces;ALTERTABLEzipkin_annotationsADDINDEX(a_key)COMMENTfor getTraces;ALTERTABLEzipkin_annotationsADDINDEX(trace_id,span_id,a_key)COMMENTfor dependencies job;CREATETABLEIFNOTEXISTSzipkin_dependencies(dayDATENOTNULL,parentVARCHAR(255)NOTNULL,childVARCHAR(255)NOTNULL,call_countBIGINT)ENGINEInnoDBROW_FORMATCOMPRESSEDCHARACTERSETutf8COLLATEutf8_general_ci;ALTERTABLEzipkin_dependenciesADDUNIQUEKEY(day,parent,child);第2步: 在启动ZipKin Server的时候,指定数据保存的mysql的信息java-jarzipkin-server-2.12.9-exec.jar--STORAGE_TYPEmysql--MYSQL_HOST127.0.0.1--MYSQL_TCP_PORT3306--MYSQL_DBzipkin--MYSQL_USERroot--MYSQL_PASSroot2. 使用elasticsearch实现数据持久化第1步: 下载elasticsearch下载地址Elasticsearch第2步: 启动elasticsearch第3步: 在启动ZipKin Server的时候指定数据保存的elasticsearch的信息java-jarzipkin-server-2.12.9-exec.jar--STORAGE_TYPEelasticsearch --ESHOSTlocalhost:9200本文的引用仅限自我学习如有侵权请联系作者删除。参考知识传智教育·黑马程序员
返回列表