日韩低成本试水时国际版外卖系统真正烧钱的往往不是「再写一个下单页」。贵的是支付通道接入、语言包维护、本地规则包税号、地址、营业时段。若按国家 fork 整套外卖仓库人天会在第二座城市翻倍。下文把成本写成模块边界和可关停包而不是交付口号。示意为教学用途。成本落在哪几个可替换包海外华人创业者常把报价理解成「开发那一笔」。上线后账单却来自PSP 联调、文案键补齐、地址校验、小票税项。这些不该长在 takeout-core 里。core 只保留下单、履约、退款状态。每个国家应是可装卸的 adapter / pack试水失败时能整包停用。模块目录树国家包与核心拆开intl-wm-jp-kr/ ├── takeout-core/ # 订单、履约无国家 if ├── pack-locale/ │ ├── ja-JP/ │ └── ko-KR/ ├── pack-psp/ │ ├── adapter-jcb/ │ └── adapter-kakaopay/ ├── pack-local-rule/ │ ├── tax-jp-invoice/ │ ├── address-kr-jibun/ │ └── hours-timezone/ ├── cost-meter/ # 记哪些包在跑 ├── mid-shared/ │ ├── user-master/ │ └── admin-console/ └── deploy-trial/ ├── jp-osaka.yaml └── kr-busan.yaml这棵树要回答的问题大阪试点关掉adapter-kakaopay时不必重新编译 takeout-core。cost-meter不是财务系统只记录「启用了哪些计费相关包」方便对照通道账单。技术栈列表示意核心Kotlin / Spring Boot插件用 SPI 加载 pack规则包JSON Schema 校验后的 YAML禁止在 Java 里写死邮编正则语言包独立 Git 子树翻译提交不触发 core 发版PSP每通道一个 adapter jar签名证书外置计量Prometheus counter按pack_id打点存储MySQL 8规则快照写入rule_pack_rev试水配置只打开一座城需要的包# deploy-trial/jp-osaka.yaml示意trial:city:osakacurrency:JPYpacks:locale:ja-JPpsp:[adapter-jcb]local_rule:[tax-jp-invoice,hours-timezone]disabled_packs:-adapter-kakaopay-address-kr-jibun-ko-KR低成本试水的关键是disabled_packs必须真正卸载 classpath 或网关路由。只在菜单里隐藏韩文但adapter-kakaopay仍健康检查对外证书年费照样发生。大阪文件里不应出现韩国地址规则混装会让测试矩阵按笛卡尔积爆炸。规则包热加载与版本钉扎# pack-local-rule/tax-jp-invoice/manifest.yaml示意pack_id:tax-jp-invoicerevision:2026.08.24applies_to:[TAKEOUT]hooks:-on:ORDER_PRICEDcalc:invoice_ex_tax-on:RECEIPT_PRINTfields:[tax_reg_no,qualified_invoice]下单算价读的是钉扎的revision不是运营后台「最新草稿」。否则财务对账时同一笔单会因为中午改了税项规则而无法复现。这正是成本规则包要可回滚而不是每次改税都改 core。部署片段按包启停# 示意釜山试水只拉韩文 对应钱包exportTRIALkr-busandockercompose--profilecore up-ddockercompose--profilepack-ko--profilepsp-kakaopay up-dtest!$(dockerps-q--filternameadapter-jcb)curl-fsSlocalhost:8090/meter/packs|grepkakaopaytest !这一行是成本验收不该存在的 adapter 容器必须为零。meter 接口列出正在跑的 pack用来对照通道合同而不是对照产品手册页数。core profile 先起pack 后挂反向启动会出现空 hook算价静默跳过税项。测试矩阵必须按包裁剪同时打开日韩全部 adapter测例数按通道、语言、地址规则做笛卡尔积。试点只有大阪却要跑釜山钱包用例人天会假性膨胀看起来像「系统太贵」。正确裁剪yaml 里 disabled 的 pack对应测试套件直接 skip而不是失败重试。地址规则用 JSON Schema 校验样例地址不要在 core 里写死正则。证书年费、钱包进件周期应记在cost-meter的标签上方便对照合同而不是写进订单表。第二座城开张时只加新 pack 的测例不回归已经裁掉的组合。SPIcore 不认识国家类名takeout-core 只声明 hook 名例如ORDER_PRICED、RECEIPT_PRINT。tax-jp-invoice以独立 jar 实现该 hookcore 的 import 列表里不应出现JpInvoice。这才能在关掉日本税包后仍编译通过。若 core 直接new KakaoClient()所谓模块边界只是目录好看。SPI 加载失败要在启动期报错避免午高峰才发现 hook 为空、税被跳过。规则 revision 钉扎后hook 入参带上 pack 版本小票才能回放。中台解耦写成边界而不是形容词「中台解耦」在这里指三道硬边界takeout-core 不 import 任何pack-*的具体类只调 SPI用户主数据在 mid-shared日韩两城登录同一套user_id策略admin-console 按 pack 授权大阪运营改不了釜山钱包密钥没有这三道所谓降低成本只是把外包工时改个名字。共享底座让权限、登录在 pack 增减时不必重做。这与「一次买断所有国家通道」不是一回事也不是把交付边界写成选型口号。大阪运营角色看不到釜山密钥才叫权限跟 pack 走全员超管会把成本重新混在一起。验收清单jp-osaka.yaml生效时调用韩文 bundle 返回PACK_DISABLED同一user_id在大阪订单与若以后开釜山订单可关联不新建登录体系改tax-jp-invoice的 revision 后旧订单小票字段仍按下单时快照cost-meter的 pack 列表与docker ps一致关闭某 PSP adapter 后证书目录可整夹归档core 进程无需重启编译翻译制品失败时 core 镜像仍可发布meter 失败计数能区分进件拒绝与下单缺陷时区包变更不要求重编 takeout-core人天怎样映射到 pack而不是映射到「再开发」报价若按「日本一版、韩国一版」出人天仓库必然被 fork。改成按 pack 报价locale 一套、PSP 一套、规则一套core 的缺陷修复摊到所有试点城。低成本试水应先买最少 pack一座城、一种支付、一套税票规则。通道进件被拒属于 pack 侧成本不应回冲 core 的工期。翻译返工属于 locale pack 的 CI 失败也不应阻止履约缺陷修复上线。这样国际版外卖系统的账单才能对上模块边界而不是对上模糊的「海外很难」。pack 的发布号与 core 的发布号分开记便于回答「这次贵在通道还是贵在履约缺陷」。混用一个版本号财务只能看到「又发版了」成本仍算不清楚。大阪 yaml 与釜山 yaml 应能 diff差异只出现在 packs 列表与货币字段。若 diff 里出现 takeout-core 的类名修改说明边界已经破了成本会回到 fork 仓库。华人创业者低成本试水时把这一份 diff 当作是否值得开第二城的技术门禁即可。不要把中台共享理解成「所有国家通道默认全开」共享的是登录与权限不是账单。货币只写在试水 yaml不写进 core 常量。换城换币种应只改文件不改 Java。若 core 出现if (cityosaka) currencyJPY模块边界已经失败人天会回到 fork。规则包 revision 回滚应在小时级完成这比重新招标开发团队更能控制试水成本。hook 失败必须在启动或首次下单时可见禁止吞掉异常后按零税额出票。manifest 里声明的 hook 若在 classpath 找不到实现进程应退出而非降级为空操作。空操作看起来「系统很稳」账单上的税差会在月末才爆。日韩试水把「启动失败」当成便宜的成本信号好过上线后再请财务对账。技术小结国际版外卖系统的成本高点在可替换的 locale / PSP / local-rule 包而不在再写一条下单 SQL。模块边界的验收是试水城市的 disabled_packs 从进程级消失规则 revision 可回放core 不因国家 if 膨胀。日韩低成本试点先钉一座城的 yaml比同时铺两条通道更接近可控账单。时区包决定营业时段与截单不要把Asia/Tokyo写死在 core 配置。翻译 CI 应只构建 locale pack 的制品失败不阻塞 takeout-core 的缺陷修复发版。feature flag 与 pack 卸载不是一回事flag 只藏菜单进程里 adapter 仍可能在做健康检查并产生费用。真正停成本要让容器与证书目录一起归档。进件被拒、通道沙箱额度用尽应记在 meter 的失败计数避免被理解成「核心下单写得差」。大阪试水通过后再复制 yaml 骨架去釜山只替换 pack 列表禁止复制整仓再改类名。