• 微服务链路追踪-SkyWalking


    一、为什么需要链路追踪?

    由于微服务化项目拆分,会导致系统服务间调用链路愈发复杂,此时,一个前端请求可能最终需要调用多个后端服务才能完成实现。

    微服务间调用链路可能是这样:

    当整个请求不可用出现问题时,我们是没有办法判断请求是由哪个服务端引发问题,这时我们需要浏览多个服务端的日志去快速定位故障点,找到调用异常的服务,跟进一个请求到底有哪些服务参与,参与顺序是怎样,从而达到每个请求的步骤清晰可见并且如果有新同事加入,不能快速的知道自己所负责的服务在哪一环等等,于是就有了分布式系统调用跟踪的需求。

    链路追踪已经不是什么新兴技术和概念了,其可使用组件有很多,比如:sleuth、Zipkin、阿里鹰眼、大众点评Cat、SkyWalkIng等等…

    这些组件有一个共同的名字: APM 工具 (Application Performance Management)即应用性能监控工具。

    二、链路追踪组件之SkyWalking

    (1)是什么是SkyWalking

     SkyWalking是中国人吴晟(华为)开源的一款APM工具,现在已属于Apache旗下开源项目, 是一个观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

    (2)SkyWalkIng与ZipKin对比

    至于为什么要采用此二者对比,因为我目前就用过这两个,zipkin是最早接触spring cloud项目用过,目前呢,是在学习SkyWalkIng。

    ZipKin:Twitter公司开源的一个分布式追踪工具,被Spring Cloud Sleuth集成,使用广泛而稳定。

    ZIpKIn优缺点:

    优点:轻量级,springcloud集成,使用人数多,成熟。

    缺点:侵入性,功能简单,欠缺APM报表能力(能力弱)。

    Sleuth的作用是在系统中自动埋点并把数据发送给zipkin,zipkin的作用是存储这些数据并展现。

    SkyWalking:中国人吴晟(华为)开源的一款分布式追踪,分析,告警的工具,现已属于Apache旗下开源项目。

    SkyWalking 优缺点:

    优点:多种监控手段多语言自动探针,Java,.NET Core 和 Node.JS,轻量高效,不需要大数据,模块化,UI、存储、集群管理多种机制可选,支持告警,社区活跃。

    缺点:较为新兴,成熟度不够高。

    (3) SkyWalking 组成部分

    Probes:探针,探针因使用的语言不同而不通,收集数据并且格式化为skywalking所需的格式。

    Platform backend :平台后端,对应于zipkin server,可以集群部署,聚合,分析,将数据展示在UI中。

    Storage:存储,可扩展的存储,可以使es,H2,MySQL集群默认 h2。

    UI :丰富的可视化功能,提供身份验证。

    仪表盘:对项目的监控,看项目是如何运转的,链路过程情况。拓扑图:就是整个图形的演示。追踪:就是碰到一些问题。告警:碰到问题的告警。

    官网架构图一:

    官网架构图二:

    三、SkyWalkIng的部署及使用

    我们去官网下载es7-8.1.0 版本,下载界面如下:

    解压之后,Windows环境中启动startup.bat,Linux环境中启动startup.sh即可(通过jps命令查看)。

     (1)本地开发部署探针处理(IDEA部署)

    SkyWalkIng在我们的微服务项目中虽然不需要额外引入依赖包,但是为了给SkyWalkIng 发送我们的链路信息,实际上还需要一个探针。

    Probes:探针,探针因使用的语言不同而不通,收集数据并且格式化为skywalking所需的格式。

    因为我开发语言为java,则需要java探针,即Java Agent 服务器探针。

    那么探针在哪里来呢?

    Java Agent 服务器探针:

    解压后,Java Agent 所处的位置在解压后文件夹

    apache-skywalking-apm-es7-8.1.0\apache-skywalking-apm-bin-es7\agent 目录下:

    我们需要给每个想要由SkyWalkIng管理的项目添加JVM 启动参数:

    1. -javaagent:D:\skywalking\agent\skywalking-agent.jar
    2. -Dskywalking.agent.service_name=demo
    3. -Dskywalking.collector.backend_service=localhost:11800

    启动项目后,我们再来看一下SKyWalkIng管理UI端(http://localhost:8080),有信息,则说明探针部署成功了。

    (2)Jar包方式部署探针处理
    1. java -javaagent:D:/google/apache-skywalking-apm-es7-8.0.1/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -Dskywalking.agent.service_name=demo -Dskywalking.collector.backend_service=localhost:11800
    2. -jar springcloud-demo-0.0.1-SNAPSHOT.jar

    (3)Docker方式部署探针处理
    1、部署Elasticsearch

    拉取镜像

    docker pull elasticsearch:7.6.2

    指定单机启动

    注:通过ES_JAVA_OPTS设置ES初始化内存,否则在验证时可能会起不来

    1. docker run --restart=always -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" \
    2. -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
    3. --name='elasticsearch' --cpuset-cpus="1" -m 2G -d elasticsearch:7.6.2

    验证es安装成功

    浏览器地址栏输入:http://IP:9200/

    可以安装 kibana 一起使用

    2、部署Skywalking OAP

    拉取镜像

    docker pull apache/skywalking-oap-server:8.1.0-es7

    启动Skywalking OAP

    注:–link后面的第一个参数和elasticsearch容器名一致;

    -e SW_STORAGE_ES_CLUSTER_NODES:es7也可改为你es服务器部署的Ip地址,即ip:9200

    1. docker run -d --name skywalking-oap \
    2. --restart=always \
    3. -e TZ=Asia/Shanghai \
    4. -p 12800:12800 \
    5. -p 11800:11800 \
    6. --link elasticsearch:elasticsearch \
    7. -e SW_STORAGE=elasticsearch7 \
    8. -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
    9. apache/skywalking-oap-server:8.1.0-es7
    3、部署Skywalking UI

    拉取镜像

    docker pull apache/skywalking-ui:8.1.0

    启动Skywalking UI

    注:–link后面的第一个参数和skywalking OAP容器名一致;

    1. docker run -d --name skywalking-ui \
    2. --restart=always \
    3. -e TZ=Asia/Shanghai \
    4. -p 8088:8080 \
    5. --link oap:oap \
    6. -e SW_OAP_ADDRESS=oap:12800 \
    7. apache/skywalking-ui:8.1.0
    4、应用程序配合Skywalking Agent部署

    构建基础镜像,将我们的skywalking-agent 文件包含在内,提供给java服务使用

    1. FROM centos:7
    2. WORKDIR /app
    3. RUN yum install -y wget && \
    4. yum install -y java-1.8.0-openjdk
    5. ADD https://mirror.bit.edu.cn/apache/skywalking/8.1.0/apache-skywalking-apm-es7-8.1.0.tar.gz /app
    6. RUN tar -xf apache-skywalking-apm-es7-8.1.0.tar.gz && \
    7. mv apache-skywalking-apm-bin-es7 skywalking
    8. RUN ls /app
    9. docker build -t base/skywalking:1.0 .

    构建服务镜像 order-demo

    1. FROM base/skywalking:1.0
    2. COPY springcloud-order-1.0.jar /app/app.jar
    3. EXPOSE 9002
    4. ENTRYPOINT [“java”,
    5. “-javaagent:/app/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=order-demo -Dskywalking.collector.backend_service=xxxx:11800 -Dserver.port=9002 -jar app.jar”]
    docker build -t order-demo:1.0 -f /docker/lei/Dockerfile  .
    5、通过挂载的方式(推荐)

    在启动脚本中把把服务器上的agent文件挂载在容器内部

    -v /usr/local/apache-skywalking/agent/:/app/agent/  \

    在Dockerfile文件中添加启动参数

    ENTRYPOINT ["java", "-javaagent:/app/agent/skywalking-agent.jar","-Dskywalking.collector.backend_service=IP:11800","-Dskywalking.agent.service_name=order-demo"]
    (4)k8s方式部署探针处理

    先在服务器中部署elasticsearch用来做存储,在oap中修改以es来做存储方式。

    1、创建skywalking-oap的yaml
    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: skywalking-oap
    5. namespace: default
    6. labels:
    7. app: skywalking-oap
    8. spec:
    9. replicas: 1
    10. selector:
    11. matchLabels:
    12. app: skywalking-oap
    13. template:
    14. metadata:
    15. labels:
    16. app: skywalking-oap
    17. spec:
    18. containers:
    19. - env:
    20. - name: SW_STORAGE
    21. value: elasticsearch7 ##存储方式
    22. - name: SW_STORAGE_ES_CLUSTER_NODES
    23. value: 10.0.24.5:9200 ##es地址
    24. name: skywalking-oap
    25. image: apache/skywalking-oap-server:8.1.0-es7 ##镜像
    26. imagePullPolicy: IfNotPresent ##如果存在就不拉去取
    27. ports:
    28. - containerPort: 11800
    29. name: grpc
    30. - containerPort: 12800
    31. name: rest
    32. ---
    33. apiVersion: v1
    34. kind: Service
    35. metadata:
    36. name: skywalking-oap
    37. namespace: default
    38. labels:
    39. service: skywalking-oap
    40. spec:
    41. ports:
    42. - port: 12800
    43. name: rest
    44. - port: 11800
    45. name: grpc
    46. selector:
    47. app: skywalking-oap
    2、创建skywalking-ui的yaml
    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: skywalking-ui
    5. namespace: default
    6. labels:
    7. app: skywalking-ui
    8. spec:
    9. replicas: 1
    10. selector:
    11. matchLabels:
    12. app: skywalking-ui
    13. template:
    14. metadata:
    15. labels:
    16. app: skywalking-ui
    17. spec:
    18. containers:
    19. - name: skywalking-ui
    20. image: apache/skywalking-ui:8.1.0
    21. ports:
    22. - containerPort: 8080
    23. name: page
    24. env:
    25. - name: SW_OAP_ADDRESS
    26. value: skywalking-oap:12800 ##skywalking-oap监听端口
    27. ---
    28. apiVersion: v1
    29. kind: Service
    30. metadata:
    31. name: skywalking-ui
    32. namespace: default
    33. labels:
    34. service: skywalking-ui
    35. spec:
    36. ports:
    37. - port: 8080
    38. name: page
    39. nodePort: 30200
    40. type: NodePort
    41. selector:
    42. app: skywalking-ui
    3、k8s中部署 skywalking-oap.yaml、skywalking-ui.yaml
    1. kubectl create -f skywalking-oap.yaml
    2. kubectl create -f skywalking-ui.yaml

    4、k8s 部署项目增加skywalking链路追踪(通过挂载的方式)
    1. apiVersion: extensions/v1beta1 #版本
    2. kind: Deployment #资源类型
    3. metadata:
    4. labels:
    5. workload.user.cattle.io/workloadselector: deployment-cloud-web-monitor #标签,k8s对于资源控制主要是根据labels和selector进行的
    6. name: web-monitor #资源名称
    7. namespace: deafult #所属命名空间
    8. spec:
    9. progressDeadlineSeconds: 600
    10. replicas: 1 #一个pod
    11. revisionHistoryLimit: 10
    12. selector:
    13. matchLabels:
    14. workload.user.cattle.io/workloadselector: deployment-cloud-web-monitor
    15. strategy:
    16. rollingUpdate:
    17. maxSurge: 1
    18. maxUnavailable: 0
    19. type: RollingUpdate #发布策略
    20. template: #创建模板
    21. metadata:
    22. labels:
    23. workload.user.cattle.io/workloadselector: deployment-cloud-web-monitor
    24. spec:
    25. containers:
    26. - env:
    27. - name: JAVA_OPTS
    28. value: -Xmx3550M -Xms3550M -Xmn2G -Xss256k
    29. - name: SKYWALKING_OPTS
    30. value: -javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=web-monitor -Dskywalking.collector.backend_service=skywalking-oap:11800
    31. image: 192.1.1.1/project/web-monitor:stable #镜像
    32. imagePullPolicy: Always #镜像拉取策略
    33. name: web-monitor #容器名称
    34. ports:
    35. - containerPort: 8513 #暴露端口
    36. name: 8513tcp02
    37. protocol: TCP
    38. resources:
    39. limits:
    40. memory: 4Gi
    41. stdin: true
    42. terminationMessagePath: /dev/termination-log
    43. terminationMessagePolicy: File
    44. tty: true
    45. volumeMounts: #容器内挂载点
    46. - mountPath: /log
    47. name: vol1
    48. - mountPath: /skywalking/agent/ #挂载在容器内的路径
    49. name: skywalking
    50. dnsPolicy: ClusterFirst
    51. restartPolicy: Always #重启策略
    52. schedulerName: default-scheduler
    53. securityContext: {}
    54. terminationGracePeriodSeconds: 30
    55. volumes:
    56. - name: vol1
    57. persistentVolumeClaim: #挂载的pvc
    58. claimName: log-pvc
    59. - name: skywalking
    60. hostPath:
    61. path:/usr/local/apache-skywalking/agent/ #宿主机挂载点

    K8s快速生成yaml模板文件

    1. kubectl create deployment nginx --image=nginx -o yaml --dry-run > mynginx.yaml
    2. 或者
    3. kubectl get deploy nginx -o=yaml --export > mynginx2.yaml

    四、配置SkyWalking日志收集(logback为例)

    pom 中依赖 SkyWalking 的 logback 插件包:

    1. <!-- SkyWalking log collection -->
    2. <dependency>
    3. <groupId>org.apache.skywalking</groupId>
    4. <artifactId>apm-toolkit-logback-1.x</artifactId>
    5. <version>8.1.0</version>
    6. </dependency>

    添加或修改 logback.xml,启用 SkyWalking 提供的 appender,示例配置如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration scan="true" scanPeriod="10 seconds">
    3. <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    4. <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    5. <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
    6. <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
    7. </layout>
    8. </encoder>
    9. </appender>
    10. <appender name="grpc" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
    11. <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    12. <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
    13. <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
    14. </layout>
    15. </encoder>
    16. </appender>
    17. <root level="INFO">
    18. <appender-ref ref="stdout"/>
    19. <appender-ref ref="grpc"/>
    20. </root>
    21. </configuration>

  • 相关阅读:
    antdesign中, 单个页面同时存在多个上传按钮
    mutex互斥锁 - linux内核锁(四)
    【算法训练-回溯算法 零】回溯算法解题框架
    【Mybatis编程:查询相册数据列表】
    关于多线程的一切:原子操作
    leetcode40.组合总和II(去重思路精讲,经典题也可以有困难的思考!)
    Vue中的 配置项 setup
    nodejs+vue高校校图书馆elementui
    日期模拟器(改变check即可 手切日期)
    Dash初探:如何将Label和Dropdown放在一行
  • 原文地址:https://blog.csdn.net/zxz547388910/article/details/136699610