⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

1. 概述

SkyWalking UI

1.1 概念

SkyWalking 是什么?

Application performance monitor tool for distributed systems, especially designed for microservices, cloud native and container-based (Kubernetes) architectures.

应用性能监控平台,可用于分布式系统,支持微服务、云原生、Docker、Kubernetes 等多种架构场景。

1.2 功能列表

SkyWalking 有哪些功能?

功能列表

  • 多种监控手段:通过语言探针和 Service Mesh 等手段,获得链路、日志、指标等监控数据
  • 多个语言探针:Java、.Net Core、PHP、NodeJS、Golang、LUA、Rust、C++ 等
  • 轻量级高性能:无需大数据组件,无需大量的硬件资源,且对应用实例的负载消耗极低
  • 模块化架构:数据传输、数据存储,注册发现等模块,可替换不同的基础设施实现
  • 端到端的监控:Vue、React 等前端,Java、.Net Core、PHP、NodeJS、Golang、Istio 等后端
  • 告警机制:内置 Webhooks 发送事件通知,支持通过 HTTP、gRPC、Slack 等方式
  • 可视化界面:好用的监控后台,可支持自定义配置,或是集成你自己的

1.3 整体架构

SkyWalking 整体架构如何?

架构图

整个架构,分成上、下、左、右四部分:

  • 【左】Agent:在应用中,收集 Trace、Log、Metrics 等监控数据,使用 RPC、RESTful API、Kafka 等 Transport 传输方式,发送给 OAP 服务
  • 【下】OAP:首先 Receiver 接收 Agent 发送的监控数据,然后 Aggregator 进行聚合计算,之后存储到 Storage 外部存储器,最终提供给 GUI 查询数据
  • 【右】Storage:存储监控数据,支持 Elasticsearch、MySQL、TiDB、H2 等多种数据库
  • 【上】GUI:UI 可视化界面,提供监控数据的查询后台

1.4 官方文档

https://skywalking.apache.org/docs/main/latest/readme/ 地址下,提供了 SkyWalking 的英文文档。

考虑到大多数胖友的英语水平和艿艿不相伯仲,再加上胖友一开始对 SkyWalking 比较陌生,所以比较推荐先阅读 https://github.com/SkyAPM/document-cn-translation-of-skywalking 地址,提供了 SkyWalking 的中文文档。

考虑到胖友使用 SkyWalking 的目的,是实现分布式链路追踪的功能,所以最好去了解下相关的知识。这里推荐阅读两篇文章:

2. 搭建 SkyWalking 单机环境

考虑到让胖友更快的入门,我们来搭建一个 SkyWalking 单机环境,步骤如下:

SkyWalking 单机环境

  • 第一步,搭建一个 Elasticsearch 服务
  • 第二步,下载 SkyWalking 软件包
  • 第三步,搭建一个 SkyWalking OAP 服务
  • 第四步,启动一个 Spring Boot 应用,并配置 SkyWalking Agent 探针
  • 第五步,搭建一个 SkyWalking UI 服务

仅仅五步,按照艿艿标题党的性格,应该给本文取个《10 分钟快速搭建 SkyWalking 服务》标题才对,哈哈哈。

友情提示:推荐使用 Elasticsearch 存储数据,因为 SkyWalking 开发团队所在公司,生产环境都是使用它。

2.1 搭建 Elasticsearch

FROM https://www.elastic.co/cn/products/elasticsearch

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

参考 《Elasticsearch 极简入门》 的「1. 单机部署」小节,搭建一个 Elasticsearch 单机服务。

本文使用的 Elasticsearch 版本是 8.1.2

2.2 下载 SkyWalking 发布版

http://skywalking.apache.org/downloads/ 下,我们下载 SkyWalking 发布版。

下载 SkyWalking 发布版

2.2.1 下载 SkyWalking OAP

# 创建目录
mkdir -p /Users/yunai/skywalking
cd /Users/yunai/skywalking

# 下载
wget https://dlcdn.apache.org/skywalking/9.0.0/apache-skywalking-apm-9.0.0.tar.gz

# 解压
tar -zxvf apache-skywalking-apm-9.0.0.tar.gz
# 查看目录
cd apache-skywalking-apm-bin
ls -ls
# 查看目录(结果)
56 -rw-r--r--@ 1 yunai staff 27987 Feb 18 06:08 LICENSE
64 -rw-r--r--@ 1 yunai staff 30503 Feb 18 06:08 NOTICE
8 -rw-r--r--@ 1 yunai staff 1951 Feb 18 06:08 README.txt
0 drwxr-xr-x 12 yunai staff 384 Apr 16 23:53 bin # 执行脚本
0 drwxr-xr-x 21 yunai staff 672 Apr 16 23:53 config # SkyWalking OAP Server 配置文件
0 drwxr-xr-x 5 yunai staff 160 Apr 16 23:53 config-examples
0 drwxr-xr-x@ 29 yunai staff 928 Feb 18 06:08 licenses
0 drwxr-xr-x@ 221 yunai staff 7072 Feb 18 06:08 oap-libs # SkyWalking OAP Server
0 drwxr-xr-x 3 yunai staff 96 Apr 16 23:53 tools
0 drwxr-xr-x 4 yunai staff 128 Apr 16 23:53 webapp # SkyWalking UI

2.2.2 下载 SkyWalking Java Agent

# 创建目录
mkdir -p /Users/yunai/skywalking
cd /Users/yunai/skywalking

# 下载
wget https://dlcdn.apache.org/skywalking/java-agent/8.10.0/apache-skywalking-java-agent-8.10.0.tgz

# 解压
tar -zxvf apache-skywalking-java-agent-8.10.0.tgz
# 查看目录
cd skywalking-agent
ls -ls
# 查看目录(结果)
32 -rw-r--r--@ 1 yunai staff 12911 Apr 12 23:51 LICENSE
24 -rw-r--r--@ 1 yunai staff 10003 Apr 12 23:51 NOTICE
0 drwxr-xr-x@ 10 yunai staff 320 Apr 12 23:52 activations
0 drwxr-xr-x@ 5 yunai staff 160 Apr 12 23:52 bootstrap-plugins
0 drwxr-xr-x@ 3 yunai staff 96 Apr 12 23:51 config # SkyWalking Java Agent 配置文件
0 drwxr-xr-x@ 3 yunai staff 96 Apr 12 23:51 licenses
0 drwxr-xr-x@ 2 yunai staff 64 Apr 12 23:51 logs # SkyWalking Java Agent 日志文件
0 drwxr-xr-x@ 21 yunai staff 672 Apr 12 23:52 optional-plugins # SkyWalking Java Agent 的可选插件
0 drwxr-xr-x@ 6 yunai staff 192 Apr 12 23:52 optional-reporter-plugins
0 drwxr-xr-x@ 118 yunai staff 3776 Apr 12 23:52 plugins # SkyWalking Java Agent 的开启插件
39808 -rw-r--r--@ 1 yunai staff 20378894 Apr 12 23:51 skywalking-agent.jar # SkyWalking Java Agent

2.3 搭建 SkyWalking OAP Server

① 修改 OAP 配置文件 apache-skywalking-apm-bin/config/application.yml

修改 OAP 配置文件

  • 通过 storage.selector 配置项来设置具体使用的存储器。

② 启动 SkyWalking OAP 服务

bin/oapService.sh

SkyWalking OAP started successfully!

是否真正启动成功,胖友打开 logs/skywalking-oap-server.log 日志文件,查看是否有错误日志。 首次启动时,因为 SkyWalking OAP 会创建 Elasticsearch 的索引,所以会“疯狂”的打印日志。

友情提示:因为首次启动会创建 Elasticsearch 索引,所以可能会比较慢。

最终,我们看到如下日志,基本可以代表 SkyWalking OAP 服务启动成功:

2022-04-17 00:41:53,692 - org.apache.skywalking.oap.server.starter.OAPServerBootstrap - 53 [main] INFO  [] - Version of OAP: 9.0.0-89644fe (20220217220813)

2.4 SkyWalking UI 搭建

① 启动 SkyWalking UI 服务

bin/webappService.sh

SkyWalking Web Application started successfully!

【可选】如果想要修改 SkyWalking UI 服务的参数,可以编辑 webapp/webapp.yml 配置文件。例如说:

  • server.port :SkyWalking UI 服务端口。
  • spring.cloud.discovery.client.simple.instances.oap-service :SkyWalking OAP 服务地址数组。因为 SkyWalking UI 界面的数据,是通过请求 SkyWalking OAP 服务来获得的。

② 访问 UI 界面:

浏览器打开 http://127.0.0.1:8080 地址,界面如下图:

SkyWalking UI

2.5 SkyWalking Java Agent【Shell】

在启动项目的 Shell 脚本上,可以通过 -javaagent 参数进行配置 SkyWalking Java Agent。

2.5.1 上传 Agent 软件包

我们需要将 skywalking-agent 目录,拷贝到 Java 应用所在的服务器上。这样,Java 应用才可以配置使用该 SkyWalking Agent。

因为本文是在本机测试,所以无需拷贝,SkyWalking Agent 目录是 /Users/yunai/skywalking/skywalking-agent

考虑到方便胖友,艿艿这里提供了一个最简的 Spring Boot 应用 lab-39-demo-2.2.2.RELEASE.jar。对应 Github 仓库是 lab-39-demo

2.5.2 配置 Java 启动脚本

# SkyWalking Agent 配置
export SW_AGENT_NAME=demo-application # 配置 Agent 名字。一般来说,我们直接使用 Spring Boot 项目的 `spring.application.name` 。
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # 配置 Collector 地址。
export SW_AGENT_SPAN_LIMIT=2000 # 配置链路的最大 Span 数量。一般情况下,不需要配置,默认为 300 。主要考虑,有些新上 SkyWalking Agent 的项目,代码可能比较糟糕。
export JAVA_AGENT=-javaagent:/Users/yunai/skywalking/skywalking-agent/skywalking-agent.jar # SkyWalking Agent jar 地址。

# Jar 启动
java -jar $JAVA_AGENT -jar lab-39-demo-2.2.2.RELEASE.jar

2.5.3 启动 Spring Boot 项目

直接执行上述的 Shell 脚本,启动 Java 项目。在启动日志中,我们可以看到 SkyWalking Agent 被加载的日志。日志示例如下:

DEBUG 2022-04-17 01:14:14:250 main AgentPackagePath : The beacon class location is jar:file:/Users/yunai/skywalking/skywalking-agent/skywalking-agent.jar!/org/apache/skywalking/apm/agent/core/boot/AgentPackagePath.class.
INFO 2022-04-17 01:14:14:252 main SnifferConfigInitializer : Config file found in /Users/yunai/skywalking/skywalking-agent/config/agent.config.

同时,也可以在 /Users/yunai/skywalking/skywalking-agent/logs/skywalking-api.log 查看对应的 SkyWalking Agent 日志。

2.5.4 简单测试

启动完成后,可以去 SkyWalking UI 查看是否链路收集成功。

① 访问下 http://127.0.0.1:8079/demo/echo 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。

② 打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。

SkyWalking UI 界面 —— 首页

这里,我们可以看到 Spring Boot 应用的服务"demo-application",就是我们在环境变量 SW_AGENT_NAME 中所定义的。

服务(Service):表示对请求提供相同行为的一系列或一组工作负载。在使用 Agent 或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用你在平台(例如说 Istio)上定义的名字。

③ 点击 demo-application 这个服务名,可以看到该服务的【整体监控信息】。

SkyWalking UI 界面 —— Override

④ 点击 [Instance] 选项卡,可以查到该服务的【实例列表】。

SkyWalking UI 界面 —— Instance

服务实例(Service Instance):上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程。

④ 点击 [Endpoint] 选项卡,可以查看到该服务的【端点列表】。

SkyWalking UI 界面 —— Endpoint

端点(Endpoint) :对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。 这里,我们可以看到 Spring Boot 应用的一个端点,为 API 接口 /demo/echo

⑤ 点击 [Topology] 选项卡,可以查看到该服务的【拓扑图】。

SkyWalking UI 界面 —— Topology

⑥ 点击 [Trace] 选项卡,可以查看到该服务的【链路】。

SkyWalking UI 界面 —— Trace

⑦ 点击 [Log] 选项卡,可以查看到该服务的【日志】。

SkyWalking UI 界面 —— Log

SkyWalking 的日志使用,可见 《SkyWalking Java agent’s toolkits》 文档。

2.6 SkyWalking Java Agent【IDEA】

考虑到偶尔我们需要在 IDE 中,也希望使用 SkyWalking Agent,可参考下图配置:

IDEA 界面

3. 搭建 SkyWalking 集群环境

在生产环境下,我们一般推荐搭建 SkyWalking 集群环境。😈 当然,如果公司比较抠门,也可以在生产环境下使用 SkyWalking 单机环境,毕竟 SkyWalking 挂了之后,不影响业务的正常运行。

搭建一个 SkyWalking 集群环境,步骤如下:

  • 第一步,搭建一个 Elasticsearch 服务的集群
  • 第二步,搭建一个注册中心的集群。目前 SkyWalking 支持 Zookeeper、Kubernetes、Consul、Nacos 作为注册中心。
  • 第三步,搭建一个 SkyWalking OAP 服务的集群,同时参考 《SkyWalking 文档 —— 集群管理》 ,将 SkyWalking OAP 服务注册到注册中心上
  • 第四步,启动一个 Spring Boot 应用,并配置 SkyWalking Agent。另外,在设置 SkyWaling Agent 的 SW_AGENT_COLLECTOR_BACKEND_SERVICES 地址时,需要设置多个 SkyWalking OAP 服务的地址数组
  • 第五步,搭建一个 SkyWalking UI 服务的集群,同时使用 Nginx 进行负载均衡。另外,在设置 SkyWalking UI 的 spring.cloud.discovery.client.simple.instances.oap-service 地址时,也需要设置多个 SkyWalking OAP 服务的地址数组

😈 具体的搭建过程,并不复杂,胖友自己去尝试下。

4. Spring Boot 使用示例

《芋道 Spring Boot 链路追踪 SkyWalking 入门》 中,我们来详细学习如何在 Spring Boot 中,整合并使用 SkyWalking 收集链路数据。😈 相比「2.5 SkyWaling Agent」来说,我们会提供更加丰富的示例哟。

5. Spring Cloud 使用示例

《芋道 Spring Cloud 链路追踪 SkyWalking 入门》 中,我们来详细学习如何在 Spring Cloud 中,整合并使用 SkyWalking 收集链路数据。😈 相比「2.5 SkyWaling Agent」来说,我们会提供更加丰富的示例哟。

666. 彩蛋

本文仅仅是简单的 SkyWalking 入门文章,如果胖友想要更好的使用 SkyWalking,推荐通读下《SkyWalking 文档》

想要进一步深入的胖友,也可以阅读如下资料:

😈 最后弱弱的问一句,上完 SkyWaling 之后,有没发现自己系统各种地方慢慢慢!嘻嘻。

文章目录
  1. 1. 1. 概述
    1. 1.1. 1.1 概念
    2. 1.2. 1.2 功能列表
    3. 1.3. 1.3 整体架构
    4. 1.4. 1.4 官方文档
  2. 2. 2. 搭建 SkyWalking 单机环境
    1. 2.1. 2.1 搭建 Elasticsearch
    2. 2.2. 2.2 下载 SkyWalking 发布版
      1. 2.2.1. 2.2.1 下载 SkyWalking OAP
      2. 2.2.2. 2.2.2 下载 SkyWalking Java Agent
    3. 2.3. 2.3 搭建 SkyWalking OAP Server
    4. 2.4. 2.4 SkyWalking UI 搭建
    5. 2.5. 2.5 SkyWalking Java Agent【Shell】
      1. 2.5.1. 2.5.1 上传 Agent 软件包
      2. 2.5.2. 2.5.2 配置 Java 启动脚本
      3. 2.5.3. 2.5.3 启动 Spring Boot 项目
      4. 2.5.4. 2.5.4 简单测试
    6. 2.6. 2.6 SkyWalking Java Agent【IDEA】
  3. 3. 3. 搭建 SkyWalking 集群环境
  4. 4. 4. Spring Boot 使用示例
  5. 5. 5. Spring Cloud 使用示例
  6. 6. 666. 彩蛋