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.0
    container_name: skywalking-oap
    restart: always
    ports:
      - "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:
      - elasticsearch
    networks:
      - skywalking-network

  # SkyWalking Web UI
  skywalking-ui:
    image: apache/skywalking-ui:9.7.0
    container_name: skywalking-ui
    restart: always
    ports:
      - "8080:8080"     # Web 界面访问端口
    environment:
      - SW_OAP_ADDRESS=skywalking-oap:12800 # 告诉 UI 后端 OAP 的地址
    depends_on:
      - skywalking-oap
    networks:
      - skywalking-network

  # 可选的 Elasticsearch 服务(如果不想用外部的 ES)
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10
    container_name: es-server
    restart: always
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ports:
      - "9200:9200"
    networks:
      - skywalking-network

networks:
  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 参数
# 假设在 Dockerfile 中已通过 ENV 指令设置了某些默认值,或者打算在运行时传入
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=${SW_AGENT_NAME} -Dskywalking.collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES} -Djava.security.egd=file:/dev/./urandom -jar /app/yourapp.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-app
    restart: always
    ports:
      - "8081:8080" # 暴露应用端口
    environment:
      - SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap:11800 # 也可以通过环境变量覆盖后端地址
    networks:
      - skywalking-network
    depends_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 发布。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
若水的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容