网站建设的方案计划,咸阳佰亿网络工程有限公司,微信网页设计总结,制作一个网站需要注意什么如果能科学上网的话#xff0c;安装应该不难#xff0c;如果有问题可以给我留言
本篇文章我将给大家介绍“分布式链路追踪”的内容#xff0c;对于目前大部分采用微服务架构的公司来说#xff0c;分布式链路追踪都是必备的#xff0c;无论它是传统微服务体系亦或是新一代…如果能科学上网的话安装应该不难如果有问题可以给我留言
本篇文章我将给大家介绍“分布式链路追踪”的内容对于目前大部分采用微服务架构的公司来说分布式链路追踪都是必备的无论它是传统微服务体系亦或是新一代Service Mesh的微服务架构而具体介绍的内容本文不是完全讲理论而是希望从理论到实践引导大家去操作因为只有这样才能真正从技术层面有深刻的认识和了解
分布式链路追踪概述
在具体介绍分布式链路追踪系统之前我们首先需要理解下什么是链路追踪在本专栏前面关于监控系统的介绍中可以知道监控系统的观测数据主要来源于统计指标、日志以及链路追踪这三个方面。而这些数据从类型上又可以划分为两种请求级别、聚合级别。
请求级别的数据主要来源于真实的请求例如一次HTTP调用、RPC调用等本文要介绍的链路追踪就是这种类型。而聚合级别则是接口请求的度量指标或者一些参数数据的聚合如QPS、CPU使用率等数值。日志和统计指标数据既可以是请求级别也可以是聚合级别因为它们可能来自源于真实的请求也可能是系统自身诊断时记录下来的信息。
而对于链路追踪来说它主要的逻辑就是将请求链路的完整行为记录下来以便可以通过可视化的形式实现链路查询、性能分析、依赖关系、拓扑图等分布式链路追踪相关的功能。如下图所示
在上图中假设微服务系统中的一次接口调用总共有两个微服务参与其调用关系分别是A-B-C其中B服务还与Redis这样的第三方服务产生了调用关系、C服务则还需要调用MySQL数据库服务。所以实际上链路追踪所做的事情就是详细记录A-BB-Redis-CC-MySQL这条完整链路上的详细调用信息例如接口响应结果、耗时等。
那么这条调用链路上的数据到底是怎样被记录的呢接下来我们继续以上面的调用链为例分析下链路追踪信息的具体组成和传递形式以便进一步理解分布式链路追踪系统的原理和概念。具体逻辑示意图如下 如上图所示分布式链路追踪所监控的对象就是一次次调用所产生的链路图中1-8所示的就是一条完整的链路Trace系统会通过唯一的标识TraceId对此进行记录。而链路中的每一个依赖调用都会生成一个调用踪迹信息Span最开始生成的Span叫做根SpanRoot Span后续生成的Span都会将前一个Span 的标示Sid作为本Span信息的父IDPid。
这样以此类推Span信息就会随着链路的执行被进程内或跨进程进行上下文传递通过Span数据链就能将一次次链路调用所产生的踪迹信息串联起来而每一个Span之上附着的日志信息Annotation就是我们进行调用链监控分析的数据来源。这就是分布式链路追踪的基本原理。
而说到这里你可能会有疑问监控这么大的数据量是不是会很消耗系统资源的确如此所以大部分链路追踪系统都会存在一个叫做采样率Sampling的设定用来控制系统采集链路信息的比例从而提升系统性能。因为很多时候大量的链路信息都是相同的我们需要关注的可能也只是相对耗时较高、出错次数较多的链路而并没有必要100%的进行采集。
SkyWalking简介
前面我们从基本原理的角度说明了链路追踪是什么那么接下来我们将介绍下目前最流行的分布式链路追踪系统——SkyWalking。
SkyWalking是一款优秀的开源APMApplication Performance Management系统它不仅提供了链路追踪链路分析等分布式追踪功能还支持性能指标分析、应用和服务依赖性分析、服务拓扑图分析、报警等一系列应用性能监控相关的功能可以帮助我们有效地定位问题。
而从数据收集上看SkyWalking支持多种不同的数据来源及格式包括支持Java、.NET Core、NodeJS、PHP和Python等不同语言的无侵入式Agent探针以及对Service Mesh服务网格架构的支持等。其具体结构如下图所示 如上图所示SkyWalking的核心由链路收集服务器Receiver Cluster、聚合服务器AggregatorCluster组成。其中Receiver Cluster是整个后端服务接入的入口专门用于收集服务的各种指标及链路信息。
而AggregatorCluster则用于汇总、聚合收集器收集到的数据并最终将聚合数据存储到数据库中而具体存储方式可以有多种例如常见的ElasticSearch、MySQL、TIDB等我们可以根据实际需要进行选择。这些聚合数据后面可以用于告警设置也可以被GUI/CLI等可视化系统以HTTP的形式访问后进行可视化展示。
此外从数据采集逻辑上看SkyWalking支持多种语言探针及项目协议能够覆盖目前大部分主流的分布式技术栈具体来说主要有以下3种 Metrics System统计系统。支持直接从Prometheus中拉取度量指标数据到SkyWalking也支持程序自身通过micrometer推送数据 Agents业务探针。指在各个业务系统中集成探针服务来进行链路追踪即链路数据采集。SkyWalking支持Java、Go、.NET、PHP、NodeJS、Python、Nginx LUA等多种语言的探针。此外它还支持通过gRPC或者HTTP的方式来传递数据 Service MeshSkyWalking还支持对新一代微服务架构Service Mesh的监控可以通过特定的Service Mesh协议采集数据面、控制面的数据实现对服务网格链路数据的观测
上面的内容简单介绍了SkyWalking的基本情况并就其系统架构进行了简单分析。实际上SkyWalking最近两年发展得非常快社区也非常活跃在微服务链路追踪、应用性能监控领域被使用得也越来越广泛由于篇幅原因这里无法进行更深入的分享感兴趣的读者可以通过官方文档或社区进行深入了解
SkyWalking安装部署
前面的内容分别介绍了分布式链路追踪的基本原理并着重介绍了SkyWalking很显然写到这里就结束的话本文就没有啥价值了因为只是说了一堆正确的废话看了也就忘了这显然也不符合我分享的风格接下来我们就从实验的角度来玩一下SkyWalking。
以下内容需要进行实际实验操作如果在地铁上不方便可以先收藏有时间再具体实验玩下
对于SkyWalking的部署主要涉及到后端OAP Server和前端UI根据实际需要可以将它们部署在物理机、虚拟机或者Kubernetes集群之中。这里为了演示环境的一致性我们选择将SkyWalking的后端服务及UI分别部署到Kubernetes集群中。
而具体安装SkyWalking的方式可以通过官方提供的Kubernetes部署文件采用Helm方式安装也可以手动编写Kubernetes部署文件这里为了便于学习我们采用后一种方式。具体步骤如下
1)、在Kubernetes集群中创建一个单独运行SkyWalking容器的Namespace。命令如下
#通过kubectl连接Kubernetes集群后执行创建namespace命令$ kubectl create ns skywalking2)、编写SkyWalking-UI及OAP Server服务Kubernetes部署文件
在编写具体的Kubernetes部署文件的过程中需要指定SkyWalking-UI及OAP Server的容器镜像一般来说可以通过源码手动打包也可以直接使用官方已经打包好的镜像。这里为了方便演示采用Docker官方镜像仓库中已经打包好的镜像。具体如图所示 如果上面两张图所示我们分别在Docker Hub官方镜像仓库中找到了SkyWalking-UI及OAP Server的官方发布的容器镜像版本接下来编写具体的部署文件。
编写SkyWalking服务端Kubernetes部署文件skywalking-aop.yml具体内容如下
apiVersion: apps/v1
kind: Deployment
metadata:name: oapnamespace: sanyi-erp
spec:replicas: 1selector:matchLabels:app: oaprelease: skywalkingtemplate:metadata:labels:app: oaprelease: skywalkingspec:containers:- name: oapimage: apache/skywalking-oap-server:8.3.0-es7imagePullPolicy: IfNotPresentports:- containerPort: 11800name: grpc- containerPort: 12800name: rest---
apiVersion: v1
kind: Service
metadata:name: oapnamespace: sanyi-erplabels:service: oap
spec:ports:- port: 12800name: rest- port: 11800name: grpc- port: 1234name: pageselector:app: oap
以上是一个标准的Kubernetes部署文件关于文件中相关指令的具体含义可查阅Kubernetes相关的资料。
这里部署之后端口查询可以使用kebectl get svc -n skywalking 查看我使用的是腾讯云部署之后我手动的将svc服务的类型变成了nodePort
编写SkyWalking-UI部署文件(skywalking-ui.yml)具体内容如下
apiVersion: apps/v1
kind: Deployment
metadata:name: ui-deploymentnamespace: sanyi-erplabels:app: ui
spec:replicas: 1selector:matchLabels:app: uitemplate:metadata:labels:app: uispec:containers:- name: uiimage: apache/skywalking-ui:8.3.0ports:- containerPort: 8080name: pageenv:- name: SW_OAP_ADDRESSvalue: oap:12800
---
apiVersion: v1
kind: Service
metadata:name: uinamespace: sanyi-erplabels:service: ui
spec:ports:- port: 8080name: pagenodePort: 31235type: NodePortselector:app: ui
3)、根据编写的部署文件执行Kubernetes部署命令
根据前面步骤中编写的Kubernetes发布文件这里我们根据编写的发布文件直接执行部署命令具体如下 kubectl apply -f .
可以看到部署的SkyWalking服务都已经正常运行!如果是第一次部署拉取镜像的过程可能会比较慢一点。
4)、查看SkyWalking-UI的Web访问地址
经过上述步骤我们已经成功将SkyWalking-UI、OAP Server两个服务运行在Kubernetes集群之中。接下来通过SkyWalking-UI服务的映射端口k8s部署文件中定义是31234端口访问Web UI具体可通过http://NodeIP:31234进行访问例如
查询SkyWalking-UI所部署的Kubernetes集群Node节点的IP地址$ kubectl describe node kubernetesName: 如上图所示此时可以看到SkyWalking已成功运行由于尚无服务接入所以暂时还看不到有任何监控数据
后记
如前面所述内容我们已经在Kubernetes环境中将分布式链路追踪系统部署成功了另外由于还没有服务接入所以暂时还看不到任何链路追踪数据但是由于篇幅的原因这里就不继续介绍如何将Java微服务接入SkyWalking了但是这个这个接入过程却是非常有意思的因为它是我们作为研发人员进一步理解微服务程序与分布式链路追踪系统集成、交互的关键这部分我将作为续集在下一篇文章中给大家分享时间不会太久期待大家保持关注