简介

  1. 国产开源组件,用于监视分布式系统应用的性能、链路追踪等
  2. 早期微服务架构的链路追踪的标配组件为 sleuth + zipkin,为Twitter开源
  3. 其他链路跟踪产品:Pinpoint-韩国人、CAT-大众点评
  4. skywk 基于Java探针+字节码增强技术实现,客户端通过gRPC接入
  5. 对比看,skywk探针对业务系统吞吐量影响最小,且基本做到对业务零侵入
  6. 核心功能特点:
  • 支持语言探针和service mesh获得监控数据
  • 探针语言支持Java、.Net core 、Node JS
  • 轻量级,无需大量服务器资源
  • 模块化,UI、存储、集群管理支持多种可选
  • 支持告警
  1. 整体架构
  • 主要包括:agent、OAP、Storage、UI四个部分

链路追踪 云原生 链路追踪开源组件_链路追踪 云原生

  1. 三种探针机制
  • Agent、基于ByteBuddy字节码增强技术实现,通过jvm agent参数加载,应用运行时,拦JIE指定方法来收集数据
  • SDK,显示调用收集数据,对应用有侵入
  • Service Mesh,通过网络代理收集数据

使用

下载安装

  1. 下载:http://skywalking.apache.org/downloads/
  2. 本地学习可以下载支持H2/MySQL等存储的tar包
  3. 解压后,大概浏览下目录,基本一目了然
  4. 默认使用内嵌H2数据库,本地可以先不用修改
  5. 启动:./bin/startup.sh

链路追踪 云原生 链路追踪开源组件_网络_02

  1. 默认会监控3个端口:11800(收集监控数据)、12800(接受前端请求)、8080(UI)
  2. 修改UI端口:webapp/webapp.yml
  3. 启动后,访问8080端口

链路追踪 云原生 链路追踪开源组件_linux_03

应用配置(通过Agent)

  1. 准备一个springboot应用
  2. idea中配置JVM参数
-javaagent:D:\data\soft\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=ebs-base-service
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.2.8:11800
  1. 启动

链路追踪 云原生 链路追踪开源组件_大数据_04

  1. 如果使用 jar启动,配置参数
java -javaagent:D:\data\soft\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar -DSW_AGENT_NAME=springboot-skywalking-demo -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.2.8:11800 -jar springboot-base-service.jar
  1. 如果配置成shell启动脚本
#!/bin/sh
# SkyWalking Agent配置
export SW_AGENT_NAME=springboot-base-service 
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.2.8:11800
export JAVA_AGENT=-javaagent:/usr/local/skywalking-agent.jar 
java $JAVA_AGENT -jar springboot-base-service.jar
  1. 多个微服务的配置如上一样,一个个都加上agent配置即可

链路追踪 云原生 链路追踪开源组件_大数据_05

链路追踪 云原生 链路追踪开源组件_链路追踪 云原生_06

  1. 对于网关gateway服务,链路跟踪不显示问题,需要手动拷贝下拷贝agent/optional-plugins目录下的gateway.jar 到 agent/plugins目录下

链路追踪 云原生 链路追踪开源组件_java_07

  1. 告警通知配置在config/alarm-settings.yml中配置,支持网络钩子回调
  2. 持久化支持:MySQL、ES,一般生产环境都会使用es

自定义扩展

  1. 引入依赖
<!-- SkyWalking 工具类 -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.4.0</version>
</dependency>
  1. 使用
@Trace(operationName = "获取用户信息")
    @Tags({@Tag(key = "module", value = "user"), @Tag(key = "userId", value = "arg[0]")})
    @GetMapping("user/get")
    @ApiOperation(value = "测试跨服务调用获取用户信息", notes = "跨服务调用获取用户信息,传入用户ID")
    public R<UserVO> callBaseUserApi(@RequestParam(value = "id") Long id) {

        log.info("测试跨服务调用获取用户信息");

        TraceContext.putCorrelation("name", "qinchen");
        String traceId = TraceContext.traceId();
        log.info("本次请求的 traceId = {}", traceId);
    }
  1. 还支持集成日志框架,通过grpc上报日志,自行百度,感觉没啥用,一般用loki或elk记录 log 比较专业

集群部署

  1. 需要将oap服务注册到nacos上,cluster.selector 配成 nacos即可,默认为standalone
  2. 存储使用es集群
  3. UI可以集群,用nginx反代即可
  4. 不过链路追踪这种监控服务部署集群意义不大,土豪公司可以考虑