简介
-
国产开源组件,用于监视分布式系统应用的性能、链路追踪等
-
早期微服务架构的链路追踪的标配组件为 sleuth + zipkin,为Twitter开源
-
其他链路跟踪产品:Pinpoint-韩国人、CAT-大众点评
-
skywk 基于Java探针+字节码增强技术实现,客户端通过gRPC接入
-
对比看,skywk探针对业务系统吞吐量影响最小,且基本做到对业务零侵入
-
核心功能特点:
- 支持语言探针和service mesh获得监控数据
- 探针语言支持Java、.Net core 、Node JS
- 轻量级,无需大量服务器资源
- 模块化,UI、存储、集群管理支持多种可选
- 支持告警
-
整体架构
- 主要包括:agent、OAP、Storage、UI四个部分
-
三种探针机制
- Agent、基于ByteBuddy字节码增强技术实现,通过jvm agent参数加载,应用运行时,拦JIE指定方法来收集数据
- SDK,显示调用收集数据,对应用有侵入
- Service Mesh,通过网络代理收集数据
使用
下载安装
- 下载:http://skywalking.apache.org/downloads/
- 本地学习可以下载支持H2/MySQL等存储的tar包
- 解压后,大概浏览下目录,基本一目了然
- 默认使用内嵌H2数据库,本地可以先不用修改
- 启动:
./bin/startup.sh
- 默认会监控3个端口:11800(收集监控数据)、12800(接受前端请求)、8080(UI)
- 修改UI端口:webapp/webapp.yml
- 启动后,访问8080端口
应用配置(通过Agent)
- 准备一个springboot应用
- 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
- 启动
- 如果使用 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
- 如果配置成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
- 多个微服务的配置如上一样,一个个都加上agent配置即可
- 对于网关gateway服务,链路跟踪不显示问题,需要手动拷贝下拷贝agent/optional-plugins目录下的gateway.jar 到 agent/plugins目录下
- 告警通知配置在config/alarm-settings.yml中配置,支持网络钩子回调
- 持久化支持:MySQL、ES,一般生产环境都会使用es
自定义扩展
- 引入依赖
<!-- SkyWalking 工具类 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.4.0</version>
</dependency>
- 使用
@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);
}
- 还支持集成日志框架,通过grpc上报日志,自行百度,感觉没啥用,一般用loki或elk记录 log 比较专业
集群部署
- 需要将oap服务注册到nacos上,cluster.selector 配成 nacos即可,默认为standalone
- 存储使用es集群
- UI可以集群,用nginx反代即可
- 不过链路追踪这种监控服务部署集群意义不大,土豪公司可以考虑