Spring Cloud Alibaba 容器化部署最佳实践 | 基于 integrated-example 的 Docker-Compose 实战指南

发布时间:2026/9/19 16:13:19
Spring Cloud Alibaba 容器化部署最佳实践 | 基于 integrated-example 的 Docker-Compose 实战指南 Spring Cloud Alibaba 容器化部署最佳实践 | 基于 integrated-example 的 Docker-Compose 实战指南【免费下载链接】spring-cloud-alibabaSpring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware.项目地址: https://gitcode.com/gh_mirrors/sp/spring-cloud-alibaba本篇技术指南以 Spring Cloud Alibaba 官方仓库中的integrated-example综合集成示例为蓝本系统讲解如何通过 Docker-Compose 一键容器化部署 Nacos、MySQL、RocketMQ、Seata 四大基础组件以及网关、订单、库存、账户、点赞等微服务集群。读者学完本文将掌握从 Hosts 映射、jar 包编译、组件与业务服务双编排启动到 Nacos 配置一键导入、以及「Seata 分布式事务下单」与「Sentinel RocketMQ 削峰填谷点赞」两大典型场景的完整演练方法。一、示例概览与架构认知integrated-example 是 Spring Cloud Alibaba 官方为验证各核心组件协同能力而设计的一体化示例工程它并不只演示某一个组件而是把Nacos注册/配置中心、Seata分布式事务、Sentinel熔断限流、RocketMQ消息削峰、Spring Cloud Gateway网关组合在一条真实的业务链路上对应目录为 integrated-example。从 docker-compose-service.yml 可以看到业务侧一共编排了 7 个容器服务名容器名端口来自 .env职责integrated-frontendintegrated-frontend8080前端演示页面模拟客户端请求integrated-gatewayintegrated-gateway30010Spring Cloud Gateway 统一入口路由分发integrated-accountintegrated-account8012账户微服务余额扣减integrated-orderintegrated-order8013订单微服务下单integrated-storageintegrated-storage8011库存微服务扣减库存integrated-praise-providerintegrated-praise-provider8015点赞消息生产者integrated-praise-consumerintegrated-praise-consumer8014点赞消息消费者限速消费各服务端口通过 docker-compose/.env 统一以环境变量的方式注入 compose 文件如${GATEWAY_PORT}修改端口只需改这一份文件即可。官方在 docker-compose-deploy-zh.md 中给出明确提示使用 Docker-Compose 方式体验 Demo 时请确保本地机器内存资源 24G因为 Nacos、Seata、RocketMQ 等多个中间件与 7 个 Java 微服务容器同时常驻内存低配环境极易 OOM。二、准备工作2.1 安装 Docker 与 Docker-Compose如果本机尚未安装 Docker 与 Docker-Compose请先按官方文档完成环境构建Dockerhttps://docs.docker.com/desktop/install/linux-install/Docker-Composehttps://docs.docker.com/compose/install/安装完成后可用docker --version与docker-compose --version验证命令可用。2.2 配置 Hosts 主机映射容器之间通过**服务名hostname**互相访问例如网关转发到lb://integrated-order、消费者连接rocketmq:9876因此必须在宿主机上配置映射确保前端页面与宿主机侧的访问能够正确解析到容器。将以下映射添加到本机 hosts 配置文件中# for integrated-example 127.0.0.1 integrated-mysql 127.0.0.1 nacos-server 127.0.0.1 seata-server 127.0.0.1 rocketmq 127.0.0.1 gateway-service 127.0.0.1 integrated-frontend这 6 条映射分别对应组件编排文件中的 hostnameMySQLintegrated-mysql、Nacosnacos-server、Seataseata-server、RocketMQrocketmq以及服务编排中的网关gateway-service与前端integrated-frontend。在 docker-compose-env.yml 中可以看到hostname: nacos-server、hostname: integrated-mysql等配置与之逐一对应。2.3 编译 jar 包进入spring-cloud-alibaba-examples目录下执行 Maven 打包命令mvn package该命令会编译整个示例工程为每个微服务生成可执行 jar 包。后续 Docker 构建镜像时各模块的 Dockerfile 会通过ADD ./integrated-gateway/target/integrated-gateway-*.jar /app.jar这类指令把打好的 jar 包复制进镜像因此必须先打包、后启动服务编排顺序不能颠倒。三、快速启动启动过程分三个阶段先启组件基础设施→ 再导入 Nacos 配置 → 最后启业务服务。3.1 组件启动基础设施层进入spring-cloud-alibaba-examples/integrated-example目录执行docker-compose -f ./docker-compose/docker-compose-env.yml up -d该编排文件会启动 4 类基础组件容器详见 docker-compose-env.ymlNacos镜像nacos/nacos-server:v3.1.0以standalone单机模式运行PREFER_HOST_MODEhostname映射端口8848:8848MySQL镜像mysql:5.7root 密码为root初始库integrated_storage并挂载../config-init/sql/init.sql到/docker-entrypoint-initdb.d/init.sql容器首次启动时会自动执行该 SQL 完成建库建表与初始化数据同时通过 command 指定字符集utf8mb4与排序规则utf8mb4_unicode_ciRocketMQ镜像apache/rocketmq:4.9.4分为 NameServersh mqnamesrv端口 9876与 Brokersh mqbroker -c .../broker.conf端口 10909/10911Broker 通过NAMESRV_ADDR: rmqnamesrv:9876指向 NameServer并挂载 broker.conf 作为启动配置Seata Server镜像seataio/seata-server:1.5.1端口8091:8091STORE_MODEfile表示事务会话以文件模式存储便于开箱即用。提示首次启动时 MySQL 需要执行初始化 SQLNacos 需要初始化元数据RocketMQ 需要启动 NameServer 与 Broker各组件就绪需要一定时间。可以去掉-d参数用docker-compose -f docker-compose-env.yml up在前台观察启动日志确认组件全部就绪后再继续下一步。3.2 一键导入 Nacos 配置组件容器运行成功之后需要把微服务的全部配置导入 Nacos进入spring-cloud-alibaba-examples/integrated-example目录在终端中执行配置导入脚本config-init/scripts/nacos-config-quick.sh注意Windows 操作系统可以通过git bash执行 shell 脚本完成配置导入。从脚本 nacos-config-quick.sh 的实现可以看到它逐一读取config-init/config/下的 7 个 YAML 配置文件并以dataIdxxx.yamlgroupintegrated-example的请求参数 POST 到nacos-server:8848/nacos/v1/cs/configs实现配置的一键批量导入dataId配置内容datasource-config.yaml数据源通用配置驱动、账号、MyBatis 驼峰映射integrated-storage.yaml库存服务数据源 URLintegrated-account.yaml账户服务数据源 URLintegrated-order.yaml订单服务数据源 URLintegrated-gateway.yaml网关路由规则integrated-provider.yaml点赞生产者 RocketMQ Stream 绑定integrated-consumer.yaml点赞消费者消费速率与间隔其中 integrated-gateway.yaml 集中定义了 6 条网关路由是理解后续 Demo 的关键例如Path/order/create→lb://integrated-order下单请求转发订单服务Path/storage/→lb://integrated-storage库存查询Path/account/→lb://integrated-account账户查询Path/praise/rocketmq→lb://integrated-provider点赞走 RocketMQ 通道Path/praise/sentinel→lb://integrated-provider点赞走 Sentinel 限流通道Path/praise/query→lb://integrated-consumer查询点赞数integrated-consumer.yaml 则展示了 RocketMQ 削峰填谷的关键参数pullInterval: 4000拉取间隔 4000ms、pullBatchSize: 4每批拉取 4 条即消费者按「每 4 秒消费 4 条」的速率从PRAISE-TOPIC-01拉取点赞消息——这个速率就是大流量被「削峰」的核心手段。3.3 服务启动业务层配置导入完成后进入spring-cloud-alibaba-examples/integrated-example目录执行docker-compose -f ./docker-compose/docker-compose-service.yml up -d该编排会按依赖关系构建并启动 7 个业务容器参考 docker-compose-service.ymlfrontend 依赖 gateway、account、order、storage、praise-consumer、praise-providerpraise-consumer 依赖 praise-provider。所有服务通过env_file: .env注入端口环境变量。从各模块的 application.yaml 可以印证服务与组件的关联方式# integrated-gateway 示例 server: port: 30010 spring: application: name: integrated-gateway cloud: nacos: config: server-addr: nacos-server:8848 group: integrated-example file-extension: yaml discovery: server-addr: nacos-server:8848 group: integrated-example config: import: optional:nacos:integrated-gateway.yaml即所有服务注册到nacos-server:8848group 为integrated-example并通过 Spring Cloud Config 的optional:nacos:方式拉取对应 dataId 的配置。而订单服务 application.yaml 还额外引入了optional:nacos:datasource-config.yaml公共数据源配置并声明了 Seata 事务组seata: application-id: ${spring.application.name} tx-service-group: ${spring.application.name}-group service: vgroup-mapping: integrated-order-group: default grouplist: default: seata-server:8091表示订单服务通过seata-server:8091参与全局事务这正是下一节分布式事务演示得以成立的基础。四、停止所有容器4.1 停止服务容器进入spring-cloud-alibaba-examples/integrated-example目录执行docker-compose -f ./docker-compose/docker-compose-service.yml down4.2 停止组件容器docker-compose -f ./docker-compose/docker-compose-env.yml down在容器启动时可以通过docker-compose -f docker-compose-*.yml up不带-d在前台观察容器的完整启动过程便于排查启动失败或依赖未就绪的问题。五、体验 Demointegrated-example 针对各组件选取了两组典型场景分布式事务Seata与熔断限流、削峰填谷Sentinel RocketMQ。5.1 分布式事务能力Seata场景说明场景为用户下单购买货物一次下单会依次触发三个微服务操作请求库存模块扣减库存扣减账户余额生成订单信息并返回响应。三个操作跨越integrated-storage、integrated-account、integrated-order三个独立数据源由 Seata 统一协调保证「库存、余额、订单」要么全部成功、要么全部回滚。init.sql 中为 storage、account、order 三个库分别创建了 Seata 所需的undo_log表见 init.sql这是 Seata 二阶段回滚的数据基础。前置数据前面初始化业务数据库时MySQL 容器首次启动自动执行 init.sql应用已经写入了如下初始数据账户user_id admin余额3 元integrated_account.account表库存商品编号1库存100 件integrated_storage.storage表点赞商品编号1初始点赞数0integrated_praise.item表。启动测试访问http://integrated-frontend:8080/order进入下单页面直接点击下单按钮提交表单应用即模拟客户端向网关/order/create发送创建订单请求用户的 userId 为admin用户下单的商品编号为1号此次订单购买的商品个数为 1 个。在本 Demo 中为了便于演示每件商品的单价都为 2。因此首次下单的预期结果为创建订单成功商品 1 号库存由 100 扣减为99100-199admin 账户余额由 3 扣减为13-21。如果再次请求相同的接口同样是先扣减库存99-198但此时会因为admin 用户余额不足1-2 0而抛出异常该异常被 Seata 捕获触发分布式事务二阶段提交回滚本次下单在库存侧的扣减、订单侧的新增全部回滚。回滚之后查询数据库可以看到库存记录仍为 99 件与下单前完全一致证明全局事务的原子性生效。从源码结构看这个链路由网关路由Path/order/create → lb://integrated-order承接订单服务内通过 Feign/服务调用串联库存与账户服务并由GlobalTransactional之类的 Seata 注解统一开启全局事务可结合 order-service 相关示例 理解事务边界定义方式。5.2 熔断限流削峰填谷能力Sentinel RocketMQ场景说明针对大流量背景下的服务熔断限流与削峰填谷示例提供了用户为商品点赞的场景并给出两种应对大流量的处理方式Sentinel 在网关侧绑定指定网关路由进行服务的熔断降级当并发请求超过阈值时多余的请求被快速失败并返回 fallback保护下游服务RocketMQ 进行流量削峰填谷大流量请求下生产者向 Broker 投递消息消费者按照可配置的消费速率拉取消费避免大流量直接压垮数据库。启动测试Sentinel 服务熔断降级访问http://integrated-frontend:8080/sentinel体验对应场景。网关路由点赞服务的限流规则为 5而前端通过异步处理模拟了10 次并发请求。因此当流量到达网关时Sentinel 针对超过阈值的流量直接在 Gateway 侧进行服务熔断返回 fallback 给客户端同时数据库中商品的点赞数得到更新5即只有 5 个请求真正穿透到下游服务其余 5 个被网关拦截降级。这一行为与网关配置中Path/praise/sentinel → lb://integrated-provider的路由直接对应Sentinel 与 Spring Cloud Gateway 的集成方式可进一步参考 sentinel-spring-cloud-gateway-example。启动测试RocketMQ 流量削峰填谷访问http://integrated-frontend:8080/rocketmq体验对应场景。由于之前在 Nacos 中已经配置了integrated-praise-consumer消费者模块的消费速率与间隔即前文提到的pullInterval: 4000、pullBatchSize: 4点击按钮时应用会模拟1000 个点赞请求integrated-praise-provider将 1000 次请求全部投递到 RocketMQ Brokerdestination 为PRAISE-TOPIC-01参见 integrated-provider.yaml消费者模块按照配置的消费速率分批拉取并消费消息消费结果逐批更新数据库中商品的点赞数。在页面上可以看到数据库中点赞个数正在动态更新——1000 个请求没有一次性灌入数据库而是以「每 4 秒 4 条」的节奏被慢慢消化这正是 RocketMQ 削峰填谷特性的直观体现。该能力的实现基于 Spring Cloud Stream RocketMQ Binder消息生产者与消费者的绑定声明均可在 Nacos 配置中动态调整相关用法可参考 rocketmq-example。六、总结与延伸学习integrated-example 的价值在于它把 Nacos、Seata、Sentinel、RocketMQ、Gateway 五大能力串成了一条可运行、可观察、可验证的完整业务链路组件层用 docker-compose-env.yml 一键拉起配置层用 nacos-config-quick.sh 一键导入业务层用 docker-compose-service.yml 一键部署最后通过 3 个前端页面即可完整体验分布式事务与高并发削峰两大核心场景。需要说明的是本示例仅是针对各个组件选取了较为典型的功能特性来服务应用场景各组件的能力远不止于此。如果想深入了解每一个组件的完整功能官方建议学习各组件独立的 example 文档Nacos examples含 config 与 discovery 两个方向Sentinel core exampleSeata exampleRocketMQ example此外integrated-example 还提供了本地部署与 Kubernetes 部署的配套文档分别见 local-deployment-zh.md 与 kubernetes-deployment-zh.md读者可按自身环境选择适合的部署形态。【免费下载链接】spring-cloud-alibabaSpring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware.项目地址: https://gitcode.com/gh_mirrors/sp/spring-cloud-alibaba创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考