ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Mall4cloud微服务商城:生产级电商全链路脚手架

Mall4cloud微服务商城:生产级电商全链路脚手架 简介Mall4cloud微服务商城系统是一套面向Java后端开发者与电商系统架构学习者的B2B2C全链路电商解决方案聚焦新零售场景下的高并发、分布式事务与多模块协同问题。系统基于Spring Cloud Alibaba技术栈构建深度集成Nacos服务发现、Seata分布式事务、RocketMQ异步解耦、ElasticSearch商品检索及MinIO对象存储等核心组件覆盖用户中心、商品管理、订单履约、营销活动等完整业务域。资源包共1569个文件含520个Java业务逻辑类、273个JS前端交互脚本、135个Vue页面组件、335个PNG/SVG图标资源及69个XML配置文件辅以SQL建表语句、YML环境配置、Dockerfile容器化部署脚本等整体压缩后仅17.01MB结构清晰、开箱即用。目前已有167人学习下载读者可直接获取可运行的微服务分层代码结构、标准化模块划分如platform、broker、nginx等预览中体现的工程目录、生产级中间件联调配置及CAPTCHA缓存服务等典型功能实现是理解电商中台架构演进与Spring Cloud落地实践的优质参考样本。1. Mall4cloud微服务商城系统不是又一个Spring Boot单体Demo而是能跑通「用户下单→库存扣减→订单履约→支付回调」全链路的生产级脚手架你肯定见过太多叫“mall”的开源商城——点开 GitHubREADME 写着「基于 Spring Cloud Alibaba 构建」但 clone 下来mvn clean install卡在 Nacos 配置加载失败docker-compose up启动后前端 404、网关 502、商品服务连不上 MySQL翻 issue 区全是「求个完整部署文档」「Nacos 密码是多少」「gateway 路由不生效怎么 debug」。Mall4cloud 不是那种「概念验证型」项目。它是一套真实按电商业务域拆分、带完整领域事件驱动、支持 Docker 一键拉起、Nginx 反向代理可直接映射多端口开发环境、且每个服务都预留了 Sentinel 限流 Seata 分布式事务接入点的微服务商城系统。它解决的不是「怎么写个 Hello World 微服务」而是「如何让 3 个后端在 2 天内把用户中心、商品中心、订单中心跑通联调并能用 Postman 模拟真实下单流程」。适合刚从单体架构转过来、正在落地第一个微服务项目的中小团队技术负责人也适合想系统练手 Spring Cloud Gateway Nacos Seata SkyWalking 全链路的中级 Java 工程师——它不教你怎么配 Maven但会告诉你为什么mall-gateway的application.yml里spring.cloud.gateway.routes[0].urilb://mall-product必须写成lb://开头以及lb://后面那个服务名到底从哪来、改错一个字母就导致整个路由失效。2. 本地启动 Mall4cloud从源码拉取到 Docker 容器集群就绪的最小可行路径Mall4cloud 的设计哲学是「先跑通再优化」。它不强制你装 Kubernetes也不要求你提前部署一套高可用 Nacos 集群。它的本地开发模式就是用 Docker Desktop 启动基础中间件Nacos、MySQL、Redis、RabbitMQ用 Maven 编译各微服务 Jar 包再用java -jar启动服务最后用 Nginx 做反向代理统一入口。这套组合拳对 Windows/macOS/Linux 全平台友好且所有配置文件都已预置好默认值你唯一要改的只有数据库密码和 Nacos 地址——而这两个值在mall-common模块的application-dev.yml里被统一管理改一处全局生效。2.1 拉取源码并确认分支与模块结构Mall4cloud 的官方仓库GitHub 上搜索mall4cloud采用标准的多模块 Maven 结构。不要 clone 错成mall4j或mall-admin这类名字相近但无关的项目。执行以下命令git clone https://github.com/mall4cloud/mall4cloud.git cd mall4cloud git checkout main # 当前主力分支是 main非 master ls -l你会看到核心模块列表mall-api所有服务共用的 API 定义DTO、VO、Feign Client 接口mall-auth认证授权中心OAuth2 JWT含登录、鉴权、权限分配mall-gatewaySpring Cloud Gateway 网关路由、限流、跨域、JWT 解析mall-product商品中心SPU/SKU、分类、品牌、库存查询mall-order订单中心创建订单、扣减库存、生成支付单mall-pay支付中心模拟微信/支付宝回调、支付状态同步mall-common通用工具类、配置、异常处理器、MyBatis Plus 公共配置mall-uiVue3 Element Plus 前端工程非必须可单独部署提示mall-ui是独立前端不打包进后端 Jar。它通过 Nginx 反向代理访问mall-gateway所以你不需要npm run serve启动前端也能测试接口。先专注后端链路打通。2.2 用 Docker Desktop 一键启动中间件集群Mall4cloud 提供了开箱即用的docker-compose.yml文件位于项目根目录。它定义了 4 个必需中间件容器Nacos注册中心配置中心、MySQL 8.0业务库、Redis 7缓存分布式锁、RabbitMQ 3.12订单超时取消、库存回滚等异步消息。执行前请确保 Docker Desktop 已运行且资源分配充足建议至少 4GB 内存# 在 mall4cloud 根目录下执行 docker-compose up -d该命令会自动拉取镜像并后台启动。等待约 30 秒后检查容器状态docker ps -a --filter statusrunning --format table {{.Names}}\t{{.Status}}\t{{.Ports}}你应该看到类似输出NAME STATUS PORTS mall4cloud-nacos Up 2 minutes 0.0.0.0:8848-8848/tcp, :::8848-8848/tcp mall4cloud-mysql Up 2 minutes 0.0.0.0:3306-3306/tcp, :::3306-3306/tcp mall4cloud-redis Up 2 minutes 0.0.0.0:6379-6379/tcp, :::6379-6379/tcp mall4cloud-rabbit Up 2 minutes 0.0.0.0:5672-5672/tcp, 0.0.0.0:15672-15672/tcp, :::5672-5672/tcp, :::15672-15672/tcp关键验证点访问http://localhost:8848/nacos默认账号密码nacos/nacos进入 Nacos 控制台确认左侧「服务管理」为空说明还没注册服务正常访问http://localhost:15672RabbitMQ Web UI账号密码guest/guest确认 Queues 列表为空后续订单服务会自动创建order.cancel.delay等队列mysql -h127.0.0.1 -P3306 -uroot -p密码为mall4cloud见docker-compose.yml中MYSQL_ROOT_PASSWORD执行SHOW DATABASES;应看到mall4cloud库初始化 SQL 在mall-common/src/main/resources/sql/目录下Docker 启动时已自动执行。2.3 编译并启动核心微服务Auth Gateway Product OrderMall4cloud 的服务启动顺序有强依赖必须先启mall-auth提供 JWT 签发再启mall-gateway需从 Auth 获取公钥最后启业务服务Product/Order。每个服务都使用spring-boot-maven-plugin打包为可执行 Jar无需额外安装 Tomcat。# 1. 先编译整个项目跳过测试节省时间 mvn clean package -Dmaven.test.skiptrue # 2. 启动认证中心监听 9000 端口 java -jar mall-auth/target/mall-auth-*.jar --spring.profiles.activedev # 3. 启动网关监听 8080 端口 java -jar mall-gateway/target/mall-gateway-*.jar --spring.profiles.activedev # 4. 启动商品中心监听 8081 端口 java -jar mall-product/target/mall-product-*.jar --spring.profiles.activedev # 5. 启动订单中心监听 8082 端口 java -jar mall-order/target/mall-order-*.jar --spring.profiles.activedev 参数说明--spring.profiles.activedev指定使用application-dev.yml配置该文件中spring.cloud.nacos.discovery.server-addrlocalhost:8848和spring.cloud.nacos.config.server-addrlocalhost:8848已指向本地 Docker Nacos。表示后台运行方便你继续输入命令。若需查看日志去掉并用CtrlC终止。启动成功标志查看控制台日志每项服务最后一行应为Started [ServiceName] in X.XXX seconds回到 Nacos 控制台 →「服务管理」应看到mall-auth、mall-gateway、mall-product、mall-order四个服务实例健康状态为UPcurl http://localhost:8080/actuator/health网关健康检查端点返回{status:UP}curl http://localhost:8080/mall-auth/oauth/token -d grant_typepassword -d usernameadmin -d password123456应返回包含access_token的 JSON说明 Auth 正常签发 Token。此时后端服务链路已通网关能路由请求 → Auth 能签发 Token → Product 能查商品 → Order 能创建订单。下一步就是让前端或 Postman 能通过统一域名访问它们——这正是 Nginx 的用武之地。3. Nginx 反向代理配置把 8080/8081/8082 等端口收束到 localhost:80模拟生产环境域名访问很多开发者卡在「服务都起来了但前端访问http://localhost:8080/api/product/list报 CORS改成http://localhost:80/api/product/list又 404」。根本原因在于浏览器同源策略禁止跨端口请求而 Mall4cloud 的网关默认只监听 8080前端工程mall-ui默认走 8080 端口两者端口不同即跨域。解决方案不是在网关里狂加CrossOrigin注解而是用 Nginx 做反向代理让所有请求看起来都来自http://localhost端口 80再由 Nginx 内部转发到对应后端服务。这是生产环境的标准做法也是 Mall4cloud 文档里明确推荐的本地开发模式。3.1 下载并配置 NginxWindows/macOS/Linux 通用Nginx 官方下载页nginx.org提供各平台二进制包。Windows 用户推荐使用nginx-1.24.0.zip最新稳定版解压后进入conf目录编辑nginx.conf。不要动原始http { ... }块只在http块末尾追加upstream和server配置# mall4cloud 专用 upstream定义后端服务集群 upstream mall-gateway { server localhost:8080; } upstream mall-product { server localhost:8081; } upstream mall-order { server localhost:8082; } upstream mall-auth { server localhost:9000; } # 主 server 块监听 80 端口处理所有 mall4cloud 请求 server { listen 80; server_name localhost; # 前端静态资源mall-ui build 后的 dist 目录 location / { root html/mall-ui; # 请将 mall-ui 的 dist 目录复制到 nginx/html/mall-ui 下 index index.html; try_files $uri $uri/ /index.html; # 支持 Vue Router history 模式 } # API 请求全部代理到 mall-gateway location /api/ { proxy_pass http://mall-gateway/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 网关健康检查端点可选 location /actuator/ { proxy_pass http://mall-gateway/; } # Nacos 控制台反向代理方便统一入口 location /nacos/ { proxy_pass http://localhost:8848/; proxy_redirect off; proxy_set_header Host $host; } }关键参数说明proxy_pass http://mall-gateway/;末尾的/至关重要它表示「去除匹配的/api/前缀后再转发」。例如请求http://localhost/api/product/listNginx 会转发http://localhost:8080/product/list给网关网关再根据路由规则分发给mall-product。若漏掉/会转发http://localhost:8080/api/product/list网关找不到/api/开头的路由直接 404。try_files $uri $uri/ /index.html;解决 Vue Router history 模式下刷新 404 问题。当请求/user/profile时Nginx 先找html/mall-ui/user/profile文件找不到则返回html/mall-ui/index.html由前端路由接管。root html/mall-ui;请提前将mall-ui项目执行npm run build后生成的dist目录整体复制到 Nginx 安装目录的html/mall-ui路径下Windows 路径如C:\nginx\html\mall-ui。3.2 启动 Nginx 并验证代理链路Windows双击nginx.exe或命令行执行start nginxmacOS/Linuxsudo nginx首次启动或sudo nginx -s reload重载配置验证是否生效打开浏览器访问http://localhost应看到 Mall4cloud 前端登录页若提示 404请检查html/mall-ui路径是否正确或dist是否已构建打开浏览器开发者工具F12→ Network登录账号admin/123456观察登录请求 URL 是http://localhost/api/auth/oauth/token状态码 200响应体含access_token登录后点击「商品管理」Network 中查看http://localhost/api/product/list请求响应应为商品列表 JSON手动构造下单请求用 PostmanPOST http://localhost/api/order/createBody 为 JSON{ productId: 1, count: 1 }应返回订单号及支付信息。此时你已拥有一套完全符合生产习惯的本地开发环境前端走http://localhostAPI 走http://localhost/api/xxx所有请求经 Nginx → Gateway → 业务服务中间件由 Docker 托管端口隔离清晰无任何跨域报错。这才是微服务开发该有的样子。4. Mall4cloud 微服务拆分逻辑与网关路由配置看懂mall-gateway的application.yml才能自己加新服务Mall4cloud 的微服务不是简单按功能切分而是严格遵循 DDD领域驱动设计思想以「业务能力」为边界划分服务。比如mall-product不仅管商品展示还负责 SKU 库存扣减因为库存是商品的核心状态而订单创建、支付、发货履约则归属mall-order它通过 RabbitMQ 发布「订单创建成功」事件由mall-product订阅并执行库存扣减——这种松耦合设计才是微服务避免「分布式单体」陷阱的关键。理解这一点才能读懂mall-gateway的路由配置并在需要时快速接入新服务如mall-coupon优惠券中心。4.1mall-gateway的核心路由规则解析打开mall-gateway/src/main/resources/application-dev.yml找到spring.cloud.gateway.routes配置段。它定义了所有外部请求如何被分发到后端服务。我们逐条分析最常用的 3 条- id: product_route uri: lb://mall-product predicates: - Path/api/product/** filters: - StripPrefix2 # 去掉 /api/product 前缀只保留 /list 或 /detail/1 - id: order_route uri: lb://mall-order predicates: - Path/api/order/** filters: - StripPrefix2 - id: auth_route uri: lb://mall-auth predicates: - Path/api/auth/** filters: - StripPrefix2关键机制说明uri: lb://mall-productlb://表示「Load Balancer」即从 Nacos 注册中心查找名为mall-product的服务实例列表并做负载均衡。这个服务名必须与mall-product模块的application-dev.yml中spring.application.namemall-product完全一致。大小写、中横线都不能错否则网关启动时报Unable to find instance for mall-product。predicates: - Path/api/product/**Spring Cloud Gateway 的断言Predicate表示匹配所有以/api/product/开头的请求。**是通配符匹配多级路径如/api/product/list、/api/product/detail/1001。filters: - StripPrefix2过滤器表示「剥离匹配路径的前 2 级」。因为匹配的是/api/product/**/api是第1级/product是第2级剥离后/api/product/list变成/list/api/product/detail/1001变成/detail/1001。这样mall-product服务内部 Controller 就只需写GetMapping(/list)无需关心前面的/api/product前缀。4.2 如何为新服务如mall-coupon添加网关路由假设你要接入优惠券中心mall-coupon监听 8083 端口步骤如下确保mall-coupon已注册到 Nacos检查其application-dev.yml中spring.application.namemall-coupon且spring.cloud.nacos.discovery.server-addrlocalhost:8848在mall-gateway的application-dev.yml中新增路由- id: coupon_route uri: lb://mall-coupon predicates: - Path/api/coupon/** filters: - StripPrefix2重启mall-gatewayjava -jar mall-gateway/target/mall-gateway-*.jar --spring.profiles.activedev验证curl http://localhost/api/coupon/list应返回优惠券列表前提是mall-coupon服务已实现该接口。注意StripPrefix2是固定套路只要你的新服务也遵循/api/{service-name}/**的路径规范就无需修改。这也是 Mall4cloud 统一 API 前缀设计的价值——降低网关配置复杂度。4.3 网关的 JWT 鉴权逻辑为什么/api/auth/**路由不校验 Token观察mall-gateway的GlobalFilter实现com.mall4cloud.gateway.filter.AuthFilter你会发现一个关键逻辑所有请求进入网关后先判断Path是否匹配/api/auth/**或/actuator/**若是则跳过 JWT 校验直接放行否则解析 Header 中的Authorization: Bearer xxx用mall-auth提供的公钥验签。这就是为什么你能直接调用/api/auth/oauth/token获取 Token——登录接口本身就不能要求你先有 Token。验证方法用 Postman 发送GET http://localhost/api/product/list不带AuthorizationHeader返回 401带上Authorization: Bearer eyJhb...之前登录获取的 Token返回商品列表。这证明网关的鉴权链路已生效。5. 避坑指南Mall4cloud 本地启动最常见的 5 个血泪问题与解法Mall4cloud 文档齐全但新手仍极易在几个关键节点翻车。以下是我在 3 个不同客户现场陪跑部署时被问得最多、最耽误时间的 5 个问题。每个都按「现象 → 原因 → 解决」给出可立即执行的方案拒绝模棱两可的「检查配置」。5.1 现象docker-compose up -d后mall4cloud-nacos容器反复重启docker logs mall4cloud-nacos显示ERROR Startup errors : java.lang.IllegalStateException: unable to find local peer: nacos-1.nacos-headless.default.svc.cluster.local:8848原因这是 Nacos Docker 镜像的「集群模式」配置错误。Mall4cloud 的docker-compose.yml默认使用单机模式MODEstandalone但如果你误删了environment下的- MODEstandalone或镜像版本升级后默认行为变更Nacos 会尝试以集群模式启动去 DNS 查找nacos-1.nacos-headless.default.svc.cluster.localKubernetes Service 域名本地 Docker 网络无法解析导致启动失败。解决打开docker-compose.yml定位nacos服务块确保其environment下有且仅有这一行- MODEstandalone执行docker-compose down docker-compose up -d重建容器。5.2 现象mall-gateway启动时报Caused by: com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance after all servers([127.0.0.1:8848]) tried但curl http://localhost:8848/nacos能打开控制台原因mall-gateway的application-dev.yml中spring.cloud.nacos.discovery.server-addr配置为localhost:8848这在宿主机上是对的但mall-gateway是 Java 进程运行在宿主机而 Nacos 是 Docker 容器它们之间网络互通。问题出在Windows/macOS 的 Docker Desktop 使用虚拟机Hyper-V/VMware Fusion隔离网络localhost在 Java 进程里指向宿主机环回地址而 Nacos 容器 IP 并非127.0.0.1。Linux Docker 则无此问题。解决Windows/macOS 专属将application-dev.yml中spring.cloud.nacos.discovery.server-addr和spring.cloud.nacos.config.server-addr的localhost改为host.docker.internal:8848host.docker.internal是 Docker Desktop 为宿主机提供的特殊 DNS 名容器内可解析为宿主机 IPJava 进程也可解析保存后重启mall-gateway。5.3 现象Nginx 访问http://localhost/api/product/list返回502 Bad Gatewaynginx/logs/error.log记录connect() failed (111: Connection refused) while connecting to upstream原因Nginx 的upstream配置指向localhost:8081但mall-product服务并未启动或启动后因数据库连接失败而崩溃退出此时docker ps看不到mall-product进程。常见于 MySQL 密码错误或mall-product的application-dev.yml中spring.datasource.url的 IP 写成了127.0.0.1应为host.docker.internal。解决先执行ps aux | grep mall-productmacOS/Linux或tasklist | findstr mall-productWindows确认mall-product进程是否存在若不存在手动启动java -jar mall-product/target/mall-product-*.jar --spring.profiles.activedev观察控制台是否有Failed to obtain JDBC Connection错误若有打开mall-product/src/main/resources/application-dev.yml将spring.datasource.url: jdbc:mysql://127.0.0.1:3306/...改为jdbc:mysql://host.docker.internal:3306/...重启mall-product。5.4 现象前端登录后点击「提交订单」按钮Network 显示POST http://localhost/api/order/create返回401 Unauthorized但 Token 是有效的用该 Token 调GET /api/product/list成功原因mall-order服务的application-dev.yml中mall.auth.jwt.public-key配置错误。网关校验 Token 后会将用户信息userId,username放入ServerWebExchange的attributesmall-order从attributes中取userId。但如果mall-order自己也尝试解析 Token比如某些自定义 Filter而其配置的公钥与mall-auth不一致就会解析失败导致后续逻辑拿不到userId抛出 401。解决打开mall-auth/src/main/resources/application-dev.yml找到mall.auth.jwt.public-key的值一长串 Base64 字符串打开mall-order/src/main/resources/application-dev.yml将mall.auth.jwt.public-key的值完全替换为mall-auth中的值重启mall-order。5.5 现象mall-order创建订单时控制台报org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method cancelOrder threw exception且订单未被取消原因RabbitMQ 的order.cancel.delay队列未被声明。Mall4cloud 使用 RabbitMQ 的 Delayed Message Plugin 实现订单超时取消该插件需在 RabbitMQ 启动时启用且mall-order的RabbitListener注解会自动声明队列。但若 RabbitMQ 容器是docker-compose up -d启动的而mall-order先于 RabbitMQ 启动RabbitListener初始化失败队列未创建后续消息发送失败。解决执行docker restart mall4cloud-rabbit重启 RabbitMQ等待 10 秒再执行java -jar mall-order/target/mall-order-*.jar --spring.profiles.activedev观察mall-order日志应看到Auto-declaring a non-durable, auto-delete, or exclusive Queue字样证明队列已声明成功。6. 进阶技巧用 VS Code 的launch.json统一管理多个微服务启动告别终端刷屏当你需要频繁启停mall-auth、mall-gateway、mall-product、mall-order这 4 个服务时每次敲 4 行java -jar命令不仅低效还容易漏掉--spring.profiles.activedev参数导致连错 Nacos。VS Code 的 Java Extension Pack 提供了强大的调试配置能力我们可以用一个launch.json文件把所有服务的启动参数、环境变量、JVM 参数集中管理点击「Run and Debug」侧边栏的绿色三角一键启动全部服务——这才是现代 Java 微服务开发该有的效率。6.1 创建统一launch.json配置文件在 Mall4cloud 项目根目录下创建.vscode/launch.json若.vscode目录不存在则新建{ version: 0.2.0, configurations: [ { type: java, name: mall-auth, request: launch, mainClass: com.mall4cloud.auth.MallAuthApplication, projectName: mall-auth, args: --spring.profiles.activedev, env: { SPRING_PROFILES_ACTIVE: dev }, vmArgs: -Xms512m -Xmx1024m -XX:MetaspaceSize128m }, { type: java, name: mall-gateway, request: launch, mainClass: com.mall4cloud.gateway.MallGatewayApplication, projectName: mall-gateway, args: --spring.profiles.activedev, env: { SPRING_PROFILES_ACTIVE: dev }, vmArgs: -Xms512m -Xmx1024m -XX:MetaspaceSize128m }, { type: java, name: mall-product, request: launch, mainClass: com.mall4cloud.product.MallProductApplication, projectName: mall-product, args: --spring.profiles.activedev, env: { SPRING_PROFILES_ACTIVE: dev }, vmArgs: -Xms512m -Xmx1024m -XX:MetaspaceSize128m }, { type: java, name: mall-order, request: launch, mainClass: com.mall4cloud.order.MallOrderApplication, projectName: mall-order, args: --spring.profiles.activedev, env: { SPRING_PROFILES_ACTIVE: dev }, vmArgs: -Xms512m -Xmx1024m -XX:MetaspaceSize128m } ], compounds: [ { name: mall4cloud-all, configurations: [mall-auth, mall-gateway, mall-product, mall-order] } ] }配置说明mainClass每个服务的 Spring Boot 启动类全限定名可在对应模块的src/main/java下找到XxxApplication.javaprojectName对应 Maven 模块名VS Code Java 插件据此识别依赖和 classpathargs启动参数--spring.profiles.activedev是必需的vmArgsJVM 参数-Xms512m -Xmx1024m防止内存溢出-XX:MetaspaceSize128m避免元空间耗尽compounds定义组合配置mall4cloud-all它会按顺序启动所有列出的配置。6.2 使用launch.json启动服务并实时调试打开 VS Code打开 Mall4cloud 项目根目录按CtrlShiftPWindows/Linux或CmdShiftPmacOS输入Java: Configure Classpath确保所有模块都被正确识别按CtrlShiftD打开「Run and Debug」侧边栏在「RUN AND DEBUG」下拉框中选择mall4cloud-all点击绿色三角形「Start Debugging」VS Code 会依次启动 4 个服务并在下方「DEBUG CONSOLE」显示每个服务的启动日志任意服务代码行打上断点如mall-order的OrderServiceImpl.createOrder()发起下单请求VS Code 会自动停在断点处可查看变量、Step Into、Watch 表达式。进阶技巧在mall-gateway的GlobalFilter中打断点观察请求如何被路由、Token 如何被解析、ServerWebExchange的attributes如何传递用户信息——这是理解 Mall4cloud 安全与路由机制最直观的方式。6.3 为什么不用docker-compose启动 Java 服务——一个关于开发效率的硬核对比有人会问既然 Docker 能启动中间件为什么不把mall-auth等 Java 服务也写进docker-compose.yml答案是开发阶段Docker 启动 Java 服务 自废武功。原因有三对比维度VS Codelaunch.json启动Docker 启动 Java 服务启动速度 3 秒JVM 热加载类文件修改后 CtrlS 即生效 30 秒每次docker builddocker run调试能力全功能断点、变量监视、表达式求值、热替换仅能看日志无法交互式调试需暴露 JDWP 端口并配置远程调试配置灵活性launch.json中可为每个服务单独设 JVM 参数、环境变量docker-compose.yml中需为每个服务写environment和volumes维护成本高我坚持用launch.json管理开发期服务只用 Docker 托管中间件。上线时才用本文还有配套的精品资源点击获取
返回列表