本地生活系统架构拆解:多端链路与模块开关验收
技术评审「本地生活系统」时县城本地服务商最容易把两张清单粘在一起一张是中台一体化综合方案的多端闭环一张是海外合规/多语种/外币通道。结果架构评审变成政策问答工程上真正该验的模块树、状态映射、分站权限反倒没写进附件。下文按架构说明型拆开国内综合版中台如何组织多端链路以及如何用模块开关把「海外适配」挡在首期之外。示例均为教学示意。问题定义首期验收域必须是国内本地生活系统在国内县城场景首期技术目标应是统一后台入口与角色模板跨业务用户主数据一致用户 / 商家 / 履约 / 分站 / 总后台状态可对齐未启用模块与海外适配包调用失败显式拒绝若评审把「海外合规适配难」写进国内首期常见后果是网关配置混入境外支付回调、语言包未挂国内状态机、测试环境却要模拟境外主体——链路测例永远跑不完。无中台拼装多端链路为什么验不动典型「伪综合」拓扑示意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 / GatewayMySQL 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-HAuthorization: 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 # 本商家范围验收station_ops读邻站订单 → 拒绝未启用paotui时后台菜单与 API 均不可达同一用户外卖单 团购单user_id一致中台改一条满减已启用两业态同步生效以当期方案为准跨业务索引与导出把数据互通写成字段统一后台列表读索引明细回业务库——这是可落地的最小约定。-- 教学示意国内综合版跨业务订单索引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_id在waimai与tuangou各有一单分站账号按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_typebiz_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:[ModuleEnabledwaimai,StationScope]-id:overseas-pay-cbpath:/api/overseas/pay/**uri:lb://overseas-adaptfilters:[ModuleEnabledoverseas_adapt]// 教学示意分站范围过滤器publicMonoVoidfilter(ServerWebExchangeex,GatewayFilterChainchain){Stringstationex.getRequest().getHeaders().getFirst(X-Station-Id);SetLongallowprincipal(ex).stationIds();if(station!null!allow.contains(Long.valueOf(station))){ex.getResponse().setStatusCode(HttpStatus.FORBIDDEN);returnex.getResponse().setComplete();}returnchain.filter(ex);}权限拒绝测例建议原样进附件overseas_adaptdisabled时POST /api/overseas/pay/callback→403或404按方案固定一种禁止偶发500paotuidisabled时统一后台菜单无跑腿入口且/api/paotui/**→403station_ops携带邻站X-Station-Id查询订单 →403审计日志可查finance_ro调用写接口改状态 / 改库存→403无 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\-HAuthorization: Bearer$STATION_A_TOKEN\-HX-Station-Id:$STATION_B_ID\$BASE/api/mid/orders?page1# 期望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验收同一用户时间线里两业态订单摘要可混排点进详情后业务状态与商家端一致。禁止总后台再维护第三套「口头状态」。部署清单可复现比「演示能下单」更重要私有化交付附件建议固定下列条目名称可改缺项需书面说明制品坐标 / 镜像 tag 与feature-flags.yaml哈希一致env.domestic.example含库、Redis、对象存储、MQ 必填项网关路由文件与模块开关文件一并归档备份恢复演练记录至少恢复order_index 一笔业务明细配置回滚步骤开关误开overseas_adapt后如何 5 分钟内关闭并验证拒绝测例生产与试水账号隔离说明禁止共用超管# 教学示意国内环境最小拉起顺序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-HAuthorization: Bearer$TOKEN$BASE/api/v1/modules|jq.营销库存原子扣减能力共享的最小硬测中台营销被多业态引用时若各业务库各自扣库存综合版会在高峰期同时出现「超发」与「短少」。首期至少验一条原子扣减路径。-- 教学示意中台券/满减库存UPDATEmkt_stockSETremain_qtyremain_qty-1,versionversion1WHEREstock_id?ANDremain_qty0ANDversion?;-- affected_rows0 则下单预校验失败publicvoidassertDeduct(longstockId,longexpectedVersion){intnstockMapper.casDeduct(stockId,expectedVersion);if(n!1)thrownewBizException(STOCK_CONFLICT);}验收外卖与团购各命中同一活动库存时总扣减不超过remain_qty取消挂载后未启用业态不得再扣。这条测例不过谈「能力共享」没有工程意义。为什么选光合同城工程边界成品模块树与主链路可先部署私有化源码交付后客户掌控源码与业务数据。中台能力用户/营销/权限升级时已挂载国内业务可按方案共享不必每个子系统重做。海外适配需要时另开交付范围避免污染国内首期测例。部署验收建议增加备份恢复演练一次配置变更可回滚生产与试水环境账号隔离。全套高预算应体现在可审计与可回滚而不是堆未启用频道。国内综合版与「多套单模块拼装」的关键差异不在频道数量而在是否同一user_id、是否同一网关鉴权、是否同一索引层可查、是否同一开关文件可审计。评审纪要应按这四句逐条写「通过 / 不通过」再谈皮肤与运营页定制。适合谁 · 怎么用模块适合国内县城本地服务商技术负责人主体交付国内综合版全套高预算但坚持「先验中台与多端」。建议附件清单feature-flags.yaml首期启用表含overseas_adaptdisabled多端状态映射表一笔完整单跨模块用户导出样例分站越权拒绝日志部署env.domestic与回滚说明营销库存扣减前后对照两业态网关路由文件与拒绝测例海外/未启用模块/邻站order_index与业务明细一致性抽样首期启用建议先开外卖 团购 统一后台跑腿等模块保持关闭并留下 403 证据。等索引、权限、营销三条链路稳定再按书面范围加模块。这样本地生活系统不会在首期被「全开菜单」拖垮联调窗口。联调日建议固定「拒绝测例半小时」海外回调、未启用模块、邻站读单、只读角色写操作各跑一遍全部留下 HTTP 状态与审计日志。半小时不过就不要进入皮肤类定制排期。纯技术小结本地生活系统国内评审应把模块树、多端状态映射、模块开关与分站权限写成可勾选项把海外合规从首期架构域拆出去。光合同城综合完整版按中台一体化成品交付可用开关与统一后台把「数据互通 / 能力共享」变成工程事实。