Spring Cloud Alibaba(六)-链路追踪SkyWalking
Apache SkyWalking 学习笔记:微服务界的"天眼"系统
一、为什么要学 SkyWalking?(别让微服务变成"迷雾"服务)
想象一下,你是一个侦探(开发者),你的任务是调查一个案件(用户请求)。在单体应用里,这就像在一间房子里找线索,简单!但在微服务架构里,这个案件涉及了几十个不同的人(服务),分布在城市的不同角落(服务器),而且他们之间互相推诿:"不是我干的,是隔壁老王调用我时出错了!"
传统的日志监控就像只给你看每个人的日记,你根本理不清谁先谁后,谁坑了谁。这就是**链路追踪(Tracing)**诞生的原因,而 SkyWalking 就是你的"天眼",能让你看清整个调用链路的来龙去脉。
二、SkyWalking 是谁家的孩子?
- 身世 :这是个国产 开源框架,2015年由吴晟大佬开源,后来加入了 Apache 孵化器,妥妥的"正规军"。
- 定位 :它是一款 APM(应用性能管理) 工具。你可以把它理解为微服务的"体检中心",专门负责盯着微服务、云原生架构(Docker/K8s)的健康状况。
- 功能:分布式追踪、性能指标分析、服务依赖分析、报警功能,甚至还管日志采集。
三、市面上的"侦探"哪家强?(框架对比)
市面上抓贼(追踪)的侦探不少,我们来比划比划:
- Zipkin(Twitter出品):轻量级,简单好用,但功能相对基础,属于"够用党"。
- Pinpoint(韩国出品):基于字节码注入,无侵入,UI很强大,但资源消耗有点大。
- CAT(大众点评出品):功能非常全,但需要改代码接入,有点"侵入式"。
- SkyWalking (中国出品):无侵入(不改代码),UI功能强,支持多种插件。综合来看,它是目前的"六边形战士",特别适合咱们国内的开发环境。
四、SkyWalking 的"三驾马车"(架构)
SkyWalking 的架构非常清晰,就像一个公司:
- Agent(探针):这是你的"眼线",埋伏在各个微服务应用里,默默收集数据,然后悄悄上报。
- OAP(后端服务):这是"大脑",负责接收探针发来的数据,进行清洗、计算和分析,然后把结果存到数据库。
- UI(前端界面):这是"展示厅",它调用 OAP 的接口,把那些复杂的调用链路画成漂亮的图表给你看。
五、实战:手把手教你"装天眼"(安装步骤)
废话不多说,咱们现在就把这个"天眼"装起来,看看它到底有多神。
第一步:下载安装包
- 地址 :去 Apache 的归档网站下载:https://archive.apache.org/dist/skywalking/
- 注意 :下载解压后的文件夹路径绝对不能包含中文!不然它会报错,因为它"看不懂"中文路。
第二步:改个"吉利"的端口
SkyWalking 默认喜欢用 8080 端口,但那个端口太拥挤了(Tomcat 也爱用)。咱们得给它换个地儿。
-
文件路径 :
webapp/application.yml -
修改内容 :
yamlserverPort: ${SW_SERVER_PORT:-18080} # 把这里改成 18080 或者你喜欢的数字解释 :这样以后访问 UI 界面就是
localhost:18080,清爽!
第三步:启动服务
- 操作 :进入
bin目录,双击运行startup.bat(Windows)或者startup.sh(Linux/Mac)。 - 发生了什么 :它会同时启动两个服务:
skywalking-oap-server:监听 11800(收数据)和 12800(处理请求)端口。skywalking-web-ui:就是我们刚才改的那个 18080 端口。
- 验证 :打开浏览器访问
localhost:18080,如果看到漂亮的 UI 界面,恭喜你,天眼已开启!
六、让微服务"戴上手环"(接入微服务)
SkyWalking 的核心卖点是无侵入,意思是你的代码一行都不用改!只需要在启动的时候给它加个"外挂"(JVM 参数)。
操作步骤:
-
找到你的微服务启动配置(IDEA 的 Run/Debug Configurations)。
-
在 VM options 里加上这三行"咒语":
bash-javaagent:C:\path\to\skywalking-agent\skywalking-agent.jar # 这是你刚才解压的 agent 包路径 -DSW_AGENT_NAME=your-service-name # 这个名字会显示在 UI 上,比如叫 "order-service" -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # 告诉它 OAP 服务器在哪注意 :
C:\path\to...这里要换成你电脑上真实的路径。 -
启动微服务:启动后,随便调用一个接口,然后去 UI 界面刷新一下。如果看到你的服务名出现在列表里,说明它已经被"监控"了!
七、进阶:给天眼加个"存储卡"(数据持久化)
默认情况下,SkyWalking 用的是 H2 内存数据库 。这就像用手机自带的内存拍照,一旦手机(SkyWalking 服务)重启了,照片(监控数据)就全没了。
为了留住这些珍贵的"案底",我们需要给它配个"外置硬盘"------比如 MySQL。
操作步骤:
- 改配置 :打开 OAP 目录下的
config/application.yml。- 找到
storage模块,把selector从h2改成mysql。
- 找到
- 配连接 :在
mysql的配置块里,填上你的数据库地址、用户名和密码。 - 丢驱动 :去下载一个
mysql-connector-java-x.x.x.jar,把它扔进 SkyWalking 的oap-libs文件夹里。 - 建库 :去数据库里新建一个库(比如叫
skywalking)。 - 重启:重启 SkyWalking 服务。你会发现它自动帮你建了一堆表!现在,即使服务重启,数据也不会丢失了。
八、高手秘籍:自定义追踪与报警
有时候,我们想追踪一些特殊的业务方法,或者在系统出问题时自动报警。
1. 自定义追踪(给代码加标签)
虽然 Agent 能自动追踪 HTTP 请求,但如果你想追踪某个具体的业务方法,可以给它加个注解。
-
加依赖 :
xml<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.5.0</version> </dependency> -
加注解 :
java@Service public class MyService { @Trace // 加上这个,这个方法就会出现在 SkyWalking 的追踪链路里 @Tags({ @Tag(key = "返回值", value = "returnedObj") //可以记录返回值 @Tag(key = "参数", value = "arg[0]") // 还能把参数也记下来 }) public void doBusiness(String param) { // 业务逻辑 } }
2. 报警机制(保姆级看护)
不想半夜盯着屏幕看?那就设置报警!SkyWalking 默认配置文件里已经写好了一些规则(比如响应时间超过 1 秒就报警)。
- 原理 :它会通过 Webhook(网络钩子)发一个 HTTP POST 请求给你指定的接口。
- 实战:你可以写一个简单的 Controller,接收这个报警 JSON,然后自动发邮件或者发短信给你。
java
@RestController
@RequestMapping("/skAlarm")
public class SkAlarmController {
@RequestMapping("/getMsg")
public void getMsg(@RequestBody List<SkAlarmDTO> skAlarmDTOList){
System.out.println("接收消息,然后进行处理-发送短信,发送邮件");
StringBuilder sb = new StringBuilder();
for (SkAlarmDTO dto : skAlarmDTOList) {
sb.append("\nscopeId: ").append(dto.getScopeId())
.append("\nscope: ").append(dto.getScope())
.append("\n目标 Scope 的实体名称: ").append(dto.getName())
.append("\nScope 实体的 ID: ").append(dto.getId0())
.append("\nid1: ").append(dto.getId1())
.append("\n告警规则名称: ").append(dto.getRuleName())
.append("\n告警消息内容: ").append(dto.getAlarmMessage())
.append("\n告警时间: ").append(dto.getStartTime())
.append("\n‐‐‐‐‐‐‐‐‐‐‐‐‐‐--------------------------‐\n");
}
System.out.println(sb);
}
}
配置 :在 config/alarm-settings.yml 里,把 webhooks 地址改成你的接口地址即可。
yaml
webhooks:
- http://127.0.0.1:80/skAlarm/getMsg
哈哈,看来你的眼睛像鹰一样锐利!刚才那份笔记为了追求"无侵入"的极致体验,确实差点把"日志集成"这位重量级嘉宾给忘了。
既然你提到了,那咱们必须把这个环节补上!在微服务的世界里,光看链路不看日志,就像看悬疑电影没有结局,非常难受。SkyWalking 的日志功能,能让你直接在 UI 上看到代码报错的堆栈信息,简直是排错神器。
这就为你补充这份**"日志篇"特辑**,咱们把它加到刚才的笔记里!
九:SkyWalking 日志集成(把日志也抓进天眼)
一、为什么要搞日志?
想象一下,你通过 SkyWalking 发现了一个慢请求(链路追踪),你心里想:"这货到底在哪个环节炸了?"
如果没有集成日志,你得去服务器上翻几十个文件找 log,累死个人。
如果集成了日志,你只需要在 SkyWalking 的 UI 界面上,对着那个红色的异常节点点一下,Boom! 直接弹出当时的报错堆栈。这体验,简直爽歪歪。
二、实战:手把手接入日志(保姆级教程)
咱们现在的目标是:让微服务产生的日志,自动发送给 SkyWalking 的 OAP 服务器,然后在 UI 上显示。
第一步:加个"翻译官"依赖
你的微服务(Spring Boot)需要一个工具,能把 Logback 里的日志"翻译"成 SkyWalking 能听懂的语言。
xml
<!-- pom.xml 里加上这个 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<!-- 注意:这里看你用的是 logback 还是 log4j2 -->
<!-- 大多数人用 logback,所以加这个 -->
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.5.0</version>
</dependency>
第二步:改配置文件(关键一步)
找到你项目里的 logback-spring.xml 或者 logback.xml。
我们需要做两件事:
- 格式化输出 :在日志里加上一个
[%tid],这个tid就是 SkyWalking 的"身份证号"(Trace ID),有了它,日志才能和链路对上号。 - 换传输通道 :把原本输出到控制台的 Appender,换成 SkyWalking 专用的
GRPCLogClientAppender,让它直接把日志发给 OAP 服务器。
logback.xml 配置代码(直接复制):
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 1. 定义日志输出格式 -->
<!-- 注意看这里:加了 [%tid] -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} [%tid] - %msg%n"/>
<!-- 2. 定义 SkyWalking 专用的 Appender -->
<!-- 这个 Appender 会通过 gRPC 协议,直接把日志发给 SkyWalking 后端 -->
<appender name="skywalking" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<!-- 使用 SkyWalking 提供的特殊布局 -->
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${log.pattern}</pattern>
</layout>
</encoder>
</appender>
<!-- 3. 启用这个 Appender -->
<root level="INFO">
<appender-ref ref="skywalking"/>
</root>
</configuration>
第三步:重启 & 验证
- 重启你的微服务。
- 调用一个接口,让它产生一点日志。
- 打开 SkyWalking UI,找到 "Logs"(日志) 菜单。
- 奇迹时刻:你应该能看到刚才打印的日志出现在了网页上!而且每一行日志旁边都对应着一个 Trace ID。
💡 小贴士(避坑指南)
-
版本对应:
- 如果你用的是 Log4j2 ,请引入
apm-toolkit-log4j-2.x依赖,配置方式略有不同。 - 如果你用的是 Logback 1.0.x,上面的配置没问题;如果是 1.1+,可能需要微调。
- 如果你用的是 Log4j2 ,请引入
-
端口问题:
-
默认情况下,Log Appender 会尝试连接 OAP 服务器的 11800 端口(这是 gRPC 端口)。如果你改了端口,记得在配置里指定:
xml<!-- 在 appender 里加这个 --> <backend_service>127.0.0.1:11800</backend_service>
-
-
性能考量:
- 这种方式是通过网络把日志发给 SkyWalking,如果日志量巨大(比如每秒几万条),可能会压垮 OAP 服务。这时候建议还是用 ELK(Elasticsearch + Logstash + Kibana)那一套,或者只把 ERROR 级别的日志发给 SkyWalking。
现在,你的 SkyWalking 就真正变成了一个"全栈监控"工具,链路、指标、日志,一个都跑不掉!
十、补充小知识
- OAL 脚本:SkyWalking 里有个叫 OAL(Observability Analysis Language)的东西,它是一种脚本语言,专门用来定义你要监控哪些指标。虽然现在用得少了,但面试时提一嘴显得你很专业。
- 日志集成:SkyWalking 现在也能收集日志了(Log)。你只需要在 Logback 配置里加个 Layout,就能把日志里的 Trace ID 提取出来,这样你在 UI 界面上点一下调用链,就能直接看到当时的日志,简直是排错神器!