Docker 24.0 多阶段构建实战:SpringBoot 镜像体积从 1.2GB 缩减至 150MB

Erlang B型公式计算呼损概率 Erlang B型公式计算呼损概率背景公式MATLAB实现 背景 原由来源于和师兄的对话,如下图。28个人共用4部电话️,与7个人共用1部电话️相比,电话的利用率提高了多少?或每个人能够顺利用上电话的概率提高了多少?每个人平均3小时用1次电话,每次用时5分钟。对于该问题我们把它转化为阻塞率的计算问题。 公式 Erlang B型公适用于M/M/m/m排队系统计算呼叫损失概率,公式参考文献[1]. ... 阅读详情

Docker 24.0 多阶段构建实战:SpringBoot 镜像体积从 1.2GB 缩减至 150MB

在当今云原生时代,Docker 已成为应用部署的标准工具。然而,随着项目复杂度提升,镜像体积膨胀的问题日益凸显。一个典型的 SpringBoot 应用镜像可能轻松突破 1GB,这不仅浪费存储空间,还会拖慢 CI/CD 流水线的构建和部署速度。本文将深入探讨 Docker 24.0 的多阶段构建技术,通过实战演示如何将 SpringBoot 镜像从 1.2GB 瘦身至 150MB。

1. 传统构建的痛点分析

让我们先看一个典型的 SpringBoot 单阶段 Dockerfile 示例:

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

这种构建方式看似简单直接,但存在几个严重问题:

  • 基础镜像过大 : openjdk:17-jdk-slim 镜像本身就有约 400MB
  • 包含冗余构建工具 :JDK 包含开发工具(如 javac),而运行时只需要 JRE
  • 未清理中间文件 :Maven/Gradle 构建缓存未被清除
  • 层叠加效应 :每次代码变更都会导致整个应用层重新构建

镜像体积对比表 :

构建方式 基础镜像 应用层 总大小
单阶段构建 417MB 812MB 1.23GB
多阶段构建 159MB 12MB 171MB

2. 多阶段构建原理剖析

Docker 多阶段构建允许在单个 Dockerfile 中使用多个 FROM 指令,每个阶段可以基于不同的基础镜像,并且可以只选择性地复制前一阶段的产物到新阶段。这种机制的精妙之处在于:

  1. 构建阶段分离 :将编译环境和运行环境完全隔离
  2. 最小化运行时镜像 :只包含应用运行必需的组件
  3. 安全增强 :减少攻击面,移除不必要的工具和库
# 第一阶段:构建阶段
FROM maven:3.8.6-openjdk-17 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src/ ./src/
RUN mvn package -DskipTests

# 第二阶段:运行时阶段
FROM openjdk:17-jre-slim
WORKDIR /app
COPY --from=builder /build/target/*.jar ./app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

关键点: COPY --from 指令可以从前一阶段选择性地复制文件,避免将构建工具和中间产物带入最终镜像。

3. 进阶优化技巧

3.1 使用 JLink 定制 JRE

Java 9 引入的 JLink 工具可以创建只包含必要模块的定制化 JRE:

# 第一阶段:使用 JDK 构建
FROM openjdk:17-jdk-slim AS builder
WORKDIR /build
COPY . .
RUN ./gradlew build

# 第二阶段:创建定制 JRE
FROM openjdk:17-jdk-slim AS jre-builder
RUN jlink \
    --add-modules java.base,java.logging,java.xml,java.sql,java.naming \
    --strip-debug \
    --no-man-pages \
    --no-header-files \
    --compress=2 \
    --output /custom-jre

# 第三阶段:最终镜像
FROM debian:bullseye-slim
ENV JAVA_HOME=/opt/jre
ENV PATH="${JAVA_HOME}/bin:${PATH}"
COPY --from=jre-builder /custom-jre $JAVA_HOME
COPY --from=builder /build/build/libs/*.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

优化效果 :

  • 标准 JRE:约 159MB
  • 定制 JRE:约 45MB(节省 70%+)

3.2 分层构建与缓存优化

利用 Docker 的层缓存机制可以显著加速构建过程:

# 第一阶段:依赖项单独处理
FROM maven:3.8.6-openjdk-17 AS deps
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline

# 第二阶段:源代码构建
FROM deps AS builder
COPY src/ ./src/
RUN mvn package -DskipTests

# 第三阶段:最终镜像
FROM openjdk:17-jre-slim
WORKDIR /app
COPY --from=builder /build/target/*.jar ./app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

缓存策略对比 :

修改类型 传统构建 分层构建
仅改代码 全量重建 仅执行 builder 阶段
改依赖项 全量重建 从 deps 阶段重建
不改任何内容 使用缓存 完全使用缓存

3.3 使用 Distroless 基础镜像

Google 的 Distroless 镜像只包含应用及其运行时依赖,没有 shell、包管理器或其他标准 Linux 发行版的组件:

FROM maven:3.8.6-openjdk-17 AS builder
WORKDIR /build
COPY . .
RUN mvn package -DskipTests

FROM gcr.io/distroless/java17
COPY --from=builder /build/target/*.jar /app.jar
CMD ["/app.jar"]

安全优势 :

  • 没有 shell,无法 docker exec 进入容器
  • 极小的攻击面
  • 镜像体积通常比 alpine 更小

4. 生产环境最佳实践

4.1 多架构镜像构建

使用 Docker Buildx 构建支持多种 CPU 架构的镜像:

docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t your-image:tag .

架构支持矩阵 :

架构 典型设备 基础镜像后缀
amd64 传统服务器 -amd64
arm64 M1/M2 Mac, 树莓派4 -arm64
arm/v7 旧款树莓派 -armv7

4.2 镜像扫描与安全加固

集成安全扫描工具到 CI/CD 流程:

# 使用 Trivy 扫描镜像漏洞
docker scan your-image:tag

# 使用 Dive 分析镜像层
dive your-image:tag

常见安全措施 :

  • 使用非 root 用户运行容器
  • 设置适当的文件权限
  • 定期更新基础镜像
  • 扫描已知漏洞

4.3 性能调优参数

针对 Java 应用的 Docker 内存限制优化:

FROM eclipse-temurin:17-jre-jammy
COPY app.jar .
EXPOSE 8080
ENTRYPOINT ["java", \
    "-XX:+UseContainerSupport", \
    "-XX:MaxRAMPercentage=75.0", \
    "-XX:InitialRAMPercentage=50.0", \
    "-XX:+ExitOnOutOfMemoryError", \
    "-jar", "app.jar"]

JVM 内存参数对比 :

参数 传统方式 容器感知
堆内存 -Xmx2g -XX:MaxRAMPercentage=75
初始堆 -Xms512m -XX:InitialRAMPercentage=50
OOM 处理 默认继续 立即退出

5. 实战:SpringBoot 全链路优化

让我们看一个完整的生产级示例:

# 第一阶段:构建依赖缓存
FROM maven:3.8.6-eclipse-temurin-17 AS deps
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline -B

# 第二阶段:编译打包
FROM deps AS builder
COPY src ./src
RUN mvn package -DskipTests -B && \
    java -Djarmode=layertools -jar target/*.jar extract

# 第三阶段:运行时镜像
FROM eclipse-temurin:17-jre-jammy AS runtime
WORKDIR /app

# 创建非root用户
RUN groupadd -r spring && useradd -r -g spring spring \
    && chown -R spring:spring /app
USER spring:spring

# 分层复制(优化缓存)
COPY --from=builder --chown=spring:spring /build/dependencies/ ./
COPY --from=builder --chown=spring:spring /build/spring-boot-loader/ ./
COPY --from=builder --chown=spring:spring /build/snapshot-dependencies/ ./
COPY --from=builder --chown=spring:spring /build/application/ ./

EXPOSE 8080
ENTRYPOINT ["java", \
    "-XX:+UseContainerSupport", \
    "-XX:MaxRAMPercentage=75.0", \
    "org.springframework.boot.loader.JarLauncher"]

优化亮点 :

  1. 使用 Spring Boot 2.3+ 的分层 JAR 特性
  2. 每层依赖独立复制,最大化构建缓存
  3. 使用非 root 用户增强安全性
  4. 容器感知的 JVM 内存配置
  5. 精确控制每层文件的权限

通过这套组合拳,我们不仅实现了镜像体积的极致压缩,还获得了构建效率、安全性和运行时性能的全面提升。在实际项目中,这种优化可以使镜像推送时间减少 80%,集群节点磁盘空间节省 60% 以上,同时因为更小的攻击面,安全事件发生率显著降低。

Docker 24.0 多阶段构建实战:SpringBoot 镜像体积从 1.2GB 缩减至 350MB 本文详细介绍了Docker 24.0多阶段构建技术,通过实战案例将SpringBoot镜像体积从1.2GB缩减至350MB。文章涵盖Dockerfile优化、基础镜像选择、缓存管理及生产环境最佳实践,帮助开发者提升容器化部署效率,显著减少资源占用。 阅读详情

相关推荐

大厂Python自动化测试面试题合集

题目:函数的作用是什么?调用函数的语法?答案:将独立功能代码封装成模块,复用代码;函数名(实参)。题目:函数 return 作用是什么?无 return 时函数返回什么?多返回值底层是什么类型?答案:返回函数执行结果;无 return 默认返回 None;return x,y,z 底层自动封装为元组。题目:函数四大参数类型分别是什么?定义顺序要求?答案:必选参数、默认参数、可变位置 * args、命名关键字、可变关键字 **kwargs;顺序:必选→默认→*args→命名关键字→**kwargs。

悦分享 104

springboot项目云服务器使用哪个基础镜像?

如果没有特殊的原生库依赖,首选。它在体积、速度和安全性之间取得了最佳平衡。如果遇到“找不到符号”或动态链接库加载失败,请切换到 eclipse-temurin:xx-jre-debian-slim。

2403_89345764的博客 48

遥感数字图像处理-matlab-主成份及穗帽变换

遥感数字图像处理-matlab-主成份及穗帽变换

SpringBoot校园求职导师系统开发实战

微服务架构下的智能匹配系统是现代企业级应用的重要场景,其核心在于通过算法实现资源的最优分配。SpringBoot作为轻量级Java框架,通过自动配置和起步依赖显著提升了开发效率,特别适合快速迭代的互联网项目。结合MyBatis等持久层框架,可以高效处理复杂业务逻辑和数据关系。本文以校园求职导师系统为例,详细解析了如何利用SpringBoot+Vue技术栈实现智能匹配、实时预约等核心功能,其中涉及的分布式锁、性能优化等工程实践对高并发场景具有普适参考价值。系统采用的TF-IDF算法和Redis缓存策略,为同类

weixin_34391445的博客 494

VLOOKUP_fixed.py

VLOOKUP_fixed.py

D打卡签到,蓝牙中继,广播信号模拟器

模拟WIFI或蓝牙,有如下4种运行模式 1、WIFI模式:指定SSID、BSSID名称等,模拟WIFI,供设备连接。 2、蓝牙静态模式:指定MAC地址,广播固定的RAW数据。 3、蓝牙动态主机模式:扫描周围蓝牙设备,获取指定MAC地址的蓝牙及其RAW数据,实时发送至Cloud云端,可以设定时间段,只在设定的时间段内发送。 4、蓝牙动态从机模式:指定MAC地址,从Cloud云端获取动态主机模式实时上传的该MAC地址的RAW数据,并广播RAW数据。 准备工作: 1、板子:选择ESP32C3或ESP32C3 Supermini 2、nRF Connect手机app:用于扫描获取待模拟蓝牙设备的MAC和RAW数据。 Wifi分析仪或WiFi魔盒手机APP:用于扫描获取待模拟WIFI设备的SSID和BSSID。 3、可使用官方flash_download_tool_3.9.11工具来固件烧录。 使用说明: 上述完成后,设备首次上电,RESET一侧的指示灯会常亮,可以把它理解成电源指示灯; BOOT一侧的灯会亮,该灯常亮,表示设备开启了AP模式,此时设备会发射一个WIFI信号源,名称为ESPWIFI_AP,密码为12345678,手机或电脑连接该WIFI,浏览器输入192.168.4.1,进入设备的配置页面,进行相应的配置,其中动态主机模式和动态从机模式的SSID、Pwd 及要模拟的蓝牙MAC地址。配置完成并保存后,会重启,重启后设备会按照保存的配置运行。若下次要修改设备配置,可以长按BOOT按键,等待BOOT一侧的灯常亮,即进入AP模式,再按照上述流程配置即可。 仅用于蓝牙设备的开发与调试,请勿用于签到等违法违纪用途。

云原生项目二

本项目基于MySQL8.0与开源大模型API,构建电商订单库智能查询与性能调优系统,实现自然语言转SQL、自动执行、执行计划分析及索引优化,无需专业SQL能力。在openEuler环境下完成网络配置、YUM源设置、时间同步、防火墙关闭及Python3.11编译安装,部署MySQL8.0.45并接入阿里云大模型API,最终通过Streamlit实现可视化交互,完成从环境搭建到AI智能运维的全流程落地。

zfm242397396的博客 199

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

从单体到云原生,自动化测试平台在微服务架构演进中踩过的坑

在当今软件开发中,自动化测试平台的构建已经不再局限于简单的功能实现,而是需要考虑到系统可扩展性、可维护性和稳定性。然而,在将一个自动化测试平台从单体架构演进为微服务,并最终迈向云原生的过程中,我们遇到了一系列问题与挑战。本文将结合自动化测试平台的实际场景,讲述在架构演进过程中遇到的典型问题与解决方案,希望能为准备跳槽或面试的技术人员提供一些真实经验参考。

后台模板 193

企业级AI助手平台 开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力 支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化

企业级AI应用开发框架,支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化能力,提供可视化流程编排、自主决策智能体与多智能体协同调度,兼容主流 Agent Skill 协议,帮助企业与开发者零门槛快速构建安全、高效、可落地的AI智能体应用与行业解决方案。

基于动态窗口法DWA的机器人路径规划研究(Matlab代码实现)

内容概要:本文系统研究了基于动态窗口法(DWA)的机器人局部路径规划算法,深入剖析其在动态环境中实现自主避障与实时轨迹优化的核心机制。文章详细阐述了DWA算法的速度空间采样策略、轨迹预测模型、动力学约束处理及多目标代价函数的设计原理,并通过构建完整的Matlab仿真框架验证算法有效性。结合典型场景的仿真实验,展示了机器人在复杂障碍物环境下如何实时生成安全、平滑且符合运动学约束的最优路径,充分体现了DWA在移动机器人导航中的实用性与鲁棒性。; 适合人群:具备机器人运动规划基础知识和Matlab编程能力,从事智能移动机器人、自动驾驶或服务机器人研发的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解DWA算法的理论基础与实现细节;②掌握机器人局部路径规划的仿真实现方法;③为实际机器人系统的导航模块开发提供可复用的算法原型与代码参考;④作为进一步研究高级导航算法(如TEB、MPC)的技术基础。; 阅读建议:建议结合提供的Matlab代码逐模块分析与调试,重点关注速度采样、轨迹积分、障碍物距离计算及代价评估等关键环节,通过调整参数在不同地图环境中进行对比实验,以深刻把握算法性能与参数之间的关系,进而提升对实时路径规划系统设计的理解与应用能力。

云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析

本文系统复盘企业网站上云部署与云运维实践:基于华为云构建LAMP架构,实现业务与数据分离;通过ELB+AS实现高可用与弹性伸缩;结合IAM、SMN、CTS、CES、LTS等运维服务,建立可观测、可审计、可告警的全链路管控体系,全面支撑云原生环境下的稳定运行与快速排障。

2604_96593683的博客 560

【轴承故障诊断】用于轴承故障诊断的集中时频分析研究(Matlab代码实现)

内容概要:本文系统研究了用于轴承故障诊断的集中时频分析技术,重点解决了传统时频分析方法在处理非平稳信号时存在的能量分散与分辨率不足等问题。通过引入集中时频分析方法,能够有效聚焦信号能量,精确提取轴承故障特征频率,提升故障识别的准确性与时效性。文章详细阐述了该方法的理论基础,并结合仿真信号与实际实验数据验证其优越性能,同时提供了完整的Matlab代码实现流程,涵盖信号预处理、时频变换、参数优化及结果可视化等环节,便于读者复现与拓展应用。; 适合人群:具备一定信号处理理论基础和Matlab编程能力的研究生、科研人员,以及从事机械设备状态监测、故障诊断与预测性维护工作的工程技术人员。; 使用场景及目标:①应用于电机、风机、齿轮箱等旋转机械的早期轴承故障检测,实现故障预警;②提升工业设备运维系统的智能化水平,支撑预测性维护体系构建;③作为高校或研究机构在信号处理、机械故障诊断等课程中的教学案例与实践素材。; 阅读建议:建议读者结合文中提供的Matlab代码逐段运行与调试,深入理解集中时频分布的生成机制及其关键参数(如核函数选择、平滑窗口大小)对诊断效果的影响,并尝试将其应用于其他类型的机械故障信号分析中,开展对比研究以深化对该方法适用性的认识。

云原生运维学习笔记:容器技术的演进、底层原理与 Docker 全生命周期管理

本文系统梳理容器技术演进脉络,从 chroot、Namespace 与 Cgroups 等 Linux 内核机制出发,揭示容器与虚拟机的本质差异。深入解析 Docker 的 C/S 架构、镜像分层原理及 OCI 标准,并通过实战完成 CentOS 环境下 Docker Engine 的定制部署,涵盖 YUM 源配置、镜像加速与远程访问设置,全面掌握容器全生命周期管理核心能力。

2604_96593683的博客 564

ZYNQ专题-7020驱动KSZ9031 PHY芯片

之所以有这篇文章,得益于Alinx的开发板。

Anitawen的博客 4961

Windows10下RTABMAP+T265实现三维建图

win10+rtabmap+t265扫描地形

Suxiang1997的博客 3486

云原生运维实战笔记:华为云存储类服务全景解析——EVS、OBS、SFS与CBR深度实践

本文深度解析华为云EVS、OBS、SFS与CBR四大存储服务,涵盖块存储挂载、文件系统初始化、快照回滚及对象存储实操。通过Windows/Linux系统实战,掌握磁盘分区、格式化、自动挂载及数据保护机制;结合快照实现秒级数据恢复,验证EVS三副本高可靠架构;剖析OBS多层级存储策略与生命周期管理,全面呈现云原生环境下数据持久化与高效管理的完整解决方案。

2604_96593683的博客 461

【Java】利用反射执行Spring容器Bean指定的方法,支持多种参数自动调用

目录 使用情景 目的 实现方式 前提: 思路 核心类 测试方法 使用情景 将定时任务录入数据库(这样做的好处是定时任务可视化,也可以动态修改各个任务的执行时间),通过反射执行对应的方法; 配合Netty实现简单的HTTP请求处理框架 其他需要使用反射执行Spring方法的业务亦可 目的 很多文章都提到了反射,但是对于方法参数处理这一块都是明确了类型,不支持按照实际参数动态转换,而本篇文章提供了一个思路怎么做到方法参数的动态调用。 大家也可以...

ITjianshuzhai的博客 2334

云原生运维实战笔记:华为云计算与网络类服务全景解析

本文系统梳理了公有云中计算类与网络类服务的实操全流程。计算部分覆盖 ECS 的创建、登录与规格变更,IMS 私有镜像制作与批量部署验证,以及 AS 弹性伸缩的配置与策略验证;网络部分覆盖 VPC 内互通与跨 VPC 隔离、安全组有状态包过滤、EIP 的 1:1 NAT 机制、ELB 负载均衡,以及跨 VPC 对等连接与 VPN 互通等场景。文中不仅记录了每一步的配置命令与执行结果,还结合虚拟化、NAT、包过滤等底层原理进行拓展剖析。

2604_96593683的博客 289

气象数据收集

国家气象信息中心-中国气象数据网 (cma.cn)国家气象信息中心-中国气象数据网 (cma.cn)预报数据:需要定制,收费10万+路面数据同化系统,实时。

weixin_42209537的博客 3485

高通SDX35:SGMII接口PHY RTL8211FSI-CG驱动适配

高通SDX35 RTL8211F SGMII

不秃头的程序猿Gabriel的博客 785

云原生基础之Containerd容器运行时

本文介绍了云原生基础中的Containerd核心组件及其管理命令,涵盖镜像、容器、任务与命名空间的管理操作。通过ctr命令可实现镜像拉取、挂载、推送,容器创建与删除,任务启动、暂停及进程查看等。同时说明了Docker与Containerd的关系,指出Docker使用Containerd的moby命名空间,揭示了二者在容器技术栈中的协作机制。

我的梦想有多远,我就能走多远! 322

【Neo4j × Python】基于知识图谱的电影问答系统(含问题记录与解决)附:源代码(含Bug解决)

此前,曾介绍过Neo4j的一些基础知识,本篇将在PyCharm中与Neo4j建立关联,从0到1实现一个基于知识图谱的电影问答系统,实现过程中,没有一帆风顺,而是遇到了一些问题,因此也包含问题的记录与解决。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 3165
上一篇: Spring Boot 3.x 分层架构实战:Controller/Service/Mapper/Entity 职责边界与 4 个常见误区
下一篇: TLE 6208-6 G与PIC18F55K42实现直流电机精确控制
deepfuture
博客等级 码龄17年 210粉丝 1287原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值