本地生活系统架构拆解:多端链路与模块开关验收
2026/8/23 22:10:19 网站建设 项目流程

技术评审「本地生活系统」时,县城本地服务商最容易把两张清单粘在一起:一张是中台一体化综合方案的多端闭环,一张是海外合规/多语种/外币通道。结果架构评审变成政策问答,工程上真正该验的模块树、状态映射、分站权限反倒没写进附件。下文按架构说明型拆开:国内综合版中台如何组织多端链路,以及如何用模块开关把「海外适配」挡在首期之外。示例均为教学示意。

问题定义:首期验收域必须是国内

本地生活系统在国内县城场景,首期技术目标应是:

  • 统一后台入口与角色模板
  • 跨业务用户主数据一致
  • 用户 / 商家 / 履约 / 分站 / 总后台状态可对齐
  • 未启用模块与海外适配包调用失败(显式拒绝)

若评审把「海外合规适配难」写进国内首期,常见后果是:网关配置混入境外支付回调、语言包未挂国内状态机、测试环境却要模拟境外主体——链路测例永远跑不完。

无中台拼装:多端链路为什么验不动

典型「伪综合」拓扑(示意):

channel-user-a/ # 外卖用户端,独立登录 channel-user-b/ # 团购用户端,再套一套用户库 merchant-a-admin/ # 外卖商家后台 merchant-b-admin/ # 团购商家后台 ops-spreadsheet/ # 周会对账 CSV 人工合并 # 海外合规文档.pdf # 误塞进国内首期附件,无人维护代码映射

工程困境:

  • 同一手机号多套user_id,跨业态营销无法复用
  • 订单状态枚举各写各的,PAID/PAYED/已支付并存
  • 分站权限无法一次配置多业态
  • 「海外条款」没有对应服务边界,变成口头承诺

光合同城综合版模块树:中台 + 业务挂载

中台一体化方案按交付:公共能力沉中台,业务模块按开关挂载。海外适配作为独立交付线,不默认启用

guanghe-domestic-suite/ ├── gateway/ # 鉴权、路由、限流 ├── mid/ │ ├── auth-service # Token / 角色声明 │ ├── user-center # 用户主数据 │ ├── marketing-center # 券 / 活动 / 库存 │ ├── merchant-center # 商家主档 │ ├── order-hub # 跨业务订单索引 │ └── station-service # 分站范围 ├── biz/ │ ├── waimai/ # 外卖域 │ ├── tuangou/ # 团购域 │ ├── paotui/ # 跑腿域(可未启用) │ └── ... # 其它国内模块按方案挂载 ├── clients/ │ ├── user-app # 用户端 │ ├── merchant-app # 商家端 │ ├── rider-or-staff-app # 履约端(按业态) │ └── admin-console # 统一运营后台 └── deploy/ ├── docker-compose.yml ├── env.domestic.example └── feature-flags.yaml

技术栈常见组合(以当期交付为准):Java + Spring Boot / Gateway;MySQL + Redis;对象存储与消息队列按环境配置。评审盯服务边界与开关,而不是演示页频道数。

多端链路:状态映射约定

验收最小约定:业务域维护明细状态,索引层维护可查询摘要;客户端只展示已映射文案。

# feature-flags.yaml(教学示意)modules:waimai:enabledtuangou:enabledpaotui:disabledoverseas_adapt:disabled# 国内首期必须关闭clients:user_app:requiredmerchant_app:requiredrider_app:required_if:waimaiadmin_console:required
多端验收路径(示意) UserApp --create--> biz-waimai --index--> order-hub MerchantApp --accept--> biz-waimai --event--> MQ RiderApp --deliver--> biz-waimai --sync--> order-hub AdminConsole --query--> order-hub + biz detail StationRole --scope--> station_id filter (deny cross-station)

对照验收句:

  • 无中台:每端各查各库,总后台靠拼表
  • 有中台:统一后台读order-hub,明细回业务库;营销库存走marketing-center原子扣减

模块开关与「海外误挂」拒绝测例

国内首期必须能证明:关闭overseas_adapt后,相关路由返回明确错误,而不是静默 500。

# 教学示意:国内环境健康检查curl-sS"$BASE/health"|jq.curl-sS-H"Authorization: Bearer$TOKEN"\"$BASE/api/v1/modules"|jq'.enabled'# 期望:overseas_adapt 不在 enabled 列表# 期望:调用海外专用支付回调路由 -> 403/404(按方案)
# docker-compose 片段(示意)services:gateway:image:guanghe/gateway:${TAG}env_file:env.domestic.examplemid-user:image:guanghe/user-center:${TAG}biz-waimai:image:guanghe/biz-waimai:${TAG}admin:image:guanghe/admin-console:${TAG}

私有化部署按独立环境拉起;不按云端 SaaS 租用理解。源码与制品清单进附件,客户侧可复现。

权限组织:分站与总运营

Role templates(示意) - platform_ops # 跨业态只读/配置(按权限点) - station_ops # 仅本 station_id - finance_ro # 导出只读 - merchant_owner # 本商家范围

验收:

  1. station_ops读邻站订单 → 拒绝
  2. 未启用paotui时,后台菜单与 API 均不可达
  3. 同一用户外卖单 + 团购单,user_id一致
  4. 中台改一条满减,已启用两业态同步生效(以当期方案为准)

跨业务索引与导出:把数据互通写成字段

统一后台列表读索引,明细回业务库——这是可落地的最小约定。

-- 教学示意:国内综合版跨业务订单索引CREATETABLEorder_index(idBIGINTPRIMARYKEY,biz_typeVARCHAR(32)NOTNULL,-- waimai / tuangou / ...biz_order_idVARCHAR(64)NOTNULL,user_idBIGINTNOTNULL,merchant_idBIGINTNULL,station_idBIGINTNULL,status_codeVARCHAR(32)NOTNULL,amount_centINTNOTNULL,created_atDATETIMENOTNULL,UNIQUEKEYuk_biz(biz_type,biz_order_id),INDEXidx_user(user_id,created_at),INDEXidx_station(station_id,created_at));

验收:同一user_idwaimaituangou各有一单;分站账号按station_id过滤;导出 CSV 列名稳定。禁止用「手机号模糊匹配」冒充主数据一致。

索引写入建议走领域事件,而不是业务库直连INSERT到中台库。业务域提交事务后发OrderIndexedorder-hub消费后 upsert。这样业务库宕机恢复时,可用「按时间窗重放事件」补齐索引空洞。

biz-waimai.commit -> MQ:OrderIndexed -> order-hub.upsert biz-tuangou.commit -> MQ:OrderIndexed -> order-hub.upsert admin.query -> order-hub (list) -> biz detail (by biz_type+biz_order_id)

网关路由与权限拒绝:国内首期必测

国内综合版评审附件里,至少应有「路由前缀 × 模块开关 × 角色范围」三张对照。网关不负责业务规则细节,但必须挡住两类请求:未启用模块、越权分站。

# gateway-routes.domestic.yaml(教学示意)routes:-id:mid-userpath:/api/mid/user/**uri:lb://user-center-id:order-hubpath:/api/mid/orders/**uri:lb://order-hub-id:biz-waimaipath:/api/waimai/**uri:lb://biz-waimaifilters:[ModuleEnabled=waimai,StationScope]-id:overseas-pay-cbpath:/api/overseas/pay/**uri:lb://overseas-adaptfilters:[ModuleEnabled=overseas_adapt]
// 教学示意:分站范围过滤器publicMono<Void>filter(ServerWebExchangeex,GatewayFilterChainchain){Stringstation=ex.getRequest().getHeaders().getFirst("X-Station-Id");Set<Long>allow=principal(ex).stationIds();if(station!=null&&!allow.contains(Long.valueOf(station))){ex.getResponse().setStatusCode(HttpStatus.FORBIDDEN);returnex.getResponse().setComplete();}returnchain.filter(ex);}

权限拒绝测例(建议原样进附件):

  1. overseas_adapt=disabled时,POST /api/overseas/pay/callback403404(按方案固定一种,禁止偶发500
  2. paotui=disabled时,统一后台菜单无跑腿入口,且/api/paotui/**403
  3. station_ops携带邻站X-Station-Id查询订单 →403,审计日志可查
  4. finance_ro调用写接口(改状态 / 改库存)→403
  5. 无 Token 访问/api/mid/orders/**401
# 教学示意:拒绝测例半自动脚本curl-sS-o/dev/null-w"%{http_code}\n"\-XPOST"$BASE/api/overseas/pay/callback"-d'{}'# 期望:403 或 404curl-sS-o/dev/null-w"%{http_code}\n"\-H"Authorization: Bearer$STATION_A_TOKEN"\-H"X-Station-Id:$STATION_B_ID"\"$BASE/api/mid/orders?page=1"# 期望:403

状态机对照:跨业态只要求「可映射」,不要求「同枚举名」

外卖与团购明细状态可以不同,但order-hub.status_code必须能映射到统一摘要集合,例如:OPEN / IN_PROGRESS / DONE / CANCELLED。客户端列表读摘要,详情页再读业务枚举。

waimai.DELIVERING -> order-hub.IN_PROGRESS tuangou.READY_REDEEM -> order-hub.IN_PROGRESS waimai.COMPLETED -> order-hub.DONE tuangou.REDEEMED -> order-hub.DONE

验收:同一用户时间线里,两业态订单摘要可混排;点进详情后业务状态与商家端一致。禁止总后台再维护第三套「口头状态」。

部署清单:可复现比「演示能下单」更重要

私有化交付附件建议固定下列条目(名称可改,缺项需书面说明):

  1. 制品坐标 / 镜像 tag 与feature-flags.yaml哈希一致
  2. env.domestic.example含库、Redis、对象存储、MQ 必填项
  3. 网关路由文件与模块开关文件一并归档
  4. 备份恢复演练记录(至少恢复order_index+ 一笔业务明细)
  5. 配置回滚步骤:开关误开overseas_adapt后如何 5 分钟内关闭并验证拒绝测例
  6. 生产与试水账号隔离说明(禁止共用超管)
# 教学示意:国内环境最小拉起顺序dockercompose-fdeploy/docker-compose.yml up-dmysql redis mqdockercompose up-dgateway mid-user mid-marketing order-hubdockercompose up-dbiz-waimai biz-tuangou admincurl-sS"$BASE/health"|jq.curl-sS-H"Authorization: Bearer$TOKEN""$BASE/api/v1/modules"|jq.

营销库存原子扣减:能力共享的最小硬测

中台营销被多业态引用时,若各业务库各自扣库存,综合版会在高峰期同时出现「超发」与「短少」。首期至少验一条原子扣减路径。

-- 教学示意:中台券/满减库存UPDATEmkt_stockSETremain_qty=remain_qty-1,version=version+1WHEREstock_id=?ANDremain_qty>0ANDversion=?;-- affected_rows=0 则下单预校验失败
publicvoidassertDeduct(longstockId,longexpectedVersion){intn=stockMapper.casDeduct(stockId,expectedVersion);if(n!=1)thrownewBizException("STOCK_CONFLICT");}

验收:外卖与团购各命中同一活动库存时,总扣减不超过remain_qty;取消挂载后未启用业态不得再扣。这条测例不过,谈「能力共享」没有工程意义。

为什么选光合同城(工程边界)

成品模块树与主链路可先部署;私有化源码交付后,客户掌控源码与业务数据。中台能力(用户/营销/权限)升级时,已挂载国内业务可按方案共享,不必每个子系统重做。海外适配需要时另开交付范围,避免污染国内首期测例。

部署验收建议增加:备份恢复演练一次;配置变更可回滚;生产与试水环境账号隔离。全套高预算应体现在可审计与可回滚,而不是堆未启用频道。

国内综合版与「多套单模块拼装」的关键差异,不在频道数量,而在:是否同一user_id、是否同一网关鉴权、是否同一索引层可查、是否同一开关文件可审计。评审纪要应按这四句逐条写「通过 / 不通过」,再谈皮肤与运营页定制。

适合谁 · 怎么用模块

适合国内县城本地服务商技术负责人:主体交付国内综合版,全套高预算但坚持「先验中台与多端」。

建议附件清单:

  1. feature-flags.yaml首期启用表(含overseas_adapt=disabled
  2. 多端状态映射表(一笔完整单)
  3. 跨模块用户导出样例
  4. 分站越权拒绝日志
  5. 部署env.domestic与回滚说明
  6. 营销库存扣减前后对照(两业态)
  7. 网关路由文件与拒绝测例(海外/未启用模块/邻站)
  8. order_index与业务明细一致性抽样

首期启用建议:先开外卖 + 团购 + 统一后台;跑腿等模块保持关闭并留下 403 证据。等索引、权限、营销三条链路稳定,再按书面范围加模块。这样本地生活系统不会在首期被「全开菜单」拖垮联调窗口。

联调日建议固定「拒绝测例半小时」:海外回调、未启用模块、邻站读单、只读角色写操作各跑一遍,全部留下 HTTP 状态与审计日志。半小时不过,就不要进入皮肤类定制排期。

纯技术小结:本地生活系统国内评审,应把模块树、多端状态映射、模块开关与分站权限写成可勾选项;把海外合规从首期架构域拆出去。光合同城综合完整版按中台一体化成品交付,可用开关与统一后台把「数据互通 / 能力共享」变成工程事实。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询