SkyWalking - Spring Cloud Alibaba 全链路追踪实战

SkyWalking - Spring Cloud Alibaba 全链路追踪实战
在这里插入图片描述
👋 大家好,欢迎来到我的技术博客!
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕SkyWalking这个话题展开,希望能为你带来一些启发或实用的参考。
🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!

文章目录

SkyWalking - Spring Cloud Alibaba 全链路追踪实战 🚀

在微服务架构日益普及的今天,一个请求往往需要穿越多个服务才能完成。这种分布式调用虽然带来了系统解耦和扩展性优势,但也给问题排查、性能分析和系统监控带来了巨大挑战。当用户反馈“系统变慢”或“请求失败”时,我们如何快速定位问题发生在哪个服务?是数据库慢了?还是某个中间件响应延迟?亦或是网络抖动?这时候,全链路追踪(Distributed Tracing) 就显得尤为重要。

Apache SkyWalking 是一款开源的 APM(Application Performance Monitoring)系统,专为微服务、云原生和容器化环境设计。它提供了强大的分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。而 Spring Cloud Alibaba 则是一套基于 Spring Cloud 的微服务开发工具集,它整合了阿里巴巴的中间件,如 Nacos(服务发现与配置中心)、Sentinel(流量控制)、Seata(分布式事务)等,极大地简化了微服务应用的开发和治理。

将 SkyWalking 与 Spring Cloud Alibaba 结合,可以构建一个功能强大、可观测性极佳的微服务系统。本文将带你从零开始,搭建一个基于 Spring Cloud Alibaba 的微服务项目,并集成 SkyWalking,实现端到端的全链路追踪。

1. 环境准备与核心概念 🧰

在动手之前,我们需要先了解一些核心概念,并准备好必要的环境。

1.1 核心概念解析

  • Trace(追踪): 一次完整的请求调用链。从用户发起请求到最终返回结果,整个过程中所有经过的服务和操作都属于同一个 Trace。
  • Span(跨度): Trace 中的一个基本工作单元。例如,一个服务内部的方法调用、一次数据库查询、一次 HTTP 请求都可以是一个 Span。Span 之间存在父子关系,共同构成一棵调用树。
  • Segment(片段): SkyWalking 特有的概念。在一个 JVM 进程内,一次 Trace 可能会生成多个 Segment。每个 Segment 代表了该进程内的一段连续的执行路径。SkyWalking Agent 会将这些 Segment 上报给 OAP Server,OAP Server 再将它们拼接成完整的 Trace。
  • OAP Server(Observability Analysis Platform): SkyWalking 的后端服务,负责接收、分析、聚合来自各个 Agent 的数据,并提供查询接口。
  • UI: SkyWalking 提供的 Web 可视化界面,用于展示拓扑图、服务列表、追踪详情、性能指标等。
  • Agent: 一个 Java Agent,以 -javaagent 参数的方式挂载到你的 Java 应用上。它会在不修改你代码的情况下,通过字节码增强技术自动收集应用的追踪数据和性能指标。

1.2 环境准备

为了顺利进行本次实战,你需要准备以下环境:

  1. JDK 8+: 用于编译和运行 Java 应用。
  2. Maven: 用于项目依赖管理和构建。
  3. Docker & Docker Compose: 用于快速部署 SkyWalking 后端服务(OAP Server + UI)和 Nacos。
  4. IDEA 或其他 Java IDE: 用于开发。

首先,我们需要启动 SkyWalking 和 Nacos。这里我们使用 docker-compose 来一键部署。

创建一个 docker-compose.yml 文件:

version:'3.8'services:nacos:image: nacos/nacos-server:v2.2.3 container_name: nacos-standalone environment:- MODE=standalone ports:-"8848:8848"-"9848:9848"# 用于 gRPC 通信restart: always oap:image: apache/skywalking-oap-server:9.7.0 container_name: skywalking-oap ports:-"11800:11800"# gRPC 端口 (旧版)-"12800:12800"# HTTP 端口environment:- SW_STORAGE=h2 # 使用 H2 内存数据库,生产环境请用 ESdepends_on:- nacos restart: always ui:image: apache/skywalking-ui:9.7.0 container_name: skywalking-ui ports:-"8080:8080"environment:- SW_OAP_ADDRESS=oap:12800depends_on:- oap restart: always 

在终端中执行 docker-compose up -d,等待几分钟,所有服务就会启动完毕。

  • Nacos: 访问 http://localhost:8848/nacos,默认账号密码都是 nacos
  • SkyWalking UI: 访问 http://localhost:8080,即可看到 SkyWalking 的仪表盘。

现在,我们的基础设施已经就绪!接下来,让我们开始构建微服务应用。

2. 构建 Spring Cloud Alibaba 微服务项目 🏗️

我们将构建一个简单的电商场景:用户下单。这个场景涉及两个核心服务:

  • order-service: 订单服务,负责创建订单。
  • inventory-service: 库存服务,负责扣减库存。

order-service 会通过 Feign 调用 inventory-service

2.1 创建父工程

首先,创建一个 Maven 父工程 skywalking-sca-demo,用于统一管理依赖版本。

<!-- pom.xml --><?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>skywalking-sca-demo</artifactId><version>1.0.0</version><packaging>pom</packaging><modules><module>order-service</module><module>inventory-service</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version><relativePath/></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-cloud.version>2021.0.8</spring-cloud.version><spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version></properties><dependencyManagement><dependencies><!-- Spring Cloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.2 构建 inventory-service(库存服务)

这是一个简单的服务,提供一个 /deduct 接口用于扣减库存。

  1. 添加依赖 (pom.xml):
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>skywalking-sca-demo</artifactId><version>1.0.0</version></parent><artifactId>inventory-service</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Nacos 服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies></project>
  1. 配置文件 (application.yml):
server:port:8082spring:application:name: inventory-service # 服务名,在 Nacos 中注册cloud:nacos:discovery:server-addr: localhost:8848# Nacos 地址# 开启 Actuator 健康检查端点,便于 SkyWalking 监控management:endpoints:web:exposure:include:'*'
  1. 主启动类:
packagecom.example.inventory;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication@EnableDiscoveryClient// 启用服务发现publicclassInventoryServiceApplication{publicstaticvoidmain(String[] args){SpringApplication.run(InventoryServiceApplication.class, args);}}
  1. 控制器:
packagecom.example.inventory.controller;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.web.bind.annotation.*;@RestController@RequestMapping("/inventory")publicclassInventoryController{privatestaticfinalLogger log =LoggerFactory.getLogger(InventoryController.class);@PostMapping("/deduct")publicStringdeduct(@RequestParamString productId,@RequestParamInteger count){ log.info("收到扣减库存请求: productId={}, count={}", productId, count);// 模拟业务处理时间try{Thread.sleep(200);}catch(InterruptedException e){Thread.currentThread().interrupt();} log.info("库存扣减成功");return"success";}}

2.3 构建 order-service(订单服务)

这个服务会暴露一个 /create 接口,并通过 Feign 调用 inventory-service

  1. 添加依赖 (pom.xml):
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>skywalking-sca-demo</artifactId><version>1.0.0</version></parent><artifactId>order-service</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Nacos 服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- OpenFeign 用于服务间调用 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies></project>
  1. 配置文件 (application.yml):
server:port:8081spring:application:name: order-service cloud:nacos:discovery:server-addr: localhost:8848# Feign 配置feign:client:config:default:connectTimeout:5000readTimeout:5000management:endpoints:web:exposure:include:'*'
  1. 主启动类:
packagecom.example.order;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;importorg.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients// 启用 FeignpublicclassOrderServiceApplication{publicstaticvoidmain(String[] args){SpringApplication.run(OrderServiceApplication.class, args);}}
  1. 定义 Feign Client:
packagecom.example.order.feign;importorg.springframework.cloud.openfeign.FeignClient;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;// value 指向 Nacos 中注册的服务名@FeignClient(value ="inventory-service")publicinterfaceInventoryFeignClient{@PostMapping("/inventory/deduct")Stringdeduct(@RequestParam("productId")String productId,@RequestParam("count")Integer count);}
  1. 控制器:
packagecom.example.order.controller;importcom.example.order.feign.InventoryFeignClient;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;@RestController@RequestMapping("/order")publicclassOrderController{privatestaticfinalLogger log =LoggerFactory.getLogger(OrderController.class);@AutowiredprivateInventoryFeignClient inventoryFeignClient;@PostMapping("/create")publicStringcreateOrder(@RequestParamString userId,@RequestParamString productId,@RequestParamInteger count){ log.info("收到创建订单请求: userId={}, productId={}, count={}", userId, productId, count);// 调用库存服务String result = inventoryFeignClient.deduct(productId, count); log.info("订单创建成功");return"order created, inventory result: "+ result;}}

2.4 验证基础功能

现在,我们可以分别启动两个服务。

  1. 启动 inventory-service
  2. 启动 order-service

访问 Nacos 控制台 (http://localhost:8848/nacos),你应该能看到 order-serviceinventory-service 都已成功注册。

然后,使用 curl 或 Postman 调用订单服务:

curl-X POST "http://localhost:8081/order/create?userId=1&productId=P001&count=1"

如果返回 order created, inventory result: success,说明我们的微服务调用链路是通的!

然而,此时如果我们想了解这次调用的详细耗时、经过了哪些服务,或者排查性能瓶颈,我们无从下手。这就是 SkyWalking 大显身手的时候了。

3. 集成 SkyWalking Agent 🕵️‍♂️

SkyWalking 的核心在于其 Java Agent。它通过字节码增强技术,在应用运行时动态地注入追踪逻辑,无需修改一行业务代码。

3.1 下载 SkyWalking Agent

访问 Apache SkyWalking 官方下载页面,下载与你的 OAP Server 版本(9.7.0)匹配的 Agent 包。通常选择 apache-skywalking-java-agent-*.tar.gz

下载后,将其解压到一个目录,例如 /opt/skywalking-agent。解压后的目录结构大致如下:

skywalking-agent/ ├── activations/ ├── bootstrap-plugins/ ├── config/ │ └── agent.config <-- 主配置文件 ├── licenses/ ├── logs/ ├── optional-plugins/ ├── plugins/ └── skywalking-agent.jar <-- 核心 Jar 包 

3.2 配置 Agent

我们需要对 config/agent.config 文件进行一些关键配置。

# The service name in UI agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} # Backend service addresses. collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800} # Logging file name logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api.log} # Logging level logging.level=${SW_LOGGING_LEVEL:INFO} 

我们将为两个服务创建各自的配置文件,以区分它们在 SkyWalking UI 中的显示。

inventory-service 创建配置:
skywalking-agent/config/ 目录下创建 inventory-service.config:

agent.service_name=inventory-service collector.backend_service=127.0.0.1:11800 

order-service 创建配置:
skywalking-agent/config/ 目录下创建 order-service.config:

agent.service_name=order-service collector.backend_service=127.0.0.1:11800 

3.3 启动应用并挂载 Agent

现在,我们需要通过 -javaagent 参数来启动我们的 Java 应用。

启动 inventory-service
java -javaagent:/opt/skywalking-agent/skywalking-agent.jar \-Dskywalking.agent.config_path=/opt/skywalking-agent/config/inventory-service.config \-jar inventory-service/target/inventory-service-1.0.0.jar 
启动 order-service
java -javaagent:/opt/skywalking-agent/skywalking-agent.jar \-Dskywalking.agent.config_path=/opt/skywalking-agent/config/order-service.config \-jar order-service/target/order-service-1.0.0.jar 
注意: 请将 /opt/skywalking-agent 替换为你实际的 Agent 路径。

启动成功后,你会在应用的日志中看到类似 [SkyWalking Agent] ... 的信息,表明 Agent 已成功加载。

3.4 验证追踪效果

再次调用我们的订单接口:

curl-X POST "http://localhost:8081/order/create?userId=1&productId=P001&count=1"

然后,打开 SkyWalking UI (http://localhost:8080)。

  1. 查看服务拓扑图:
    在左侧菜单栏点击 Topology。你会看到一个清晰的拓扑图,展示了 order-serviceinventory-service 之间的调用关系。箭头方向表示调用流向。HTTPFeign/HTTPBrowser/Userorder-serviceinventory-service
  2. 查看追踪列表:
    点击 Trace 菜单。在这里,你可以看到所有被追踪的请求。找到你刚刚发起的请求(可以通过时间、Endpoint /order/create 来筛选),点击它。
  3. 分析追踪详情:
    在追踪详情页,你会看到一个非常直观的瀑布流图(Gantt Chart)。它清晰地展示了整个调用链路:通过这个图,你可以一目了然地看出哪个环节最耗时。例如,如果 inventory-service 的处理时间很长,那么问题很可能出在库存服务本身。
    • 最顶层是 order-service/order/create 请求。
    • 展开后,可以看到它内部调用了 inventory-service/inventory/deduct
    • 每个 Span 都标注了耗时,以及发生的时间线。

4. 深入 SkyWalking:自定义追踪与告警 ⚙️

虽然 SkyWalking Agent 已经为我们自动追踪了大部分场景(如 Spring MVC, Feign, JDBC, Redis 等),但在某些复杂的业务逻辑中,我们可能希望手动创建 Span 来追踪特定的代码块,或者设置告警规则。

4.1 手动埋点(Manual Context Propagation)

假设在 order-service 中,除了调用库存服务,我们还需要记录一个重要的业务日志到数据库,并且我们希望这个数据库操作也能体现在追踪链路中。

  1. 添加数据库依赖:
    order-service/pom.xml 中添加 H2 数据库和 MyBatis 依赖(仅用于演示)。
<dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version></dependency>
  1. 配置数据库 (application.yml):
spring:# ... 其他配置datasource:url: jdbc:h2:mem:testdb driver-class-name: org.h2.Driver username: sa password: password 
  1. 在 Service 中手动埋点:
    SkyWalking 提供了 TraceContext API 来手动创建 Span。

创建 Mapper 和实体:

// Order.javapublicclassOrder{privateLong id;privateString userId;privateString productId;privateInteger count;// getters and setters...}// OrderMapper.java@MapperpublicinterfaceOrderMapper{@Insert("INSERT INTO orders(user_id, product_id, count) VALUES(#{userId}, #{productId}, #{count})")voidinsert(Order order);}
packagecom.example.order.service;importcom.example.order.feign.InventoryFeignAssistant;importcom.example.order.mapper.OrderMapper;importcom.example.order.model.Order;importorg.apache.skywalking.apm.toolkit.trace.Trace;importorg.apache.skywalking.apm.toolkit.trace.TraceContext;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassOrderService{privatestaticfinalLogger log =LoggerFactory.getLogger(OrderService.class);@AutowiredprivateInventoryFeignAssistant inventoryFeignAssistant;@AutowiredprivateOrderMapper orderMapper;// 使用 @Trace 注解可以自动为方法创建 Span@TracepublicStringcreateOrder(String userId,String productId,Integer count){ log.info("开始创建订单");// 手动创建一个 Span 来包裹数据库操作String before =TraceContext.traceId();// 获取当前 TraceIdtry(finalvar ignored =TraceContext.createLocalSpan("OrderService.saveToDB")){Order order =newOrder(); order.setUserId(userId); order.setProductId(productId); order.setCount(count); orderMapper.insert(order); log.info("订单已保存到数据库");}// 调用库存服务(Feign 调用会被自动追踪)String result = inventoryFeignAssistant.deduct(productId, count); log.info("订单创建流程结束");return"success";}}

同时,别忘了在 Controller 中调用这个 Service。

// OrderController.java@AutowiredprivateOrderService orderService;@PostMapping("/create")publicStringcreateOrder(...){return orderService.createOrder(userId, productId, count);}

现在,当你再次发起请求并在 SkyWalking UI 中查看追踪详情时,你会发现多了一个名为 OrderService.saveToDB 的 Span,它精确地反映了数据库插入操作的耗时。

4.2 配置告警

SkyWalking 不仅能追踪,还能根据预设的规则进行告警。这对于及时发现线上问题至关重要。

SkyWalking 的告警规则配置在 OAP Server 的 config/alarm-settings.yml 文件中。由于我们是用 Docker 启动的,需要进入容器进行修改。

  1. 添加一个简单的告警规则:
    例如,我们希望当 order-service/order/create 接口的平均响应时间超过 500ms 时,触发告警。

编辑告警配置文件:

vi config/alarm-settings.yml 

进入 OAP 容器:

dockerexec-it skywalking-oap /bin/sh 
rules:# Rule unique name, must be unique.service_resp_time_rule:# Metrics names to be monitored. Only one metric per rule is allowed.metrics-name: service_resp_time # The threshold of the metrics. The value should be a number.threshold:500# The period of time in minutes to evaluate the metrics.period:10# How many times after the metrics exceed the threshold, will trigger alarm.count:1# The silence period in minutes after alarm triggered.silence-period:10# Define the scope of the rule.include-names:- order-service exclude-names:- .*unstable.*# Regular expression, if you want to exclude some services.# The message format for the alarm.message: Response time of service {name} is more than {value} ms in {period} minutes. webhooks:# Add your webhook URL here to receive alarm messages.# - http://your-webhook-url

重启 OAP 容器:
修改完配置后,需要重启容器使配置生效。

docker restart skywalking-oap 

现在,如果你故意在 order-service 中增加一个长时间的 Thread.sleep(600),然后持续调用接口,SkyWalking 就会触发告警。告警信息会显示在 UI 的 Alarm 菜单中。

提示: 在生产环境中,通常会将告警消息通过 Webhook 发送到钉钉、企业微信或 Slack 等即时通讯工具,以便团队能第一时间收到通知。

5. 高级特性与最佳实践 🧠

掌握了基础用法后,让我们探讨一些更高级的特性和在生产环境中应该遵循的最佳实践。

5.1 日志集成(Log Integration)

追踪(Trace)和日志(Log)是可观测性的两大支柱。将它们关联起来,可以极大地提升问题排查效率。SkyWalking 支持将 TraceId 和 SpanId 注入到应用日志中。

  1. 配置 logback-spring.xml:
    resources 目录下创建 logback-spring.xml 文件。

pom.xml 中添加依赖:

<!-- SkyWalking Logback 插件 --><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.16.0</version><!-- 与 Agent 版本保持一致 --></dependency>
<configuration><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><encoderclass="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layoutclass="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</pattern></layout></encoder></appender><rootlevel="INFO"><appender-refref="STDOUT"/></root></configuration>

关键点在于 %tid,它会被 SkyWalking Agent 自动替换为当前的 TraceId。

现在,当你查看应用日志时,每条日志都会带上一个唯一的 TraceId。例如:

2023-10-27 10:00:00.123 [TID:1234567890abcdef] [http-nio-8081-exec-1] INFO c.e.o.c.OrderController - 收到创建订单请求... 

在 SkyWalking UI 的追踪详情页,你也可以直接点击 Logs 标签,看到与该 Trace 关联的所有日志,前提是你的日志系统(如 ELK)也集成了 SkyWalking 的日志格式。

5.2 性能剖析(Profile)

当某个接口突然变慢,但常规的追踪无法定位到具体是哪一行代码导致的,这时就可以使用 SkyWalking 的 Performance Profiling 功能。它可以在不重启应用的情况下,对指定的 Endpoint 进行 CPU 热点分析。

  1. 在 SkyWalking UI 中,进入 Trace 页面,找到那个慢的请求。
  2. 在该 Trace 的详情页,点击右上角的 Profile 按钮。
  3. 设置采样间隔(如 10ms)和最大采样数(如 1000)。
  4. 确认后,SkyWalking 会自动在目标 JVM 上开启一个剖析任务。
  5. 任务完成后,你可以在 Profile 菜单中看到详细的火焰图(Flame Graph),它能精确地告诉你 CPU 时间都花在了哪些方法上。

这是一个非常强大的在线诊断工具,对于解决偶发性性能问题极为有效。

5.3 生产环境最佳实践

  1. 存储选型: 本文为了方便,使用了 H2 内存数据库。但在生产环境中,必须使用 Elasticsearch 作为 SkyWalking 的后端存储,以保证数据的持久化和高可用性。
  2. Agent 升级: 尽量保持 Agent 和 OAP Server 的版本一致,以避免兼容性问题。
  3. 采样率: 对于高流量的应用,可以适当调整采样率(agent.sample_n_per_3_secs),避免上报过多数据给 OAP Server 带来压力。
  4. 安全: OAP Server 的 gRPC 和 HTTP 端口应做好网络安全隔离,避免暴露在公网。
  5. 资源监控: 监控 OAP Server 本身的 CPU、内存和磁盘 I/O,确保其健康运行。

6. 总结与展望 🌈

通过本文的实战,我们成功地将 Apache SkyWalking 集成到了一个基于 Spring Cloud Alibaba 的微服务项目中。我们不仅实现了自动化的全链路追踪,还学习了如何手动埋点、配置告警、集成日志以及使用性能剖析等高级功能。

SkyWalking 以其无侵入性强大的可视化能力丰富的生态系统,成为了微服务可观测性领域的佼佼者。它帮助我们从“盲人摸象”式的故障排查,转变为“上帝视角”下的精准定位,极大地提升了研发和运维效率。

未来,随着云原生和 Service Mesh 的进一步发展,SkyWalking 也在积极拥抱 eBPF、OpenTelemetry 等新技术,为更复杂的混合架构提供统一的可观测性解决方案。对于每一位致力于构建稳定、高效、可维护的现代应用的开发者来说,掌握 SkyWalking 这样的 APM 工具,已经成为一项必备技能。

希望这篇详尽的实战指南能为你在微服务之路上点亮一盏明灯!✨


🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨

Read more

Flutter 组件 cleany 适配鸿蒙 HarmonyOS 实战:自动化清理矩阵,构建复杂应用的状态闭环与资源防腐架构

Flutter 组件 cleany 适配鸿蒙 HarmonyOS 实战:自动化清理矩阵,构建复杂应用的状态闭环与资源防腐架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 cleany 适配鸿蒙 HarmonyOS 实战:自动化清理矩阵,构建复杂应用的状态闭环与资源防腐架构 前言 在鸿蒙(OpenHarmony)生态迈向多任务并行、长周期驻留及高频账户流转的全场景办公与生活背景下,如何确保应用在退出登录、环境切换或异常恢复时能够“不留痕迹”地销毁脏数据,已成为衡量应用健壮性的核心指标。在鸿蒙设备这类强调分布式沙箱隔离与严苛内存占用(Resident Set Size)管控的环境下,如果应用缺乏统一的资源清理机制,由于由于散落在各处的 Stream 监听、本地缓存及内存单例,极易由于由于状态残留导致不同用户间的数据越权或 UI 状态的逻辑死锁。 我们需要一种能够集中注册清理任务、支持并发异步销毁且具备原子性执行保障的状态复位框架。 cleany 为 Flutter 开发者引入了极其暴力且高效的“全域清算”范式。它通过中心化的管理器(Manager),允许各个业务模块在初始化时注册其对应的资源回收钩子。在适

By Ne0inhk
Spring Boot AOP(五) 高级特性与源码实践

Spring Boot AOP(五) 高级特性与源码实践

博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送ZEEKLOG评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/ZEEKLOG自动化运营脚本 有兴趣的加文末联系方式,备注自己的ZEEKLOG昵称,拉你进群,互相学习共同进步。 文章目录 * Spring Boot AOP(五) 高级特性与源码实践 * 1. 高级特性概述 * 2. 自定义 Pointcut * Mermaid 图:自定义 Pointcut 匹配流程 * 3. 自定义 Advice

By Ne0inhk
Flutter 组件 meeting_place_core 的适配 鸿蒙Harmony 实战 - 驾驭分布式会议引擎、实现鸿蒙端高性能协作空间与复杂信令分发方案

Flutter 组件 meeting_place_core 的适配 鸿蒙Harmony 实战 - 驾驭分布式会议引擎、实现鸿蒙端高性能协作空间与复杂信令分发方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 meeting_place_core 的适配 鸿蒙Harmony 实战 - 驾驭分布式会议引擎、实现鸿蒙端高性能协作空间与复杂信令分发方案 前言 在后疫情时代的协同办公浪潮中,视频会议已经从单一的垂直应用演变为鸿蒙(OpenHarmony)生态中“泛在协作”的核心基础设施。当你在鸿蒙平板上开启一场跨国技术评审,或者在鸿蒙车机上紧急连线公司晨会时,支撑这一切流畅运行的,是底层极其复杂的会议核心引擎。 meeting_place_core 是一套工业级的、专为多端同步设计的会议核心抽象包。它不负责 UI 渲染,而是专注于房间管理(Room Management)、成员状态流转、信令推送及媒体流的逻辑编排。 适配到鸿蒙平台后,结合鸿蒙强大的分布式能力,meeting_place_core 能让你的 App 轻松实现“手机开会,大屏投映,

By Ne0inhk
Spring Cloud动态配置刷新:@RefreshScope与@Component的深度解析

Spring Cloud动态配置刷新:@RefreshScope与@Component的深度解析

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? * 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️ Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻 Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡 全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀 目录 * Spring Cloud动态配置刷新:@RefreshScope与@Component的深度解析 * 引言 * 1. `@RefreshScope` 的作用与原理 * 1.1 什么是 `@RefreshScope`? * 1.

By Ne0inhk