关于Spring Cloud + Dubbo的链路追踪及traceId方案及思考(1)

  • 背景
  • 实现方案
    • 1. SkyWalking作为项目中的APM工具
      • 1.1 SkyWalking服务端搭建
      • 1.2项目中Skywalking客户端使用

背景

在大型的微服务中,一个请求可能会经过多个服务,而且服务分布在成百上千的服务器中。一旦出问题或者需要做请求响应时间的优化,我们到底如何快速定位和分析问题出现在哪个服务呢?

单个请求到响应都会形成一条服务调用链路。

随着服务的越来越多,对调用链的分析会越来越复杂。它们之间的调用关系也许如下:

我们需要一些工具帮我们分析链路的行为和性能问题,这些工具就是APM(应用性能管理)工具。目前主流的微服务APM工具有Zipkin、Pinpoint、SkyWalking。

  • Zipkin是Twitter开源的调用链分析工具,目前基于Spring Cloud Sleuth得到了广泛的使用,特点是轻量,使用部署简单。缺点是对代码有侵入性。

  • Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。

  • SkyWalking是国内开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前使用厂商最多,版本更新较快,已成为 Apache 基金会顶级项目。

    优缺点及性能分析请参考:分布式服务监控zipkin、Pinpoint、SkyWalking分析

实现方案

1. SkyWalking作为项目中的APM工具

参考分布式服务监控zipkin、Pinpoint、SkyWalking分析的分析,从性能、功能、界面、活跃度来看,我选择SkyWalking作为我项目中的APM工具。

1.1 SkyWalking服务端搭建

  • 首先需要本地有ElasticSearch环境,因为SkyWalking官方推荐使用ES作为存储方案。具体ES搭建我使用docker搭建,大家可以根据自己的需要,参考网上资料搭建。

    docker-compose.yml

    version: '3.3'
    services:elasticsearch:image: wutang/elasticsearch-shanghai-zone:6.3.2container_name: elasticsearchrestart: alwaysports:- 9200:9200- 9300:9300environment:cluster.name: elasticsearch
    
  • 运行SkyWalking服务端两种方式
    (1)Linux直接安装SkyWalking服务端

    • 在Linux安装SkyWalking需要jdk的运行环境,官方下载地址http://skywalking.apache.org/downloads/,因为我们的ES版本是6的,所以选择SkyWalking的6.6.0版本的linux版本下载
    • 修改配置及启动
    • 下载完成后解压缩,进入 apache-skywalking-apm-bin/config 目录并修改 application.yml 配置文件
storage:elasticsearch:nameSpace: ${SW_NAMESPACE:""}clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.160.105:9200}protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
#    trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
#    trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}user: ${SW_ES_USER:""}password: ${SW_ES_PASSWORD:""}indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
#    # Those data TTL settings will override the same settings in core module.recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is dayotherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is daymonthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month
#    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.htmlbulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requestsflushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requestsconcurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requestsresultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
#  elasticsearch7:
#    nameSpace: ${SW_NAMESPACE:""}
#    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
#    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
#    trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
#    trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}
#    user: ${SW_ES_USER:""}
#    password: ${SW_ES_PASSWORD:""}
#    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
#    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
#    # Those data TTL settings will override the same settings in core module.
#    recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day
#    otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is day
#    monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month
#    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
#    bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
#    flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
#    concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
#    resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
#    metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
#    segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
#  h2:
#    driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
#    url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
#    user: ${SW_STORAGE_H2_USER:sa}
#    metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
#  mysql:
#    properties:
#      jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest"}
#      dataSource.user: ${SW_DATA_SOURCE_USER:root}
#      dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@1234}
#      dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
#      dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
#      dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
#      dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
  • 启动/apache-skywalking-apm-bin/bin/startup.sh

(2)docker安装SkyWalking服务端(比较方便,推荐)
docker-compose.yml如下

version: '3.3'
services:oap:image: apache/skywalking-oap-server:6.6.0-es6container_name: skywalking-oaprestart: alwaysports:- 11800:11800- 12800:12800environment:- SW_STORAGE=elasticsearch #Es的存储- SW_STORAGE_ES_CLUSTER_NODES=192.168.160.105:9200 # Es的节点地址,配置es的地址- TZ=Asia/Shanghai #设定东八区的城市,防止Oap记录数据时用0时区ui:image: apache/skywalking-ui:6.6.0container_name: skywalking-uidepends_on:- oaplinks:- oaprestart: alwaysports:- 8080:8080 #默认8080端口,这里设置18080映射到宿主机,可修改environment:collector.ribbon.listOfServers: oap:12800

1.2项目中Skywalking客户端使用

  • Java Agent 探针,参考官网Setup java agent
  • (1)解压之前下载的SkyWalking包apache-skywalking-apm-bin,在agent目录下找到skywalking-agent.jar。复制全路径,我本地为E:\apache-skywalking-apm-bin\agent\skywalking-agent.jar
  • (2)在idea中配置VM options:
-javaagent:E:\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=light-demo-center
-Dskywalking.collector.backend_service=192.168.160.105:11800
  • (3)启动项目后,多次发出项目请求,到SkyWalking服务端UI可以看到如下效果:



具体的SkyWalking使用可以参考SkyWalking官网

下一篇,我们讲解如何在日志中查找同一条链路的日志吧,敬请期待。

关于Spring Cloud + Dubbo的链路追踪及traceId方案及思考(1)相关推荐

  1. Spring Cloud/Dubbo 应用无缝迁移到 Serverless 架构

    背景 通过前面几节课程的学习,相信大家对于 SAE 平台已经有了一定的了解,SAE 基于 IaaS 层资源构建的一款 Serverles 应用托管产品,免除了客户很多复杂的运维工作,开箱即用.按用量付 ...

  2. 利用Zipkin对Spring Cloud应用进行服务追踪分析

    设想这么一种情况,如果你的微服务数量逐渐增大,服务间的依赖关系越来越复杂,怎么分析它们之间的调用关系及相互的影响? 服务追踪分析 一个由微服务构成的应用系统通过服务来划分问题域,通过REST请求服务A ...

  3. 阿里巴巴微服务核心手册:Spring Boot+Spring cloud+Dubbo

    前言 微服务作为一项在云中部署应用和服务的新技术已成为当下最新的热门话题.但大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说 API 应该是重点. 企业和服务提供商正在寻找 ...

  4. 超形象理解CDN,Spring cloud,Dubbo总结

    CDN的全称是Content DeliveryNetwork,即内容分发网络.其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘" ...

  5. Sentinel 成为 Spring Cloud 官方推荐的主流熔断降级方案

    近日,Sentinel 贡献的 spring-cloud-circuitbreaker-sentinel  模块正式被Spring Cloud社区合并至 Spring Cloud Circuit Br ...

  6. 微服务.链路追踪概述和方案 (Cat Zipkin Skywaking,Sluth等组件对比选型)

    概述 为什么追踪链路 1. 单体应用 过渡 到微服务 2. 微服务 必须导致 调用熵增加 3. 单体应用中两个问题显现出来:根据日志查询问题:调用链路和调用的性能. 4. 日志问题在以后的日志方案中研 ...

  7. 这可能是全网Spring Cloud Gateway限流最完整的方案了!

        作者:aneasystone     https://www.aneasystone.com/ 话说在 Spring Cloud Gateway 问世之前,Spring Cloud 的微服务世 ...

  8. 14 基于网关Spring Cloud Zuul的接口限流实现方案

    在Spring Cloud Zuul网关中,限流业务是放在前置过滤器实现的,也就是在请求被Zuul转发给微服务之前进行限流.另外,当前置过滤器中同时存在限流.鉴权.身份认证等业务时,应该将限流业务放在 ...

  9. dubbo分布式系统链路追踪_zipkin

    基础知识储备 分布式跟踪的目标 一个分布式系统由若干分布式服务构成,每一个请求会经过多个业务系统并留下足迹,但是这些分散的数据对于问题排查,或是流程优化都很有限,要能做到追踪每个请求的完整链路调用,收 ...

最新文章

  1. python绘制可多角度查看的3d图像
  2. 微信朋友圈,QQ空间,微博等列表展示的功能实现
  3. CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)
  4. MySQL远程工具链接报错—1130
  5. 信息学奥赛一本通 2060:【例1.1】计算机输出
  6. 字符串的切割操作(strtok,split)
  7. 模拟登陆教务处获取成绩
  8. 为什么32.768kHz的晶振封装这么另类?
  9. 面向Web应用的并发压力测试工具——Locust实用攻略
  10. 史上最简单的土地利用转移矩阵分析(附练习数据下载)
  11. javascript时钟代码
  12. java的重载和重写实例_java中重写和重载的区别
  13. 网易MuMu模拟器安装及配置
  14. 前端优化之二 图片优化——质量与性能的博弈
  15. 小文一篇,说说:where、:has和:is的特殊性吧
  16. element 树形表格行列转换(行列转换系列2)
  17. 关于RapidSSL证书
  18. 【Android】通用系列 —— 快速搭建设置界面
  19. IntelliJ:idea取消启动时的默认工作空间,打开欢迎页面
  20. CNC+CRC/SoftPLC/OpenCASCADE/CAD/CAM开源项目收藏

热门文章

  1. Android10power有哪些功能,Android 功耗(10)---电流波形图(power monitor)
  2. SocketInputStream.socketRead0 导致线程hangs的解决方案
  3. 存储那些事儿(三):OpenStack的块存储Cinder与商业存储的融合
  4. 初步学习软件测试的一些思考
  5. 2019年3月WHQL认证最新申请流程
  6. MySql求第二高薪水
  7. sqlplus操作oracle
  8. Centos安装firefox
  9. 「牛客网C」初学者入门训练BC139,BC158
  10. reportportal 集成 robotframework 自动化执行及结果可视化