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

Spring Security 从入门到实战:搞定认证授权,再也不用手写权限逻辑

Spring Security 从入门到实战:搞定认证授权,再也不用手写权限逻辑

✨道路是曲折的,前途是光明的! 📝 专注C/C++、Linux编程与人工智能领域,分享学习笔记! 🌟 感谢各位小伙伴的长期陪伴与支持,欢迎文末添加好友一起交流! * 目录 * 前言 * 一、Spring Security 是什么? * 1.1 核心功能 * 二、技术组成分布 * 三、认证流程解析 * 3.1 请求处理流程 * 3.2 过滤器链结构 * 四、快速开始 * 4.1 添加依赖 * 4.2 基础配置 * 五、认证机制详解 * 5.1 内存认证(开发测试) * 5.2 数据库认证(生产推荐) * 六、授权控制方式 * 6.1 注解方式

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 google_maps 在鸿蒙应用中嵌入全球地图服务的架构实践(跨平台地图方案库)

Flutter for OpenHarmony: Flutter 三方库 google_maps 在鸿蒙应用中嵌入全球地图服务的架构实践(跨平台地图方案库)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的全球化应用开发时,地图服务是出海项目绕不开的核心组件。对于已经在海外市场成熟运行、深度依赖 Google 地图生态的 Flutter 应用,如何将现有的地图逻辑迁移或适配到鸿蒙平台,是许多出海大企关注的焦点。 虽然鸿蒙在国内市场主要使用高德或百度地图,但在处理“全球一张图”需求时,google_maps 相关的 Flutter 插件及其底层的 Dart 模型定义,依然是定义地理围栏、标记点(Marker)和轨迹绘制的标准参考。本篇将探讨如何在鸿蒙跨平台架构中,平衡 Google 地图的通用逻辑与鸿蒙的原生渲染。 一、跨平台地图适配架构 在鸿蒙适配中,我们通常采用“统一接口层,分平台实现”的策略。 模型转换 适配层 Flutter 业务层 (Dart) 地图抽象层

By Ne0inhk
【Spring Cloud】初识Spring Cloud

【Spring Cloud】初识Spring Cloud

系列文章目录 在学习Spring Cloud 之前, 我们先来了解下什么是微服务, 以及微服务的发展史. 在架构发展的过程中,项目开发遇到了哪些问题, 以及Spring Cloud是用来解决什么问题的. 这将对咱们后面的相关内容有很大帮助! 一、认识微服务 下图表示了服务架构从单体应用逐渐转变为微服务应用的过程: 1.1 单体架构 很多创业公司早期或者传统企业会把业务的所有功能实现都打包在⼀个项⽬, 这就是单体架构.业务的所有功能实现都打包在⼀个war包或者Jar包中, 这种方式就称为单体架构 如果一个项目前端+后端+数据库实现,都在⼀个项⽬中, 这种架构就称为单体架构. 以大家都很熟悉的电商系统为例, 电商系统包括: 用户管理, 商品管理, 订单管理, 支付管理, 库存管理, 物流管理等等, 项目早期我们会把这些模块都写在⼀个web项目中, 然后统一部署到⼀个Web服务器中。 这种架构开发简单, 部署简单, ⼀个项⽬就包含了所有的功能, 省去了多个项目之间的交互和调用消耗.直接部署在⼀个服务器即可. 1.

By Ne0inhk
微服务学习笔记(2)——SpringCloud Nacos

微服务学习笔记(2)——SpringCloud Nacos

🔥我的主页:九转苍翎⭐️个人专栏:《Java SE 》《Java集合框架系统精讲》《MySQL高手之路:从基础到高阶 》《计算机网络 》《Java工程师核心能力体系构建》《RabbitMQ理论与实践》天行健,君子以自强不息。 0.前言 * SpringBoot版本:3.2.5 * SpringCloud版本:2023.0.3 * SpringCloud Alibaba版本:2023.0.1.0 * nacos版本:2.2.3(已免费上传至我的资源) * 项目源码:spring-cloud-blog 1.概述 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置和管理平台。在 Spring Cloud 体系中,

By Ne0inhk