springboot整合skywalking的使用详解

 更新时间:2024年01月02日 09:06:17   作者:小码农叔叔  
随着分布式应用大规模部署,应用可观测性从理论到落地已经在众多大型互联网应用中得到实践,比如针对日志可视化ELK解决方案,分布式链路追踪APM解决方案SkyWalking等,今天将详细介绍下APM解决方案中一款重要工具SkyWalking的使用,需要的朋友可以参考下

一、前言

随着分布式应用大规模部署,应用可观测性从理论到落地已经在众多大型互联网应用中得到实践,经过多年沉淀,行业内也逐步形成了相应的一整套解决方案,比如针对日志可视化ELK解决方案,分布式链路追踪APM解决方案SkyWalking,可视化监控工具Prometheus等等。今天将详细介绍下APM解决方案中一款重要工具SkyWalking的使用。

二、SkyWalking介绍

2.1 SkyWalking是什么

 SkyWalking是一个开源的可观测平台,用于从服务和云原生等基础设施收集、分析、聚合以及可视化数据。官网地址:Apache SkyWalking

SkyWalking 提供了一种简便的方式来清晰地观测分布式系统。相比较zipkin而言,skywalking利用agent字节码增强技术实现代码无侵入,通信方式采用GRPC,性能较好,实现方式是java探针,支持告警,支持JVM监控,支持全局调用统计,UI界面更加强大等优点。

2.2 SkyWalking核心功能

SkyWalking 有哪些功能呢?下面列举了其主要的功能点:

  • 监控手段丰富,可以通过语言探针和 service mesh 获得监控是数据;
  • 多种类型的语言自动探针,包括 Java,.NET Core 和 Node.JS;
  • 轻量高效,无需大数据平台,和大量的服务器资源;
  • 模块化,UI、存储、集群管理都有多种机制可选;
  • 支持各类告警机制;

提供优秀的可视化解决方案,支持各类监控数据的可视化;

2.3 SkyWalking整体架构

下面是SkyWalking的整体架构图

从官网提供的Skywalking架构图来看,分成几个部分,简单来说,可以分成下面几个部分

OAP后端

OAP负责接收 Agent 发送的 Tracing 和Metric的数据信息,然后进行分析Analysis Core,存储到外部存储器 Storage ,最终提供查询Query 功能

WEB-UI

UI负责提供web控制台,查看链路,查看各种指标,性能等

Agent探针

Agent负责收集日志数据:Agent以探针的方式,进行请求链路的数据采集,并向OAP服务器上报

Storage存储

数据的存储层,支持ElasticSearch、Mysql、H2多种方式

2.4 SkyWalking主要工作流程

官网关于SkyWalking的详细工作流程图如下

如果在实际应用中,简化上面的流程之后其核心工作流程分为下面几步:

  • 数据采集 ,服务通过探针的方式接入数据采集的功能;
  • 上报服务器 ,请求链路的相关处理行为会上报到OAP服务中;
  • 数据存储 ,进行数据的聚合管理和分析,并存储在持久层;
  • 数据展现 ,通过UI界面进行可视化呈现收集的数据;

三、为什么选择SkyWalking

3.1 业务背景

随着业务规模的不断增长,应用的微服务数量也在随着增长,当微服务的数量越来越大时,一旦系统中出现某个问题,如果不借助工具或其他监测手段,解决问题是耗时耗力的,尤其是N多个微服务之间的调用链路很长,调用关系非常复杂的时候,对于排查、定位分析和解决问题将变得异常困难。因此急需一种可视化工具,可以追踪分布式调用的完整链路的信息,并提供可视化分析界面。

3.2 常见监控工具对比

市面上提供的可用于微服务应用监控工具有很多,下面列举一些常用的解决方案:

  • Zipkin:Twitter公司开源的一个分布式追踪工具,被Spring Cloud Sleuth集成,使用广泛而稳定,需要在应用程序中埋点,对代码侵入性强;
  • Cat:美团大众点评开源的一款分布式链路追踪工具。需要在应用程序中埋点,对代码侵入性强;
  • Pinpoint:一个韩国团队开源的产品,探针收集的数据粒度非常细,但性能损耗大,因其出现的时间较长,完成度很高;
  • SkyWalking:中国人吴晟(华为)开源的一款分布式追踪,分析,告警的工具,现在是Apache旗下开源项目,对云原生支持,目前增长势头强劲,社区活跃,中文文档没有语言障碍;
  • OpenTelemetry ,是 CNCF 的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题,提供与三方 vendor 无关的服务;
  • Grafana,是一个监控仪表系统,由Grafana Labs公司开源的的一个系统监测 (System Monitoring) 工具。帮助用户简化监控的复杂度,用户只需要提供需要监控的数据,它就可以生成各种可视化仪表。同时它还支持报警功能,可以在系统出现问题时通知用户;
  • Prometheus,主要用于对基础设施的监控,包括服务器(CPU、MEM等)、数据库(MYSQL、PostgreSQL等)、Web服务等,几乎所有东西都可以通过Prometheus进行监控。而它的数据,则是通过配置,建立与数据源的联系来获取的;

3.3 为什么选择SkyWalking

相比于其他框架,SkyWalking有自己的优势,主要体现在下面几点:

3.3.1 代码侵入性极低

Skywalking采用字节码增强的技术实现,微服务以java-agent的方式集成,业务代码本身无侵入,像Zipkin代码侵入性就比较高。

3.3.2 功能丰富

1)链路追踪、拓扑分析能力强,采用先进的流式拓扑分析设计;

2)Skywalking功能比较丰富,插件丰富,报表统计,UI界面更加人性化,更符合国人的使用习惯;

3.3.3 产品完善度高

Java生态、功能丰富,国人开发、社区活跃,迭代迅速。

四、SkyWalking环境搭建

官网安装包下载地址:Downloads | Apache SkyWalking

4.1 下载安装包

为了后面的演示,即将springboot服务接入到Skywalking,需要部署OAP服务,以及Java Agent,对应的安装包如下:

下载oap安装包

oap即Skywalking服务端,如下进到官网后,选择下面这里的包,选择合适的版本进行下载,这里我选择9.3.0的版本;

下载Java Agent包

即服务端agent,用于收集来自客户端的端点信息和指标信息,然后上报到oap服务端

4.2 部署服务

4.2.1 部署oap(apm)服务

oap的服务运行起来很简单,最直接的方式就是解压后进入到bin目录直接使用脚本启动即可

tar -zxvf apache-skywalking-apm-9.3.0.tar.gz
 
cd apache-skywalking-apm-bin
 
cd bin

启动脚本说明:

1、oapService.sh,oap的服务启动脚本;

2、webappService.sh,web-ui服务启动脚本;

3、startup.sh,同时包含了启动上面两个服务的脚本

实际使用时,为了方便直接使用 startup.sh启动即可

启动成功后会有两个服务,如上所示:

  • skywalking-oap-server:暴露11800和12800两个端口,分别为收集监控数据的端口11800和接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml;
  • skywalking-web-ui:服务会占用 8080 端口, 修改端口可以修改webapp/webapp.yml;

4.2.2 web-ui界面访问

启动成功后,可以直接访问web-ui界面,访问地址:IP:8080,如果需要修改ui界面的访问端口,直接修改web-app目录下的配置文件中的端口即可;

访问的界面如下

4.3 数据持久化配置

默认情况下如果不做任何配置,Skywalking运行过程中产生的数据将会存储在H2,即内存数据库,一旦服务宕机或被重启,数据将丢失,Skywalking提供了多种持久化数据存储的方式,可以选择mysql,es等,下面使用mysql来存储数据。

4.3.1 修改配置文件

找到config目录下的application.yml配置文件,然后找到下面配置的地方,改为mysql

修改相关的mysql连接参数,指向你自己的连接,注意提前创建一个数据库

4.3.2 上传mysql驱动包

将mysql的连接jar包上传到oap-libs目录下,下载链接:文件分享

4.3.3 重启服务

不管是使用哪种数据持久化方式,一定要上传对应的jar包之后再重启服务,否则会报连接驱动找不到的问题

然后刷新页面,就可以看到数据库下生成了很多Skywalking相关的数据表

五、springboot接入Skywalking

在项目中,如何将springboot接入Skywalking,从而通过Skywalking来监控服务呢?下面来看具体的操作步骤

5.1 准备一个测试使用的接口

@RestController
@RequestMapping("/user")
public class UserController {
 
    @GetMapping("/getById")
    public User find(@RequestParam String userId) {
        return new User(userId, "jerry");
    }
 
}

5.2 获得Java Agent包

通过上面下载的Agent的包解压到本地目录(如果是服务器同样的操作)

5.3 参数化启动项目

本地启动项目时,添加如下启动参数

-javaagent:E:\code-self\skywalking-agent\skywalking-agent.jar -DSW_AGENT_NAME=sky-boot -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=服务端IP:11800

在idea中配置上面的这段启动参数

5.4 接口访问测试

启动成功后,浏览器访问上面提供的测试接口

然后再在skywalking的web-ui界面上就能看到当前监控到的服务信息了

继续点进去,可以看到详细的各种监控指标信息

也可以点击其他的监控指标进行多维度查看

六、dubbo接入Skywalking

dubbo在微服务治理中也是经常使用的,下面通过实例演示下如何利用Skywalking监控dubbo服务

6.1 搭建三个微服务模块

工程目录结构如下

顶层pom依赖

<properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <dubbo.version>3.1.5</dubbo.version>
    </properties>
 
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.6.14</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
 
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

6.2 api模块

该模块主要定义公共的实体类,服务接口

定义一个实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
 
    private String id;
    private String userName;
 
}

定义一个服务接口

public interface UserService {
    User getByUserId(String userId);
}

发布api模块jar包

通过maven命令,将api模块的jar包发布到本地仓库以供其他模块依赖

6.3 dubbo-provider模块

模块结构如下

6.3.1 添加核心依赖

这里注册中心使用zk

    <dependencies>
 
       <dependency>
            <groupId>com.congge</groupId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
 
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <type>pom</type>
        </dependency>
 
    </dependencies>

6.3.2 添加核心配置文件

server:
  port: 8083
 
dubbo:
  application:
    name: sky-dubbo-provider
  protocol:
    name: dubbo
    port: -1
 
  registry:
    address: zookeeper://IP地址:2181
    protocol: zookeeper

6.3.3 添加dubbo接口实现类

import com.congge.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
 
@Slf4j
@DubboService
public class UserServiceImpl implements UserService{
 
    @Override
    public User getByUserId(String userId) {
        log.info("[ServiceProvider] 根据 id 查询用户:{}", userId);
        return new User(userId, "jerry");
    }
}

6.3.4 服务启动类

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@EnableDubbo
@SpringBootApplication
public class ProviderApp {
 
    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class, args);
    }
}

6.4 dubbo-consumer模块

模块结构如下

6.4.1 添加核心依赖

    <dependencies>
 
        <dependency>
            <groupId>com.congge</groupId>
            <artifactId>api</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
 
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <type>pom</type>
        </dependency>
 
    </dependencies>

6.4.2 添加核心配置文件

server:
  port: 8082
 
dubbo:
  application:
    name: sky-dubbo-consumer
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://IP地址:2181
    protocol: zookeeper

6.4.3 添加接口类

为了方便测试,自定义一个接口,在接口中调用dubbo服务

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
 
    @DubboReference
    private UserService userService;
 
    //http://localhost:8082/user/getByUserId?userId=001
    @GetMapping("/getByUserId")
    private User getByUserId(@RequestParam String userId) {
        User user = userService.getByUserId(userId);
        log.info("调用 dubbo 服务成功,获取用户信息:{}", JSON.toJSONString(user));
        return user;
    }
}

6.5 功能测试

分别启动provider和consumer两个微服务模块,然后调用一下上面的接口,确认看到下面的结果后说明服务可以正常调通(前提:确保连接的zk服务可正常使用

6.6 接入Skywalking

按照上述接入springboot的方式,idea启动的时候修改下启动配置参数,provider和consumer两个模块启动时分别添加如下参数:

provider配置的启动参数

-javaagent:E:\code-self\skywalking-agent\skywalking-agent.jar -DSW_AGENT_NAME=dubbo-provider -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=IP地址:11800

consumer配置的启动参数

-javaagent:E:\code-self\skywalking-agent\skywalking-agent.jar -DSW_AGENT_NAME=dubbo-consumer -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=IP地址:11800

配置之后再次启动两个模块的服务,再次访问接口,仍然能够得到期望的结果

此时再次到web-ui界面上看到在服务列表中出现了dubbo的两个服务信息

如果切换到拓扑图,也能够清晰看到两个服务的调用链路

七、写在文末

本文详细介绍了Skywalking从搭建到使用的详细流程,事实上Skywalking的功能远不止这些,它不仅能够监控微服务的调用,还能监控像前端,PHP,nginx等众多其他的中间件,甚至还能与其他的可视化展示工具进行对接,可以说功能非常完善,如果整合你的项目在技术选项中需要集成一款链路监控,链路追踪以及可视化监控指标展示的工具,Skywalking也许是一个不错的选择。

以上就是springboot整合skywalking的使用详解的详细内容,更多关于springboot整合skywalking的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis拦截器打印sql问题

    Mybatis拦截器打印sql问题

    这篇文章主要介绍了Mybatis拦截器打印sql问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java中BufferedReader与BufferedWriter类的使用示例

    Java中BufferedReader与BufferedWriter类的使用示例

    BufferedReader与BufferedWriter分别继承于Reader和Writer类,分别为字符的读取和写入添加缓冲功能,这里我们就来看一下Java中BufferedReader与BufferedWriter类的使用示例:
    2016-06-06
  • idea2019.2安裝MybatisCodeHelper插件的超详细教程

    idea2019.2安裝MybatisCodeHelper插件的超详细教程

    这篇文章主要介绍了idea2019.2安裝MybatisCodeHelper插件的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot整合Spring Batch示例代码

    SpringBoot整合Spring Batch示例代码

    这篇文章主要来和大家一起探讨一下SpringBoot如何整合Spring Batch,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • 为SpringBoot服务添加HTTPS证书的方法

    为SpringBoot服务添加HTTPS证书的方法

    这篇文章主要介绍了为SpringBoot服务添加HTTPS证书的方法,帮助大家更好的理解和使用springBoot框架,感兴趣的朋友可以了解下
    2020-10-10
  • java对象拷贝详解及实例

    java对象拷贝详解及实例

    这篇文章主要介绍了java对象拷贝详解及实例的相关资料,需要的朋友可以参考下
    2017-04-04
  • 详解IDEA用maven创建springMVC项目和配置

    详解IDEA用maven创建springMVC项目和配置

    本篇文章主要介绍了详解IDEA用maven创建springMVC项目和配置 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Elasticsearch查询之Match Query示例详解

    Elasticsearch查询之Match Query示例详解

    这篇文章主要为大家介绍了Elasticsearch查询之Match查询示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 在IDEA中创建SpringBoot项目的详细步骤

    在IDEA中创建SpringBoot项目的详细步骤

    这篇文章主要给大家介绍了在IDEA中创建SpringBoot项目的详细步骤,文中有详细的图文介绍和代码示例,对大家的学习和工作有一定的帮助,需要的朋友可以参考下
    2023-09-09
  • 深入浅析Java中的final关键字

    深入浅析Java中的final关键字

    在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量),下面通过本篇文章给大家介绍java中的final关键字,对java fina关键字相关知识感兴趣的朋友一起看看吧
    2015-12-12

最新评论