SkyWalking+Springboot实战

news2025/6/2 8:08:57

1、下载SkyWalking APM

1.手动下载

Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/

2.链接下载

https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gzhttps://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gz

2、解压压缩包

随便上传到服务器某个路径,自己找得到就行

cd /www/wwwroot/skywalking
tar -zxvf apache-skywalking-apm-10.2.0.tar.gz

查看bin目录下的文件

cd /www/wwwroot/skywalking/apache-skywalking-apm-bin/bin

一般来说linux启动应用的都是

./startup.sh

3、修改配置文件

1.修改webapp配置

进入webapp目录下修改端口

http://IP+:12800

2.修改skywalking服务配置

进入config目录下修改一些配置

观察到服务注册这里,默认走的单机模式,下面还有zookeeper、nacos等注册中心,加入需要切换调整上面配置即可,这里我选的默认。

假设你需要使用nacos作为配置中心,可以按下述描述进行修改配置

cluster:
  selector: ${SW_CLUSTER:nacos} # 设置为 nacos
  nacos:
    serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} # 注册的服务名称
    hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848} # Nacos 地址
    namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"public"} # Nacos 命名空间
    contextPath: ${SW_CLUSTER_NACOS_CONTEXT_PATH:""} # Nacos 上下文路径(可选)
    username: ${SW_CLUSTER_NACOS_USERNAME:""} # Nacos 用户名(如果启用了认证)
    password: ${SW_CLUSTER_NACOS_PASSWORD:""} # Nacos 密码(如果启用了认证)
    accessKey: ${SW_CLUSTER_NACOS_ACCESSKEY:""} # Nacos 访问密钥(可选)
    secretKey: ${SW_CLUSTER_NACOS_SECRETKEY:""} # Nacos 秘钥(可选)
    internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:""} # 内部通信主机(可选)
    internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1} # 内部通信端口(可选)

配置存储数据库:

这里的解释我用AI给大家解释一下:

默认是这个banyandb,但是实际上我们使用ES比较多,关于如何使用ES进行配置如下:

如果想要学习怎么docker部署ES,可以看我下面的博客:
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)_spring boot elasticsearch-CSDN博客文章浏览阅读8k次,点赞34次,收藏72次。最完整最详细的springboot中使用es,在前面有服务器部署es相关的东西,在后面有使用java的实战,对于实战的方法使用结合官网深度去研究和讲解。在这篇文章前面是实战,后面是具体讲解~~~如果只想实战就只看一和二,深入了解就继续看,在未来还会继续更新对这个实战,还有es技术的更新,几万字大长文。_spring boot elasticsearch https://blog.csdn.net/qq_73440769/article/details/141477177?spm=1001.2014.3001.5502修改 SkyWalking 配置文件:

storage:
  selector: ${SW_STORAGE:elasticsearch} # 设置为 elasticsearch
  elasticsearch:
    namespace: ${SW_NAMESPACE:""} # 命名空间(可选)
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} # Elasticsearch 地址
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} # 协议,默认为 http
    connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:3000} # 连接超时时间(毫秒)
    socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000} # 套接字超时时间(毫秒)
    responseTimeout: ${SW_STORAGE_ES_RESPONSE_TIMEOUT:15000} # 响应超时时间(毫秒)
    numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0} # HTTP 客户端线程数(默认为 0)
    user: ${SW_ES_USER:""} # 用户名(如果启用了认证)
    password: ${SW_ES_PASSWORD:""} # 密码(如果启用了认证)
    dayStep: ${SW_STORAGE_DAY_STEP:1} # 每个索引的时间跨度(天)
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # 每个索引的分片数
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # 每个索引的副本数

 查看ES状态是否正常:

ES部署的服务器IP+:9200

4、启动skywalking

1.开放端口

在一开始我只开启IPv4的端口的时候是没问题的,但是后来重启服务器发现报了下面的错误

2025-03-31 14:18:11,350 - com.linecorp.armeria.common.Flags - 1738 [main] INFO  [] - verboseExceptions: rate-limit=10 (default)
2025-03-31 14:18:11,521 - com.linecorp.armeria.common.Flags - 1738 [main] INFO  [] - useEpoll: true (default)
2025-03-31 14:18:11,560 - com.linecorp.armeria.common.Flags - 1738 [main] INFO  [] - annotatedServiceExceptionVerbosity: unhandled (default)
2025-03-31 14:18:12,394 - com.linecorp.armeria.common.Flags - 635 [main] INFO  [] - Using Tls engine: OpenSSL BoringSSL, 0x1010107f
2025-03-31 14:18:12,551 - com.linecorp.armeria.common.util.SystemInfo - 525 [main] INFO  [] - IPv6: disabled (no IPv6 network interface)

找了很久bug后,我思索我也没开IPv6啊,唯一想到的就是自己监控的服务器部署了小程序,小程序使用的可能是IPv6,索性不继续找配置文件的bug了,向困难低头,我就多开个IPv6的端口,结果问题真就解决了:

 2.配置java环境

建议先配置环境再启动

如果启动出现:

下面提供两种配置方式,选择一个即可,建议第二个,如果已经配置了全局java环境可以忽略这一步。

(1)修改配置文件,指定jdk目录

替换这两个为你jdk的目录

(2)配置Java的home位置

添加这些配置,根据你的jdk位置为准

export JAVA_HOME=/www/server/java/jdk-17.0.8/          
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

如果不配置会出现这两个错误

启动后可以查看日志文件:

 参考如下AI解释:

3.启动服务

cd /www/wwwroot/skywalking/apache-skywalking-apm-bin/bin
./startup.sh



查看日志:

查看有无报错,没有报错就是启动成功

访问:IP+:8902

5、如何关闭服务

个人觉得,应该也可以写个stop.sh进行自己关闭,不过需要自己去编写配置文件

分别关掉这两个进程,注意PID根据实际的选择

sudo lsof -i :8902
sudo lsof -i :12800
kill -9 +PID

6、Skywalking-agent代理Java服务

1.下载Skywalking-agent

Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/

2.下载后解压进服务器

cd /www/wwwroot/skywalking
tar -zxvf apache-skywalking-java-agent-9.4.0.tgz

3.修改代理配置 agent.config

可以通过ctrl+F定位到这两个配置:

agent.service_name
collector.backend_service

修改服务名称

 我会起有具体意义的名称

4.准备java服务

这个就是我自己的jar服务,进行配置代理检测

nohup /www/server/java/jdk-17.0.8/bin/java \
  -Xmx1024M \
  -Xms256M \
  -javaagent:/www/wwwroot/skywalking/skywalking-agent/skywalking-agent.jar \
  -DSW_SERVICE_NAME=quick-server \
  -jar /www/wwwroot/quick_pickup_java/quick-server-0.0.1-SNAPSHOT.jar \
  > /www/wwwroot/quick_pickup_java/app.log 2>&1 &

或者在启动命令中添加:

/www/server/java/jdk-17.0.8/bin/java \
  -Xmx1024M \
  -Xms256M \
  -javaagent:/www/wwwroot/skywalking/skywalking-agent/skywalking-agent.jar \
  -DSW_SERVICE_NAME=quick-server \
  -jar /www/wwwroot/quick_pickup_java/quick-server-0.0.1-SNAPSHOT.jar

AI解释:

5.启动Java服务

启动服务后出现:

至此完成部署。

7、UI使用教程

大家可以查看官方中文文档的这个UI介绍,我觉得这里讲的很详细:

https://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/ui/README.mdhttps://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/ui/README.md

9、SpingBoot代码中自定义追踪

1.为什么

比如说我要追踪这个接口:

这里我就可以进行一个链路的追踪,可以看到这个接口的一些链路信息,但是我如果想要看到这个方法里面的一些具体的信息,结果可以看到

发现系统中是默认不会链路追踪代码里面的一些业务信息,所以这里就需要我们在后端代码中加一些配置信息进行自定义追踪接口的信息。

2.引入依赖

大家可以去选择自己喜欢的版本:

https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace/9.4.0https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace/9.4.0

<!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>9.4.0</version>
</dependency>

 

3.选择链路的接口

4.部署服务器观察

出现我们刚刚定义的链路名称,不过点击可以发现

5.对查看链路的内容添加注解和 API进行增强

    @Trace(operationName="user-store-getByClassification")
    @Tags({
            @Tag(key = "userId", value = "arg[0]"), // 动态获取 userId
            @Tag(key = "classificationId", value = "arg[1]") // 动态获取 classificationId
    })
    @Override
    public List<StoreVO> selectByClassification(Long classificationId) {
        long userId = BaseContext.getCurrentId();
        String key = RedisConstant.STORE_CLASSIFICATION_ + classificationId;

        try {
            // 查询 Redis 中是否存在店铺数据
            List<StoreVO> storeVOList = (List<StoreVO>) redisTemplate.opsForValue().get(key);
            if (storeVOList != null && !storeVOList.isEmpty()) {
                log.info("从 Redis 中获取店铺数据");
                ActiveSpan.tag("result", "Redis hit"); // 记录 Redis 命中
                return storeVOList;
            }

            // 查询数据库
            storeVOList = iStoreService.getByClassification(classificationId);
            if (storeVOList == null || storeVOList.isEmpty()) {
                // 防止缓存穿透
                List<StoreVO> cacheThoughtStoreVOList = getCacheThoughtStoreVOList();
                redisTemplate.opsForValue().set(key, cacheThoughtStoreVOList, 5L, TimeUnit.MINUTES);

                ActiveSpan.tag("result", "Cache penetration prevention"); // 记录缓存穿透
                return cacheThoughtStoreVOList;
            }

            // 将查询结果存储到 Redis 中
            redisTemplate.opsForValue().set(key, storeVOList);
            ActiveSpan.tag("result", "DB query success"); // 记录数据库查询成功
            return storeVOList;

        } catch (Exception e) {
            // 记录错误信息到链路中
            ActiveSpan.error(e); // 记录异常
            ActiveSpan.tag("error", e.getMessage()); // 自定义错误标签
            log.error("查询店铺数据失败,分类ID: {}, 用户ID: {}, 错误信息: {}", classificationId, userId, e.getMessage(), e);
            throw new StoreException("根据店铺类型分类id查询店铺接口出错");
        }
    }

关键点解析

1. @Trace 注解
  • @Trace(operationName = "user-store-getByClassification") 定义了链路操作名称。
  • 这会使该方法成为一个独立的 Trace 节点,SkyWalking 会自动记录该方法的执行时间。
2. @Tags@Tag 注解
  • 使用 @Tags@Tag 注解可以动态地将方法参数或返回值绑定到链路中。
  • 在这个例子中:
    • @Tag(key = "userId", value = "arg[0]") 动态获取方法的第一个参数(即 userId)。
    • @Tag(key = "classificationId", value = "arg[1]") 动态获取方法的第二个参数(即 classificationId)。
3. ActiveSpan API
  • ActiveSpan 是 SkyWalking 提供的一个工具类,用于在运行时动态向链路中添加标签或记录错误。
  • 常用方法:
    • ActiveSpan.tag(String key, String value):添加自定义标签。
    • ActiveSpan.error(Throwable throwable):记录异常信息。
    • ActiveSpan.error():标记当前 Span 为错误状态。
4. 记录 Redis 和数据库查询结果
  • 使用 ActiveSpan.tag("result", "xxx") 记录 Redis 命中、缓存穿透、数据库查询成功等信息。
  • 这些标签可以帮助你在 SkyWalking UI 中快速定位问题。
5. 异常处理
  • 捕获异常后,调用 ActiveSpan.error(e)ActiveSpan.tag("error", e.getMessage()) 将错误信息记录到链路中。
  • 同时,打印日志以便进一步排查问题。

 AI就是好[狗头][狗头]!!!这里还待测,这几天测完

9、参考

参考这些大佬的文章:

分布式监控Skywalking安装及使用教程(保姆级教程)-CSDN博客文章浏览阅读8.9k次,点赞47次,收藏91次。本文主要讲解分布式链路追踪监控系统Skywalking的安装及使用教程,从0到1,图文并茂的保姆级教程。SkyWalking是一款用于分布式系统跟踪和性能监控的开源工具。它可以帮助开发人员了解分布式系统中不同组件之间的调用关系和性能指标,从而进行故障排查和性能优化。它支持多种语言和框架,包括Java、.NET、Node.js等。它通过在应用程序中插入代理或使用特定的SDK来收集跟踪数据,并将这些数据发送到SkyWalking服务器进行分析和展示。分布式跟踪。_skywalking安装 https://blog.csdn.net/chang_mao/article/details/135998660?spm=1001.2014.3001.5502

【第二十二篇】商城系统-Skywalking链路追踪【商城系统完结篇】-腾讯云开发者社区-腾讯云  Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint /CAT 的设计思路。特点是:支持多种插件,UI功能较强,支持非侵入式埋点。目前使用厂商最多,版本更新较快。https://cloud.tencent.com/developer/article/2135248?policyId=1003

SkyWalking入门搭建【apache-skywalking-apm-10.0.0】_skywalking10.0.0版本部署-CSDN博客文章浏览阅读3.4k次,点赞27次,收藏38次。SkyWalking在Java中使用的是字节方式植入,是完全无代码侵入的VM options 添加,就是刚刚上面下的 java-agentEnvironment variables 添加,指定 SkyWalking的地址效果图操作步骤(idea 2023,其它版本百度操作)配置好后,启动服务会看到下面的日志,就说明 java-agent.jar 读取到了随机访问几下服务的接口,再去刷新SkyWalking 控制台,就可以看到了。_skywalking10.0.0版本部署 https://blog.csdn.net/Tomwildboar/article/details/140589444

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 Maven打包失败

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 解决办法 勾上这个&#xff0c;打包时跳过测试代码

在机器人和无人机时代,测绘人的出路在哪里?

一、技术革命&#xff1a;当测绘行业按下“加速键” 无人机与机器人技术正在重塑测绘行业的底层逻辑。传统测绘依赖人工作业&#xff0c;效率低、成本高且风险大&#xff0c;而无人机凭借其灵活性和高效性&#xff0c;已能快速完成大范围地形测绘&#xff0c;精度可达厘米级&a…

linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像

Linux》》docker: 默认情况下&#xff0c;Docker镜像保存在/var/lib/docker/目录下。 当您使用docker pull命令从Docker Hub或私有镜像仓库中拉取镜像时&#xff0c;Docker会自动将镜像文件保存在/var/lib/docker/image/目录下。 每个镜像都由一个或多个层组成&#xff0c;这些…

DeepSeek+Kimi:PPT制作的效率革命

摘要&#xff1a;传统PPT制作面临模板选择困难、内容逻辑混乱、设计排版能力有限以及反复修改等问题。DeepSeek和Kimi两款AI工具的组合为PPT制作提供了全新的解决方案。DeepSeek擅长内容生成与逻辑推理&#xff0c;能够快速生成高质量的PPT大纲和内容&#xff1b;Kimi则专注于长…

电影交流|基于Java+vue的电影交流平台小程序系统(源码+数据库+文档)

电影交流平台 目录 基于SprinBootvue的电影交流平台小程序系统 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 电影信息管理 3公告信息管理 4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

深度学习入门(二):从感知机到神经网络

文章目录 前言一个神经网络的例子激活函数登场3层神经网络的实现矩阵运算3层神经网络示意图符号定义第一层信号传递第二层信号传递第三层信号传递 代码实现实践&#xff1a;手写数字识别参考资料 前言 上一篇文章我们学习了感知机&#xff0c;因为它和神经网络有很多共同点&am…

AI三大主义 和 深度学习三大主义

在人工智能&#xff08;AI&#xff09;研究领域&#xff0c;"三大主义"通常指三种核心方法论或思想流派&#xff0c;它们代表了不同的技术路径和哲学观点。以下是主流的划分方式&#xff1a; 1. 符号主义&#xff08;Symbolicism&#xff09; 核心思想&#xff1a;智…

探索 Vue 中的多语言切换:<lang-radio /> 组件详解!!!

探索 Vue 中的多语言切换&#xff1a;<lang-radio /> 组件详解 &#x1f30d; 嗨&#xff0c;大家好&#xff01;&#x1f44b; 今天我们来聊聊如何在 Vue 项目中实现一个优雅的多语言切换功能——<lang-radio /> 组件。这是一个小而美的组件&#xff0c;出现在登…

搭建私人对外git空间

# 创建用户&#xff0c;指定不可登录的 Shell&#xff08;git-shell 或 /usr/sbin/nologin&#xff09; sudo adduser --system --shell /usr/bin/git-shell --group git # 验证用户配置 grep git /etc/passwd # 预期输出&#xff1a;git:x:998:998::/home/git:/usr/bin/git-s…

DeepSeek本地部署(linux)

一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 1.1在线下载安装 可复制此命令到Linux服务器进行在线下载,如下载速度过慢,可选择离线下载安装。 curl -fsSL https://ollama.com/install.sh | sh1.2离线下载安装 …

MySQL的基础语法1(增删改查、DDL、DML、DQL和DCL)

目录 一、基本介绍 二、SQL通用语法 三、SQL分类(DDL、DML、DQL、DCL) 1.DDL 1.1数据库操作 1.2表操作 1.2.1表操作-查询创建 1.2.2表操作-数据类型 1&#xff09;数值类型 2&#xff09;字符串类型 3&#xff09;日期时间类型​编辑 4&#xff09;表操作-案例 1.2.3…

Oracle数据库数据编程SQL<3.3 PL/SQL 游标>

游标(Cursor)是Oracle数据库中用于处理查询结果集的重要机制&#xff0c;它允许开发者逐行处理SQL语句返回的数据。 目录 一、游标基本概念 1. 游标定义 2. 游标分类 二、静态游标 &#xff08;一&#xff09;显式游标 【一】不带参数&#xff0c;普通的显示游标 1. 显式…

畅享电脑流畅运行:深度卸载、智能监视与空间释放

软件介绍 在数字化办公与娱乐高度融合的当下&#xff0c;电脑承载着我们诸多重要任务&#xff0c;然而&#xff0c;随着软件的频繁安装与卸载&#xff0c;系统逐渐被各种顽固软件及其残留 “拖垮”&#xff0c;运行速度变慢、磁盘空间告急等问题接踵而至。别愁&#xff0c;今天…

Visual Studio Code 无法打开源文件解决方法

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 一&#xff1a;&#x1f525; 突发状况 二&#xff1a;&#x1f525; 共勉 一&#xff1a;&#x1f525; 突发状况 &#x1f42c;…

核函数(机器学习深度学习)

一、核函数的基本概念 核函数&#xff08;Kernel Function&#xff09; 是机器学习中处理非线性问题的核心工具&#xff0c;通过隐式映射将数据从原始空间转换到高维特征空间&#xff0c;从而在高维空间中实现线性可分或线性建模。其数学本质是计算两个样本在高维空间中的内积…

【工具】BioPred一个用于精准医疗中生物标志物分析的 R 软件包

介绍 R 语言包 BioPred 提供了一系列用于精准医疗中的亚组分析和生物标志物分析的工具。它借助极端梯度提升&#xff08;XGBoost&#xff09;算法&#xff0c;并结合倾向得分加权和 A 学习方法&#xff0c;帮助优化个体化治疗规则&#xff0c;从而简化亚组识别过程。BioPred 还…

【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)

命令&#xff1a; dotnet --list-sdks 功能 列出当前系统中所有已安装的 .NET SDK 版本&#xff1b; 返回值规则 # 1. 格式&#xff1a;<版本号>[<安装路径>]&#xff1b; # 2. 排序&#xff1a;按版本号从低到高排序&#xff1b;示例

关于JVM和OS中的栈帧的区别和内存浅析

关于JVM和OS中的栈帧的区别和内存浅析 刚看了黑马JVM中的栈帧的讲解&#xff0c;感觉和自己理解的栈帧有一定出入&#xff0c;查询资料研究了一下发现的确有天壤之别&#xff0c;可惜黑马并没有讲。 故写下这篇文章巩固一下, OS的栈帧&#xff1a; ​ OS的栈帧会在调用一个函…

拥抱健康生活,开启养生之旅

在快节奏的现代生活中&#xff0c;健康养生愈发重要。它不仅能让我们拥有强健体魄&#xff0c;还能提升生活质量。​ 均衡饮食是养生的基石。多吃蔬菜和水果&#xff0c;它们富含维生素与膳食纤维。比如西兰花&#xff0c;堪称 “蔬菜皇冠”&#xff0c;不仅含有丰富的维生素 …

visual studio 2017配置QT5.9.4环境

前提是已经安装完毕vs 2017以及QT5.9.4&#xff0c;然后再进行下列的操作 一 环境配置 修改成如下所示&#xff0c;然后关闭vs 打开浏览器&#xff0c;搜索网站download.qt.io 如果2.4.1版本出现问题&#xff0c;可以换版本&#xff0c;如2.3.1&#xff0c;2.7.1都比较稳定 …