同城小程序上云后,若静态资源与业务接口挤在同一台机器、同一套发布流程里,常见症状是:改一张 Banner 要重启 API;高峰时图片拖慢下单接口;回滚一次误伤订单服务。更稳的做法是云上静态资源与接口分开部署,各管各的扩容与发布。
本文从部署视角讲拆分拓扑与发布顺序。不绑定具体云产品菜单路径,不涉及域名引导。
一、为什么要拆
小程序端同时依赖:
- 静态资源:图片、主题 JSON、富文本片段(读多写少,宜 CDN)
- 业务接口:登录、下单、查单、配置版本(读写在高峰时都要稳)
混部署时,对象存储大文件回源打穿 API 节点;或 API 发版导致 CDN 回源短暂 502,用户端白屏。
+--> static bucket + CDN (Banner, theme)
mini-app |
+--> API gateway --> order/config services (ECS/K8s)
二、推荐拓扑
# 教学示意:静态与接口分离
static:
storage: object_storage
cdn: enabled
cache_control: "public, max-age=3600"
api:
gateway: slb_or_ingress
services:
- name: config-service
replicas: 2
- name: order-service
replicas: 3
db: rds_primary
readonly: rds_replica_optional
原则:
- 静态 URL 带内容哈希,发布新图不覆盖旧对象,回滚只需改配置指针
- API 无状态,水平扩容;会话与订单状态落库,不落本地磁盘
- 配置变更写库 + 递增版本,不通过覆盖静态 JSON 文件「冒充」接口
三、发布流程分开
静态发布
- 上传新对象
banner/abc123.jpg - 后台配置指向新 URL
- CDN 预热(可选)
- 无需重启 order-service
接口发布
- 滚动升级 config/order 镜像
- 健康检查通过再摘旧实例
- 数据库迁移与代码发版同步窗口
禁止「改静态也走 API 容器内本地目录」,否则多副本间文件不一致,用户命中不同节点看到不同 Banner。
四、接口层最小职责
# config-service:只返回版本与 JSON 指针
def get_config_version(city_id: str):
row = db.fetch_one(
"SELECT version, payload_url FROM mini_config WHERE city_id=%s",
city_id,
)
return {
"version": row.version, "url": row.payload_url}
# order-service:不读本地 theme 文件
def create_order(payload):
...
静态 JSON 若过大,宜放对象存储,接口只返回签名 URL 或 CDN 地址,减轻 API 带宽。
五、高峰与成本
- CDN:靠边缘缓存扩容;关键营业开关 TTL 不宜过长。
- API:无状态加副本;注意数据库连接池上限。
- DB:主库写、只读副本读列表;下单仍写主库。
导出、报表等重任务宜异步队列,不要与下单接口共线程池。
六、回滚策略
- 静态:配置指针指回
banner/old456.jpg,秒级生效 - 接口:镜像回滚 + 数据库变更可逆脚本
- 禁止「整站快照回滚」一把梭,除非静态与接口版本绑在一起(不推荐)
七、与小程序端的契约
小程序启动:
- 调轻量
/config/version - 版本变化再拉静态 JSON URL
- 下单走
/orders,与静态层无关
这样运营改图不触发小程序重新提审,也不重启订单服务。
八、交付验收清单
- 静态桶与 API 集群独立账号与监控
- 改 Banner 不重启 API Pod/ECS
- API 单节点故障,下单仍成功
- CDN 失效时,接口仍返回正确配置版本
- 私有化环境文档写清「静态发布」与「接口发布」两套步骤
九、成品侧说明
光合同城由郑州光合科技有限公司交付同城本地生活成品系统,支持私有化部署与源码交付。云上静态资源与接口分开部署,是「改完配置用户端能尽快看到新页面」的基础设施前提;交付时宜附带拓扑说明与发布 Runbook,而不是只给一份混合压缩包。
十、监控与日常运维
建议分开看两类告警:CDN 回源失败率与 API 5xx。前者影响「新 Banner 看不见」,后者影响「下单失败」。不要把两类告警绑在同一个群里却用同一套处理方式。
静态桶宜开启版本控制或至少保留上一版对象,回滚时只改配置指针。接口发版前在预发环境用同一套小程序体验版指向预发 API,确认配置版本拉取正常,再切生产。
数据库备份窗口尽量避开运营自发的大促改图时段;若必须在白天改静态,优先走新 URL 而不是覆盖旧对象,减少 CDN 旧缓存与用户端本地缓存同时命中的概率。
十一、小结
同城小程序云上部署,静态资源走对象存储与 CDN,业务接口走无状态服务与独立发版,才能既保高峰下单稳定,又让运营改图改文案不必碰订单核心。拆分不是多此一举,而是把「用户端看不到新页面」和「下单变慢」两类故障拆开治理。