Springboot应用如何与SkyWalking集成,并使用Docker进行发布
Springboot 应用与SkyWalking 集成,并使用 Docker 进行发布的完整步骤。整个过程分为两大部分:搭建 SkyWalking 后端与 UI 和 集成并发布 Spring Boot 应用。
方案概览
我们将使用两个 Docker 容器(或两个 Docker Compose 服务):
skywalking-oap-server
: 负责接收、聚合、分析链路和指标数据。skywalking-ui
: 提供图形化界面用于查看数据。your-spring-boot-app
: 应用容器,通过 Java Agent 将数据上报到skywalking-oap-server
。
第一部分:搭建 SkyWalking 后台 (使用 Docker Compose)
这是最推荐的方式,可以快速搭建一套 SkyWalking 环境。
1. 创建 docker-compose.yml
文件
创建一个目录,例如 skywalking-docker
,然后创建 docker-compose.yml
文件。
version: '3.8'
services:# SkyWalking OAP 服务器skywalking-oap:image: apache/skywalking-oap-server:9.7.0container_name: skywalking-oaprestart: alwaysports:- "11800:11800" # 接收 Agent 上报数据的 gRPC 端口- "12800:12800" # 接收 Agent 上报数据的 HTTP 端口environment:- SW_STORAGE=elasticsearch7 # 存储类型,也可选用 elasticsearch8, h2, mysql 等- SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 # ES 地址,这里用服务名depends_on:- elasticsearchnetworks:- skywalking-network# SkyWalking Web UIskywalking-ui:image: apache/skywalking-ui:9.7.0container_name: skywalking-uirestart: alwaysports:- "8080:8080" # Web 界面访问端口environment:- SW_OAP_ADDRESS=skywalking-oap:12800 # 告诉 UI 后端 OAP 的地址depends_on:- skywalking-oapnetworks:- skywalking-network# 可选的 Elasticsearch 服务(如果不想用外部的 ES)elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10container_name: es-serverrestart: alwaysenvironment:- discovery.type=single-node- xpack.security.enabled=false- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ports:- "9200:9200"networks:- skywalking-networknetworks:skywalking-network:driver: bridge
2. 启动 SkyWalking 后台
在包含 docker-compose.yml
的目录下运行:
docker-compose up -d
等待所有容器启动后,你可以通过 http://localhost:8080
访问 SkyWalking UI。初始状态没有应用数据,UI 界面是空的。
注意:如果宿主机已经安装了 Elasticsearch,可以删除 elasticsearch
服务,并将 SW_STORAGE_ES_CLUSTER_NODES
环境变量改为已有ES 地址(例如 host.docker.internal:9200
或服务器 IP)。
第二部分:集成 SkyWalking Agent 并发布 Spring Boot 应用
Spring Boot 应用通过 Java Agent 的方式与 SkyWalking 集成,无需修改任何代码。
1. 获取 SkyWalking Java Agent
你需要下载 SkyWalking Agent,有两种方式:
方式一:直接下载(推荐)
从 SkyWalking Apache 下载页 下载对应的 Agent 压缩包(例如 apache-skywalking-java-agent-8.20.0.tgz
),解压后得到 agent
目录。
方式二:使用 Docker 镜像中的 Agent(更适用于 Docker 环境)
你可以直接使用 apache/skywalking-oap-server
镜像中的 Agent,它位于 /skywalking/agent
目录。这是我们下面在 Dockerfile 中会用到的方式。
2. 创建 Dockerfile 集成 Agent
Spring Boot 应用的 Dockerfile
需要将 Agent 拷贝到镜像中,并在启动命令中通过 -javaagent
参数启用它。
# 基础镜像
FROM eclipse-temurin:17-jre as builder
WORKDIR /app# 从 apache/skywalking-oap-server 镜像中复制 agent 到当前镜像
# 这避免了手动下载,确保 Agent 与 OAP Server 版本兼容
COPY --from=apache/skywalking-oap-server:9.7.0 /skywalking/agent /skywalking/agent# 拷贝 Spring Boot Jar 包(假设 jar 包在构建上下文目录)
COPY target/your-spring-boot-app.jar app.jar# 启动命令,关键是指定 javaagent 参数
ENTRYPOINT ["java", \"-javaagent:/skywalking/agent/skywalking-agent.jar", \ # 指定 Agent Jar 包路径"-Dskywalking.agent.service_name=your-application-name", \ # 在 SkyWalking 中注册的服务名"-Dskywalking.collector.backend_service=host.docker.internal:11800", \ # 告诉 Agent OAP 服务器的地址"-jar", \"/app/app.jar"]ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar upgrade.jar ${JAR_OPTS}
参数解释:
-
-javaagent:/skywalking/agent/skywalking-agent.jar
: 启用 SkyWalking Agent。 -
-Dskywalking.agent.service_name=your-application-name
: 重要:设置应用在 SkyWalking 中显示的名字,例如user-service
,order-service
。 -
-Dskywalking.collector.backend_service=host.docker.internal:11800
重要:告诉 Agent 将数据上报到哪里。
host.docker.internal
是 Docker 的一个特殊 DNS,指向宿主机的 IP。这在 Mac/Windows 的 Docker Desktop 中有效。- 如果 SkyWalking OAP 和 Spring Boot 应用都在同一个 Docker Compose 中,你应该使用 服务名 和 内部端口,例如
-Dskywalking.collector.backend_service=skywalking-oap:11800
。 - 如果在 Linux 服务器或生产环境中,请使用真实的 OAP 服务器 IP 或域名。
3. 构建并运行 Spring Boot 应用容器
-
构建镜像:在 Spring Boot 项目根目录(包含
Dockerfile
和 jar 包的地方)运行:docker build -t your-spring-boot-app:latest .
-
运行容器:
-
如果使用同一个 Docker Compose(推荐):
将应用服务添加到之前的docker-compose.yml
中:services:# ... (之前的 skywalking-oap, skywalking-ui, elasticsearch 服务)your-spring-boot-app:build: context: /path/to/your/spring-boot-app # 指向应用目录container_name: your-spring-boot-apprestart: alwaysports:- "8081:8080" # 暴露应用端口environment:- SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap:11800 # 也可以通过环境变量覆盖后端地址networks:- skywalking-networkdepends_on:- skywalking-oap
然后运行
docker-compose up -d
来同时启动所有服务(SkyWalking 基础设施 + 应用)。 -
如果单独运行:
docker run -d \--name your-app \-p 8080:8080 \-e SW_AGENT_COLLECTOR_BACKEND_SERVICES=host.docker.internal:11800 \your-spring-boot-app:latest
确保
host.docker.internal
能正确解析到运行着skywalking-oap
容器的主机。
-
验证与查看
- 访问 Spring Boot 应用,触发几个接口调用。
- 打开浏览器,访问 SkyWalking UI:
http://localhost:8080
。 - 在主页的服务下拉框中,你应该能看到你配置的服务名(例如
your-application-name
)。 - 点击搜索按钮,稍等片刻(约1-2分钟),就能看到应用的拓扑图、链路追踪(Traces)和指标(Metrics)等信息。
常见问题排查 (Troubleshooting)
- 在 UI 中看不到数据:
- 检查
skywalking-oap
和elasticsearch
容器日志是否有错误:docker logs skywalking-oap
。 - 检查应用容器日志,确认 Agent 是否成功启动,并且没有连接
backend_service
的错误。 - 确保
-Dskywalking.collector.backend_service
的地址和端口是正确的,并且网络是通的。 - 在 Docker Compose 网络中,使用服务名;在宿主机单独部署时,使用
host.docker.internal
或宿主机 IP。
- 检查
- Agent 版本兼容性:确保 Java Agent 的版本与 OAP Server 的版本一致或兼容(主版本号相同通常可以)。
按照以上步骤,就可以成功地将 Spring Boot 应用与 SkyWalking 集成并通过 Docker 发布。