Spring Cloud Alibaba(六)-链路追踪SkyWalking

Spring Cloud Alibaba(六)-链路追踪SkyWalking

Apache SkyWalking 学习笔记:微服务界的"天眼"系统

一、为什么要学 SkyWalking?(别让微服务变成"迷雾"服务)

想象一下,你是一个侦探(开发者),你的任务是调查一个案件(用户请求)。在单体应用里,这就像在一间房子里找线索,简单!但在微服务架构里,这个案件涉及了几十个不同的人(服务),分布在城市的不同角落(服务器),而且他们之间互相推诿:"不是我干的,是隔壁老王调用我时出错了!"

传统的日志监控就像只给你看每个人的日记,你根本理不清谁先谁后,谁坑了谁。这就是**链路追踪(Tracing)**诞生的原因,而 SkyWalking 就是你的"天眼",能让你看清整个调用链路的来龙去脉。

二、SkyWalking 是谁家的孩子?
  • 身世 :这是个国产 开源框架,2015年由吴晟大佬开源,后来加入了 Apache 孵化器,妥妥的"正规军"。
  • 定位 :它是一款 APM(应用性能管理) 工具。你可以把它理解为微服务的"体检中心",专门负责盯着微服务、云原生架构(Docker/K8s)的健康状况。
  • 功能:分布式追踪、性能指标分析、服务依赖分析、报警功能,甚至还管日志采集。
三、市面上的"侦探"哪家强?(框架对比)

市面上抓贼(追踪)的侦探不少,我们来比划比划:

  1. Zipkin(Twitter出品):轻量级,简单好用,但功能相对基础,属于"够用党"。
  2. Pinpoint(韩国出品):基于字节码注入,无侵入,UI很强大,但资源消耗有点大。
  3. CAT(大众点评出品):功能非常全,但需要改代码接入,有点"侵入式"。
  4. SkyWalking (中国出品):无侵入(不改代码),UI功能强,支持多种插件。综合来看,它是目前的"六边形战士",特别适合咱们国内的开发环境。
四、SkyWalking 的"三驾马车"(架构)

SkyWalking 的架构非常清晰,就像一个公司:

  • Agent(探针):这是你的"眼线",埋伏在各个微服务应用里,默默收集数据,然后悄悄上报。
  • OAP(后端服务):这是"大脑",负责接收探针发来的数据,进行清洗、计算和分析,然后把结果存到数据库。
  • UI(前端界面):这是"展示厅",它调用 OAP 的接口,把那些复杂的调用链路画成漂亮的图表给你看。

五、实战:手把手教你"装天眼"(安装步骤)

废话不多说,咱们现在就把这个"天眼"装起来,看看它到底有多神。

第一步:下载安装包

第二步:改个"吉利"的端口

SkyWalking 默认喜欢用 8080 端口,但那个端口太拥挤了(Tomcat 也爱用)。咱们得给它换个地儿。

  • 文件路径webapp/application.yml

  • 修改内容

    yaml 复制代码
    serverPort: ${SW_SERVER_PORT:-18080} # 把这里改成 18080 或者你喜欢的数字

    解释 :这样以后访问 UI 界面就是 localhost:18080,清爽!

第三步:启动服务

  • 操作 :进入 bin 目录,双击运行 startup.bat(Windows)或者 startup.sh(Linux/Mac)。
  • 发生了什么 :它会同时启动两个服务:
    1. skywalking-oap-server:监听 11800(收数据)和 12800(处理请求)端口。
    2. skywalking-web-ui:就是我们刚才改的那个 18080 端口。
  • 验证 :打开浏览器访问 localhost:18080,如果看到漂亮的 UI 界面,恭喜你,天眼已开启!

六、让微服务"戴上手环"(接入微服务)

SkyWalking 的核心卖点是无侵入,意思是你的代码一行都不用改!只需要在启动的时候给它加个"外挂"(JVM 参数)。

操作步骤:

  1. 找到你的微服务启动配置(IDEA 的 Run/Debug Configurations)。

  2. 在 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... 这里要换成你电脑上真实的路径。

  3. 启动微服务:启动后,随便调用一个接口,然后去 UI 界面刷新一下。如果看到你的服务名出现在列表里,说明它已经被"监控"了!


七、进阶:给天眼加个"存储卡"(数据持久化)

默认情况下,SkyWalking 用的是 H2 内存数据库 。这就像用手机自带的内存拍照,一旦手机(SkyWalking 服务)重启了,照片(监控数据)就全没了。

为了留住这些珍贵的"案底",我们需要给它配个"外置硬盘"------比如 MySQL。

操作步骤:

  1. 改配置 :打开 OAP 目录下的 config/application.yml
    • 找到 storage 模块,把 selectorh2 改成 mysql
  2. 配连接 :在 mysql 的配置块里,填上你的数据库地址、用户名和密码。
  3. 丢驱动 :去下载一个 mysql-connector-java-x.x.x.jar,把它扔进 SkyWalking 的 oap-libs 文件夹里。
  4. 建库 :去数据库里新建一个库(比如叫 skywalking)。
  5. 重启:重启 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

我们需要做两件事:

  1. 格式化输出 :在日志里加上一个 [%tid],这个 tid 就是 SkyWalking 的"身份证号"(Trace ID),有了它,日志才能和链路对上号。
  2. 换传输通道 :把原本输出到控制台的 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>

第三步:重启 & 验证

  1. 重启你的微服务。
  2. 调用一个接口,让它产生一点日志。
  3. 打开 SkyWalking UI,找到 "Logs"(日志) 菜单。
  4. 奇迹时刻:你应该能看到刚才打印的日志出现在了网页上!而且每一行日志旁边都对应着一个 Trace ID。

💡 小贴士(避坑指南)

  1. 版本对应

    • 如果你用的是 Log4j2 ,请引入 apm-toolkit-log4j-2.x 依赖,配置方式略有不同。
    • 如果你用的是 Logback 1.0.x,上面的配置没问题;如果是 1.1+,可能需要微调。
  2. 端口问题

    • 默认情况下,Log Appender 会尝试连接 OAP 服务器的 11800 端口(这是 gRPC 端口)。如果你改了端口,记得在配置里指定:

      xml 复制代码
      <!-- 在 appender 里加这个 -->
      <backend_service>127.0.0.1:11800</backend_service>
  3. 性能考量

    • 这种方式是通过网络把日志发给 SkyWalking,如果日志量巨大(比如每秒几万条),可能会压垮 OAP 服务。这时候建议还是用 ELK(Elasticsearch + Logstash + Kibana)那一套,或者只把 ERROR 级别的日志发给 SkyWalking。

现在,你的 SkyWalking 就真正变成了一个"全栈监控"工具,链路、指标、日志,一个都跑不掉!


十、补充小知识
  • OAL 脚本:SkyWalking 里有个叫 OAL(Observability Analysis Language)的东西,它是一种脚本语言,专门用来定义你要监控哪些指标。虽然现在用得少了,但面试时提一嘴显得你很专业。
  • 日志集成:SkyWalking 现在也能收集日志了(Log)。你只需要在 Logback 配置里加个 Layout,就能把日志里的 Trace ID 提取出来,这样你在 UI 界面上点一下调用链,就能直接看到当时的日志,简直是排错神器!
相关推荐
铁皮饭盒1 小时前
成为AI全栈 - 第1课:后端到底是干嘛的?一张图拆解登录
前端·后端·ai编程
wuminyu1 小时前
专家视角看Lambda表达式的原理解析
java·linux·c语言·jvm·c++
wangbing11251 小时前
Java处理csv文件总是丢数据
java·开发语言·python
Flynt1 小时前
LangGraph 生产环境跑了三个月,我的真实感受
后端
Rust语言中文社区1 小时前
【Rust日报】2026-04-28 Pacquet:pnpm 的 Rust 重写版本
开发语言·后端·rust
云烟成雨TD1 小时前
Spring AI 1.x 系列【30】向量数据库:核心 API 和入门案例
java·人工智能·spring
许彰午2 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
YaBingSec2 小时前
玄机网络安全靶场:Apache HTTPD 解析漏洞(CVE-2017-15715)WP
java·笔记·安全·web安全·php·apache
书源丶2 小时前
三十二、Java集合(一)——Collection与List全家桶
java·windows·list