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

计算机毕业设计springboot校园失物招领系统 基于Spring Boot的高校失物数字化管理系统 智慧校园物品遗失与寻回服务平台

计算机毕业设计springboot校园失物招领系统 基于Spring Boot的高校失物数字化管理系统 智慧校园物品遗失与寻回服务平台

计算机毕业设计springboot校园失物招领系统84md6cz6 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着高校规模扩大和校园活动日益频繁,师生物品遗失事件频发,传统公告栏、微信群等失物招领方式存在信息分散、匹配效率低、管理混乱等问题。同时,移动互联网技术的成熟为校园服务数字化转型提供了技术支撑。开发一套集成失物发布、智能检索、在线沟通、物品流转等功能的信息化平台,成为提升校园管理效率、构建和谐校园环境的迫切需求。 系统核心功能一览: 个人中心模块 —— 支持用户信息维护、密码修改、聊天记录查看、个人发布内容管理等基础功能 用户管理模块 —— 实现用户账号注册、信息审核、状态管理等全生命周期管理 物品分类模块 —— 建立标准化的物品分类体系,支持自定义分类设置与层级管理 失物招领模块 —— 拾得者发布失物信息(物品名称、数量、图片、分类、拾得时间、认领地址、认领状态、物品描述、联系方式、地理位置坐标等),支持评论互动与收藏关注 寻物启事模块 —— 失主发布寻物信息(

By Ne0inhk
Spring Boot 3 RestClient 完整教程

Spring Boot 3 RestClient 完整教程

Spring Boot 3 RestClient 完整教程 目录 1. RestClient 简介与环境准备 2. RestClient 基础使用 3. RestClient 高级特性 4. 实战案例:RESTful API 客户端实现 5. 最佳实践与性能优化 1. RestClient 简介与环境准备 1.1 RestClient 简介 RestClient 是 Spring Framework 6 引入的新的 HTTP 客户端。 作为 RestTemplate 的现代替代方案,提供了更简洁的 API、更好的响应式支持和函数式编程风格。 在 Spring Boot 3 中,RestClient 成为了推荐的

By Ne0inhk
详解SpringBoot+RabbitMQ完成应用通信

详解SpringBoot+RabbitMQ完成应用通信

目录 应用通信 需求描述 创建项目 创建空项目 创建Module(order-service) 创建Module(logistics-service) 消息类型为字符串 编写订单代码 编写物流代码 生产订单 消费订单 消息类型为对象 新增Module 编写订单代码 生产对象类型订单消息 解决办法1(实现序列化接口) 解决办法2(设置消息转换类型) 编写物流代码 消费对象类型订单消息 解决办法 应用通信 作为⼀个消息队列, RabbitMQ也可以⽤作应⽤程序之间的通信. 上述代码⽣产者和消费者代码放在不同的应⽤中即可完成不同应⽤程序的通信. 接下来我们来看, 基于SpringBoot+RabbitMQ完成应⽤间的通信. 需求描述 ⽤⼾下单成功之后, 通知物流系统, 进⾏发货。 订单系统作为⼀个⽣产者, 物流系统作为⼀个消费者。 创建项目

By Ne0inhk

LangChain: 从 LLM 调用到 Agent 架构

一、为什么要用 LangChain? 自从 OpenAI 推出 ChatGPT 之后,大模型能力迅速普及。越来越多的开发者开始将 LLM 接入业务系统,但很快会遇到三个现实问题: 1、模型接口不统一 —— 今天用 OpenAI,明天换国内模型,代码要大改 2、Prompt 难管理 —— 提示词到处拼字符串,无法版本控制 3、业务流程复杂 —— RAG、Agent、多工具调用,全是胶水代码 这时候,LangChain 就登场了。 LangChain 本质是一套 “面向大模型应用开发的工程化框架”,它把模型调用、Prompt 管理、知识检索、流程编排、Agent 调度全部抽象成可组合模块,让你像搭积木一样构建 AI 应用。 二、LangChain 架构全景 LangChain

By Ne0inhk