Heycm

Heycm

Spring Cloud 接入 SkyWalking 小记

2024-06-09
Spring Cloud 接入 SkyWalking 小记

前言

Spring Cloud 项目接入 SkyWalking 记录。

版本

服务版本
Java21.0.3
skywalking-apm10.0.1
skywalking-java-agent9.2.0

关注点一:JDK版本适配

根据官方描述,这个版本的 SkyWalking 要求 Java 11/17/21,要适配
那么意味着:

  • 如果你的 JDK 环境变量是三者之一,那就跳过这一节
  • 如果不是,那你
    • 要么调整环境变量
    • 要么修改启动脚本指定Java版本

如果你启动 SkyWalking 就闪退,那大概率就是 JDK 版本不适配的问题。

如果你和我一样,在本地调试,存在多个版本的 JDK ,那还是别改环境变量的好。

你需要修改两个启动脚本,_EXECJAVA 直接指定 Java 工作目录

oapService.bat

@echo off

setlocal
set OAP_PROCESS_TITLE=Skywalking-Collector
set OAP_HOME=%~dp0%..
set OAP_OPTS="-Xms256M -Xmx512M -Doap.logDir=%OAP_HOME%\logs"

set CLASSPATH=%OAP_HOME%\config;.;
set CLASSPATH=%OAP_HOME%\oap-libs\*;%CLASSPATH%

set _EXECJAVA="D:\soft\Java21\jdk-21.0.3\bin\java"

start "%OAP_PROCESS_TITLE%" %_EXECJAVA% "%OAP_OPTS%" -cp "%CLASSPATH%" org.apache.skywalking.oap.server.starter.OAPServerStartUp
endlocal

webappService.bat

@echo off

setlocal
set WEBAPP_PROCESS_TITLE=Skywalking-Webapp
set WEBAPP_HOME=%~dp0%..
set JARPATH=%WEBAPP_HOME%\webapp
set WEBAPP_LOG_DIR=%WEBAPP_HOME%\logs

if not exist "%WEBAPP_LOG_DIR%" (
    mkdir "%WEBAPP_LOG_DIR%"
)

set _EXECJAVA="D:\soft\Java21\jdk-21.0.3\bin\java"

start "%WEBAPP_PROCESS_TITLE%" %_EXECJAVA% -Dwebapp.logDir=%WEBAPP_LOG_DIR% -cp %JARPATH%/skywalking-webapp.jar;%JARPATH% org.apache.skywalking.oap.server.webapp.ApplicationStartUp
endlocal

OK,这里就配完了。这里是 Win 环境,你如果是 Linux 就改对应的 .sh 脚本,不过正经人都不会在 Linux 配多个 JDK 版本,忽略不计~

到这就可以 startup.bat 启动 SkyWalking 服务了。

image-1717920172720

默认是 H2 存储,Demo 小样无所谓,如果你想用 MySQL 那就去改 config/application.yml

storage:
  selector: ${SW_STORAGE:mysql}
  mysql:
    properties:
      jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest?rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true"}
      dataSource.user: ${SW_DATA_SOURCE_USER:root}
      dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
      dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
      dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
      dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
      dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
    metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
    maxSizeOfBatchSql: ${SW_STORAGE_MAX_SIZE_OF_BATCH_SQL:2000}
    asyncBatchPersistentPoolSize: ${SW_STORAGE_ASYNC_BATCH_PERSISTENT_POOL_SIZE:4}

数据库连接配上,然后建库,它会自己刷数据表你不用管。小 Tip 你要自己找 MySQL JDBC 包丢到 oap-lib 目录。

如果你想要 Elasticsearch 读读官网吧~

新推出了一个 BanyanDB 谁去试试呀~

关注点二:agent

skywalking-java-agent 一整个拉到你需要收集链路的服务机器上,启动服务时候加探针

java 
-javaagent:/path/xxx/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=app_name
-Dskywalking.collector.backend_service=127.0.0.1:11800
-jar xxx.jar

skywalking.agent.service_name 注册到 SkyWalking 上的服务名称
skywalking.collector.backend_service SkyWalking 收集上报地址

在 idea 调试同理加上启动参数即可

image-1717922991164

关注点三:WebFlux

需要注意的是,默认没有支持收集 WebFlux 环境。
我们知道 spring-cloud-gateway 是 WebFlux 环境的,需要在 optional-plugins 目录找到 apm-spring-cloud-gateway-4.x-plugin-9.2.0.jar 插件,复制到 plugins 目录,重启下 Gateway 即可。

到这里,自己刷一刷请求,就可以到面板观察请求链路~

image-1717922714350
image-1717922885777

完。