【微服务】Spring Cloud 集成 SkyWalking 实现全链路追踪

1 人赞同了该文章

微服务架构中,由于服务数量多、调用关系复杂,监控和追踪每个请求在不同服务间的流转变得至关重要。SkyWalking 是一款开源的应用性能监控 (APM) 系统,可以帮助开发者实现全链路追踪。本文将详细介绍如何在 Spring Cloud 和 Spring Boot 项目中集成 SkyWalking,实现全链路追踪。

先分享一套我自己逐字写的、深入浅出、细致易懂的高频面试题详解,旨在以一站式刷题 + 解惑的方式帮你提升学习效率,需要的请自取。

强烈建议近期有求职诉求的Javaer,前端,数据库好好看看。

什么是 SkyWalking

SkyWalking 是一款强大的 APM 工具,用于收集、聚合和分析分布式系统的性能数据和调用链路。其主要功能包括:

  1. 全链路追踪:跟踪请求在各个微服务中的调用链路。
  2. 性能监控:监控各个服务的性能指标,如响应时间、吞吐量等。
  3. 报警:基于预定义规则对异常情况进行报警。

SkyWalking 的架构

SkyWalking 主要由以下几个部分组成:

  1. Agent:嵌入到应用程序中的探针,用于收集性能数据和调用链信息。
  2. Collector:数据收集和分析的后台服务。
  3. Storage:存储收集到的监控数据。
  4. UI:提供数据展示和分析的界面。

集成步骤

1. SkyWalking 环境准备

下载和安装 SkyWalking

前往 Apache SkyWalking 官方网站下载最新版本,并解压。

配置 SkyWalking

进入 config 目录,修改 application.yml 文件进行网络配置和存储配置(如使用 Elasticsearch/MongoDB 等存储)。

启动 SkyWalking 后台服务:

./bin/startup.sh

2. Spring Cloud 和 Spring Boot 项目中集成 SkyWalking

引入依赖

在 Spring Cloud 项目和 Spring Boot 项目的 pom.xml 文件中添加 SkyWalking 的插件依赖:

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-sniffer</artifactId>
    <version>8.8.0</version>
</dependency>
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.8.0</version>
</dependency>

添加 Agent

下载 SkyWalking Java agent 包,将其解压缩,并将 skywalking-agent.jar 放置到便于管理的位置。

配置 Agent

在 Spring Cloud 和 Spring Boot 项目中,通过 JVM 参数指定 SkyWalking agent:

-javaagent:/path/to/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=your-service-name
-Dskywalking.collector.backend_service=IP:PORT
  • /path/to/skywalking-agent/ 替换为实际路径。
  • your-service-name 替换为该微服务的实际名称。
  • IP:PORT 替换为 SkyWalking Collector 的地址。

日志集成

为了更好地追踪和分析日志,可以将 SkyWalking 与 Logback 集成。在 src/main/resources 目录下添加或修改 logback-spring.xml 文件:

<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="skywalking" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.SkyWalkingLogBackAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <root level="debug">
        <appender-ref ref="console"/>
        <appender-ref ref="skywalking"/>
    </root>
</configuration>

3. 启动微服务


确保所有微服务均已正确配置 SkyWalking agent,并启动微服务。在启动参数中加入 -javaagent 配置即可:

java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=my-service -Dskywalking.collector.backend_service=127.0.0.1:11800 -jar my-service.jar

4. 验证集成效果

访问 SkyWalking UI 界面:通常为 http://localhost:8080/ui

在 SkyWalking UI 中,可以查看微服务的调用链路、性能指标和日志信息。如果配置正确,你应该能够看到各个微服务的调用关系和性能指标。

使用示例


假设我们有两个 Spring Boot 微服务:service-a 和 service-b,service-a 调用 service-b 进行某些处理。

1. 创建service-a

@SpringBootApplication
@RestController
public class ServiceAApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceAApplication.class, args);
    }

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/callB")
    public String callServiceB() {
        return restTemplate.getForObject("http://localhost:8081/hello", String.class);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

2. 创建service-b

@SpringBootApplication
@RestController
public class ServiceBApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceBApplication.class, args);
    }

    @GetMapping("/hello")
    public String hello() {
        return "Hello from Service B";
    }
}

3. 配置和启动

按照前文述步骤为 service-a 和 service-b 添加 SkyWalking agent,并启动两个服务:

java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=service-a -Dskywalking.collector.backend_service=127.0.0.1:11800 -jar service-a.jar
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=service-b -Dskywalking.collector.backend_service=127.0.0.1:11800 -jar service-b.jar

访问
http://localhost:8080/callB 即可触发服务间调用。在 SkyWalking UI 中可以看到从 service-a 到 service-b 的完整调用链路。

总结

通过集成 SkyWalking 到 Spring Cloud 和 Spring Boot 项目中,我们可以实现全链路追踪,提高系统的可观测性和问题诊断能力。SkyWalking 提供了强大的监控和分析能力,帮助我们在复杂的微服务架构中快速定位性能瓶颈和异常问题。希望通过本文的介绍,你能顺利地在项目中集成 SkyWalking,提升团队的开发运维效率

编辑于 2024-07-09 23:24・IP 属地广东