单体项目如何"无感"演进微服务?GoWind的Core+BFF分层实践
很多技术团队的微服务改造都陷入两难:单体架构臃肿难维护,但全量拆微服务风险高、工期长、上线易崩。绝大多数从单体转型的开发者,都害怕"为了架构升级而重构",导致业务停摆、Bug激增、迭代停滞。
行业内普遍存在一个误区:微服务 = 彻底拆分、全量重构、多服务乱堆砌。而 GoWind 风行 CMS 给出了一套低风险、无感演进 的落地答案:不推翻单体、不一次性大重构,通过 Core 核心下沉 + 双 BFF 分层剥离,实现单体架构平滑、无感升级为企业级微服务内容中台。
本文结合 GoWind 真实架构实践,讲透单体项目如何零感知、低风险演进微服务,拆解 Core + Admin BFF + App BFF 分层架构的核心价值、底层通信原理、代码规范与落地优势,彻底解决单体转微服务的转型焦虑。
一、为什么绝大多数单体转微服务都失败了?
传统单体 CMS、后台管理系统的微服务改造,大多采用"暴力拆分"模式:把用户、内容、文件、权限逐个拆成独立服务,强行落地微服务。这种方式看似规范,实则问题重重,也是很多团队宁愿死守单体的核心原因。
传统暴力拆分的三大痛点:
1. 改造侵入性极强,无法无感过渡
全量拆解业务逻辑、重构接口、拆分数据库,代码改动量大,业务必须暂停迭代,测试回归成本极高,稍有不慎就会引发线上故障,完全达不到"无感演进"的目的。
2. 服务粒度碎片化,治理成本剧增
过度拆分导致服务数量爆炸,出现大量细粒度小服务,带来注册发现、链路追踪、事务一致性、运维部署等海量问题,小团队完全无法承接。
3. 前后端耦合问题没有根治
即便拆分了后端服务,依旧让前端直接对接底层业务服务,不同端(管理端、Web、移动端、小程序)的差异化需求,继续污染底层接口,最终变成"微服务架构、单体式代码"。
真正理想的演进,应该是:业务无感知、代码低侵入、架构可迭代、性能可提升。
而 GoWind Core+BFF 分层架构,正是为解决"单体平滑升级"而生的渐进式微服务方案。
二、什么是「无感演进」?GoWind 的核心改造思想
所谓单体无感演进微服务 ,核心不是"拆服务",而是拆职责、分层解耦。在不颠覆原有业务逻辑、不影响线上功能的前提下,通过分层架构,逐步剥离流量适配、前端定制、多端兼容逻辑,让底层专注核心业务,上层专注场景适配。
GoWind 放弃了传统的多业务微服务拆分模式,采用三层极简分层模型,完美适配单体项目平滑升级:
1. Core 核心层:原单体的"纯净内核"
沉淀所有通用、稳定、无场景偏向的核心能力,包括数据持久化、核心业务规则、多租户底层、权限模型、内容建模、文件存储、定时任务等。Core 只对内提供能力,不直接对外暴露接口、不对接任何前端。
2. Admin BFF 层:管理后台专属场景层
承接所有管理员后台的定制化需求,负责接口聚合、数据全量返回、权限校验、批量操作、日志导出、后台专属交互逻辑,专门适配 PC 管理端复杂、严谨的业务场景。
3. App BFF 层:用户前台多端场景层
承接所有用户端场景,适配 Vue、React、Taro 小程序等多端,负责数据裁剪、接口缓存、弱网优化、多端差异化适配、前台用户交互逻辑,屏蔽底层复杂度。
架构流向(清晰极简):
管理前端 → Admin BFF → Core 核心
多端用户前台 → App BFF → Core 核心
核心演进逻辑:底层不动、上层剥离、场景分层、渐进升级。全程业务功能无感知,无需重构核心业务,真正实现无感迁移。
三、分步拆解:单体项目如何无感升级为 Core+BFF 架构?
GoWind 的演进路径,完全适配所有单体 CMS、单体后台系统,分为三个阶段,稳步落地、零风险过渡。
阶段一:内核提纯,把单体"稳定能力"下沉到 Core
单体项目最大的问题是:核心业务逻辑、前端适配逻辑、场景定制逻辑全部混在一起。
第一步不删代码、不改业务,只做能力沉淀与剥离:
-
将数据 CURD、业务规则校验、租户逻辑、权限内核、内容模型、资源存储等通用稳定能力统一抽离至 Core 服务;
-
Core 统一对接数据库、缓存、OSS,成为唯一的数据出入口,保证数据一致性;
-
废弃原有单体中杂乱的对外接口,Core 只提供标准化、通用化的底层能力接口。
此阶段业务完全无感,仅完成代码分层与能力归集,没有任何功能变更,无线上风险。
阶段二:场景剥离,搭建双 BFF 层承接前后端流量
内核稳定后,新建两个轻量 BFF 服务,接管所有前端流量,彻底解耦前后端:
1. Admin BFF 接管管理端流量
原有单体中所有后台管理的定制逻辑,全部迁移至 Admin BFF:接口聚合、全量字段返回、批量操作、数据导出、操作日志、租户管理、精细化权限控制。Core 不再处理任何前台场景逻辑,只专注底层能力支撑。
2. App BFF 接管多端前台流量
针对用户端多端差异,在 App BFF 统一做适配:按需裁剪返回字段、接口合并、缓存优化、多端路由适配、用户登录注册、评论互动等前台专属逻辑。
至此,系统完成关键转型:Core 管能力,BFF 管场景,彻底根治单体代码臃肿问题。
阶段三:彻底去单体,实现微服务独立迭代与扩缩容
分层稳定后,逐步下线老旧单体混杂代码,实现三服务独立部署、独立迭代、独立扩容:
-
前台高并发时,仅扩容 App BFF,不影响后台与核心服务;
-
后台管理迭代更新时,仅升级 Admin BFF,不影响用户前台访问;
-
Core 长期稳定少变更,保障全系统数据与能力底座可靠。
整个过程渐进式、无中断、可回滚,完全区别于暴力重构,是中小团队最友好的微服务演进方案。
四、深度答疑:为什么一定要双 BFF?不能直接连 Core?
很多转型开发者都会疑惑:Core 已经提供了底层接口,为什么还要多一层 BFF,是不是多此一举?
实际上,BFF 是单体无感演进微服务的核心关键,没有 BFF 就无法实现平滑升级。
1. 解决「接口臃肿、两端冲突」的单体顽疾
如果前端直接对接 Core,底层接口必须同时适配:后台全字段管理、Web 端展示、移动端精简数据、小程序弱网场景。最终 Core 接口会被迫兼容所有场景,变回单体时代的"万能接口",架构改造完全失效。
双 BFF 分层后:Core 只做标准,BFF 只做适配,两端场景冲突彻底隔离。
2. 实现「业务无感、分层迭代」
前端需求变更、多端样式调整、交互优化,全部在 BFF 层完成,无需改动 Core 核心代码。底层核心极度稳定,上层场景灵活迭代,完美解决单体"改一处动全身"的问题。
3. 精准资源隔离,杜绝资源浪费
单体架构与传统微服务,都无法隔离前后端流量:前台高并发挤占后台资源,后台运维影响前台用户体验。
GoWind 三层架构实现流量、资源、故障三重隔离:
-
App BFF 故障,仅影响前台用户访问,后台管理完全正常;
-
Admin BFF 升级,不干扰前台用户浏览、交互;
-
Core 统一兜底,保障数据绝对一致。
五、通俗吃透注册中心:单体开发者视角,Etcd 服务注册发现与 Core/BFF 交互全流程
从单体架构转型的开发者,最大的认知盲区除了分层架构,就是微服务如何互相找到对方。
单体项目中,所有代码都在一个进程里,模块调用直接 new 类、调用方法 即可,不需要"找服务"、不需要"远程调用"。但拆分为 Core + App BFF + Admin BFF 三服务后,三个服务是独立进程、独立部署、独立IP端口,彼此完全隔离。
由此诞生两个核心疑问:
-
Core、BFF 服务如何互相发现、自动连上?
-
BFF 调用 Core 的 gRPC 接口,完整链路是怎样的?Etcd 在这里扮演什么角色?
本节面向纯单体思维开发者,零晦涩公式、通俗讲透 GoWind 基于 Etcd 的服务注册发现机制与跨服务交互逻辑。
1、先搞懂:单体 vs 微服务,服务调用的本质区别
单体架构 :所有能力在同一个进程,属于本地调用,直接内存跳转,无需网络、无需寻址、无需注册中心。
GoWind 微服务架构 :Core、App、Admin 是三个独立服务,属于跨进程远程调用。BFF 想要调用 Core 的用户、内容、权限能力,必须通过网络访问 Core 的服务地址。
随之而来的问题:Core 可能多实例部署、IP 不固定、端口动态、随时扩容缩容,BFF 不能写死地址调用。
Etcd 注册中心的唯一核心作用:统一托管所有服务地址,让服务之间自动感知、自动寻址、无感切换。
2、Etcd 核心角色:微服务的"中央通讯录"
把 Etcd 理解为一个全局统一的服务通讯录:
-
所有服务都是"员工":Core 服务、Admin BFF、App BFF
-
Etcd 是"公司前台通讯录"
-
注册:员工上岗,主动登记自己的姓名、工位(服务名、IP、端口)
-
发现:员工需要协作时,去前台查询对方工位,直接对接
-
健康检测:员工离岗/宕机,前台自动删除工位信息,避免别人找空位置
这就是微服务注册发现的全部本质,没有任何额外复杂度。
3、完整流程拆解:服务启动「注册流程」
GoWind 所有服务(Core / Admin BFF / App BFF)启动时,都会自动执行 服务注册,流程统一、全自动无人工干预:
步骤1:服务启动初始化
Core、BFF 服务启动,读取自身配置(服务名称、监听IP、端口、版本)。
步骤2:主动连接 Etcd
服务内置 kratos 微服务组件,自动连接配置的 Etcd 集群地址。
步骤3:上报服务信息(注册)
将自身 服务名 + 真实IP + 端口 + 健康状态 以 Key-Value 形式写入 Etcd。
例如:
-/registry/gowind.core → 对应 Core 服务实例地址列表
-/registry/gowind.admin → 对应 Admin BFF 实例地址列表
/registry/gowind.app→ 对应 App BFF 实例地址列表
步骤4:开启心跳保活
服务持续向 Etcd 发送心跳,证明"服务在线、健康可用"。
如果服务宕机、进程退出、机器故障:心跳中断,Etcd 自动过期清理该服务节点,实现故障自动剔除。
4、完整流程拆解:BFF 调用 Core 的「服务发现 + 跨服务交互」
以最核心的BFF 请求 Core 场景为例,完整复现一次 gRPC 远程调用全过程,彻底解答"BFF 如何找到 Core、如何交互"。
场景:用户前台请求文章列表 → App BFF → Core 内核取数
步骤1:App BFF 接收前端 REST 请求
前端通过 HTTP 访问 App BFF 对外 REST 接口。
步骤2:BFF 触发服务发现(查询 Etcd)
App BFF 需要调用 Core 的 gRPC 能力,本地无硬编码地址,主动向 Etcd 查询:「当前所有在线的 gowind.core 服务实例地址列表」。
步骤3:本地缓存服务节点
BFF 获取 Core 节点列表后,本地缓存,同时监听 Etcd 节点变更。后续请求无需重复查询 Etcd,高性能直接调用。
步骤4:负载均衡选择节点
若 Core 多实例部署,BFF 内置负载均衡策略,自动挑选可用节点。
步骤5:BFF → Core 内网 gRPC 调用
BFF 通过内网 gRPC 协议,携带 Protobuf 结构化参数,请求 Core 内核服务。
步骤6:Core 执行业务逻辑并返回
Core 完成数据库查询、权限校验、数据组装,通过 gRPC 返回结构化数据。
步骤7:BFF 做场景适配,返回前端 REST JSON
BFF 按需裁剪字段、聚合数据、适配前端场景,转为 REST JSON 返回浏览器。
完整一句话链路:
前端 HTTP → BFF(发现Core) → 内网gRPC调用Core → Core执行业务 → BFF格式化返回前端
5、关键答疑:单体开发者最困惑的3个问题
Q1:为什么不直接写死 IP 端口调用,非要用注册中心?
单体思维最大误区:服务地址固定。微服务是弹性伸缩架构:支持多实例、动态扩缩容、容器化部署、动态IP。写死地址无法扩容、无法故障转移、无法集群高可用。Etcd 让服务彻底无状态、无固定地址,实现真正弹性高可用。
Q2:BFF 和 Core 是谁主动注册?谁主动发现?
-
Core、BFF 全部主动注册:所有服务启动均上报自身信息到 Etcd。
-
依赖方做发现:BFF 依赖 Core,所以 BFF 发现 Core;Core 不依赖任何上层服务,无需主动发现其他服务。
完美贴合 Core 下沉、BFF 上层适配的分层架构。
Q3:Etcd 挂了,服务会不会直接瘫痪?
不会。GoWind 服务启动后会本地缓存服务节点列表,Etcd 临时宕机不影响已建立的服务调用。Etcd 只负责「变更通知、注册注销」,不参与每一次业务调用,不存在单点瓶颈。
6、GoWind 架构下的注册发现核心优势(对比单体)
-
彻底消除硬编码:无需写死任何服务地址,全动态寻址。
-
故障自动自愈:节点宕机自动剔除,新增节点自动加入集群。
-
分层流量隔离:Admin、App、Core 服务注册相互独立,互不干扰。
-
无感扩容:前台流量大,新增一台 App BFF 节点,自动注册、自动承接流量,业务零感知。
-
适配渐进式演进:完全适配单体逐步拆微服务的模式,无需一次性重构。
7、极简可视化:完整服务注册 & 调用链路图
为方便直观记忆,整理整套架构注册发现+请求调用全链路极简流程图(无冗余信息):
plain
# 一、服务启动注册链路(全部服务自动执行)
Core服务 ──心跳注册──┐
Admin BFF ──心跳注册──┼──> Etcd注册中心(托管地址 + 健康检测)
App BFF ──心跳注册──┘
# 二、线上业务请求调用链路(核心交互全流程)
多端前端(Web/小程序/后台)
↓ HTTP/REST(公网、JSON、多端适配)
┌──────────────┐ ┌──────────────────────────────┐
│ Admin/App BFF │──>│ 1.拉取Etcd中Core节点并本地缓存 │
│ 场景适配层 │──>│ 2.负载均衡筛选可用Core实例 │
└──────────────┘ └──────────────────────────────┘
↓ gRPC(内网、二进制、高性能)
Core 内核服务(数据持久化/核心业务/权限模型)
↓ 返回结构化数据
BFF层二次适配:字段裁剪 / 接口聚合 / 场景格式化
↓ REST JSON
前端页面渲染展示
链路核心总结 :启动注册、运行发现、内网RPC、外网REST、分层各司其职,全程无硬编码地址、支持动态扩缩容、故障自动切换,完整支撑单体无感演进微服务。
六、架构通讯协议详解:为什么Core用gRPC、BFF对外用REST?
在 GoWind 三层架构中,协议分层极其清晰:Core 与双 BFF 服务(内网服务间通讯)统一使用 gRPC;BFF 与前端(公网用户端通讯)统一使用 RESTful HTTP。
很多架构转型者会疑惑:为什么要做两层协议割裂?BFF 对外能不能也用 gRPC?能不能用 GraphQL、trpc、Thrift?
本节彻底讲透这套内外分层协议设计的底层逻辑,同时解答 BFF 协议的可扩展性问题。
1、内网:Core ↔ BFF 强制 gRPC 的核心原因
Core 和 BFF 都属于后端服务,部署在内网环境,服务之间是可信、高频、对内调用场景,gRPC 是最优解,核心优势体现在三点:
① 极致性能,适配服务高频调用
gRPC 基于 HTTP/2 协议、采用 Protobuf 二进制序列化,相比 JSON 文本格式,体积更小、序列化速度更快、传输带宽更低。BFF 层需要频繁聚合 Core 的多接口数据,内网高频互通场景下,gRPC 能大幅降低通讯耗时,解决 REST 内网调用冗余、低效的问题。
② 强契约约束,杜绝参数错乱
Protobuf 自带完整的数据结构定义、字段校验、类型约束,Core 对外提供的所有能力都是强类型、标准化接口。从根源避免单体架构常见的"参数随意改、字段不统一、接口无文档"问题,适配微服务分层后的标准化协作,让 Core 真正成为稳定可靠的能力内核。
③ 原生微服务能力,开箱即用
gRPC 天然支持服务注册发现、超时控制、熔断降级、流式传输、双向通讯,完美适配 GoWind 基于 kratos 的微服务体系。无需额外封装,即可实现服务治理,大幅降低内网服务通讯的开发和运维成本。
2、外网:BFF ↔ 前端优先 REST 的核心原因
BFF 直面 Vue、React、Taro 等各类前端端,属于公网、多端、不可信、浏览器兼容场景,这也是不直接暴露 gRPC 给前端的核心原因:
① 全前端生态原生兼容 HTTP REST
浏览器、小程序、移动端、各类前端框架,原生支持 HTTP/HTTPS 请求,REST 接口接入零成本。而 gRPC-Web、GraphQL 等协议需要前端额外适配、特殊配置,对多端统一适配极不友好,违背 GoWind「开箱即用、多端兼容」的设计理念。
② 公网环境更适配、调试成本极低
REST 基于 JSON 文本,可读性强,支持浏览器直接访问、抓包调试、接口日志可视化,极大降低前后端联调成本。而二进制协议公网调试困难,问题排查效率极低,不适合面向用户端的开放接口。
③ 适配 CDN、缓存、跨域等公网能力
REST 接口天然适配浏览器缓存、CDN 静态加速、跨域配置、网关限流、SSL 加密等公网基础设施,能快速优化前台页面加载、静态资源访问性能,这是 gRPC、Thrift 等内网协议不具备的优势。
3、关键答疑:BFF 对外是否一定要用 REST?
结论:不是强制,REST 是默认最优解,BFF 层完全支持灵活替换协议。
BFF 的核心定位是场景适配层,本身不绑定任何通讯协议,可根据业务场景自由替换对外协议,适配各类主流技术方案:
① 可使用 GraphQL
适合复杂前端页面、按需取数场景。当前端需要灵活自定义返回字段、聚合多模块数据时,可在 BFF 层接入 GraphQL,让前端自主按需查询,彻底解决接口冗余问题,多用于中后台复杂表单、数据大盘页面。
② 可使用 gRPC-Web
适合高并发、低延迟的前台场景。通过 gRPC-Web 适配浏览器环境,保留 gRPC 高性能、强类型优势,适合实时列表、消息推送、动态数据刷新等场景。
③ 可使用 trpc / Thrift
适合团队技术栈统一场景。如果后端团队深度使用 trpc、Thrift 生态,可直接在 BFF 层对外暴露对应协议接口,实现全栈协议统一,降低团队学习和维护成本。
④ 可混合多协议共存
GoWind BFF 支持同一服务多协议并行:常规页面使用 REST、复杂数据查询用 GraphQL、高并发接口用 gRPC-Web,按需适配,灵活度极高。
4、内外协议分层的终极架构价值
这套「内网gRPC + 外网REST(可扩展)」的分层协议设计,是 GoWind 实现单体无感演进微服务的关键底层保障:
-
彻底隔离内外接口:Core 稳定的 gRPC 内核完全不暴露公网,杜绝外网请求攻击、参数污染、场景兼容问题,保障核心数据安全与架构稳定;
-
协议解耦,双向灵活迭代:内网 Core 可随时升级 gRPC 能力、调整数据结构,无需改动前端;外网可按需切换协议、适配多端,完全不影响底层核心业务;
-
兼顾性能与易用性:内网追求极致性能与规范,外网追求兼容、易用、可调试,各司其职,完美平衡微服务性能与前后端协作效率。
七、独家架构细节:BFF 层 Protobuf 差异化设计(解决新人认知困惑)
在 GoWind 整套 Core+BFF 架构中,有一处极易让新人困惑、但架构价值极高的细节设计:
Core 与 BFF 完全拆分 Protobuf 定义、BFF 独立维护路由协议、通过包名 + i_ 前缀彻底隔离冲突,且 BFF 层 Protobuf 只负责定义 REST 路由,不承载核心业务模型。
很多从单体、传统微服务转过来的开发者,会形成固有认知:Proto 应该统一、全局共用、一处定义处处引用。
因此看到 GoWind 如下设计时会产生困惑:
-
BFF 单独拥有 proto:
admin.service.v1、app.service.v1,不和 Core proto 混在一起; -
为规避全局文件名冲突,所有 BFF 侧 proto 文件统一加 i_ 前缀;
-
BFF 的 proto 只干一件事:定义 REST Service、定义路由 Path,不定义核心数据结构、不定义业务模型。
本节彻底讲透这套「看似冗余,实则极度科学」的私有架构规范,消除所有认知误区。
1、先纠正新人误区:为什么不能全局共用一套 Protobuf?
常规微服务做法是:Core 定义完整 Proto(结构体+服务+路由),网关/BFF 直接引用。看似复用,实则会带来架构退化,重新变回单体耦合问题:
① 内外协议耦合,无法分层演进
Core 的 Protobuf 是内网 RPC 契约 ,追求严谨、完整、强约束;前端需要的 REST 是公网场景契约,追求精简、适配、灵活。共用一套 Proto,会导致:Core 字段不敢删、不敢改,必须兼容前端所有场景,底层被上层绑架,架构分层彻底失效。
② 路由语义完全不同,强行合并极度别扭
Core gRPC 方法名、参数结构、语义是为内网聚合调用设计;前端 REST 是为浏览器 HTTP 规范设计(GET/POST、Path 参数、Query 参数、表单、文件上传)。两者语义不兼容,硬合并只会出现「RPC 接口硬套 REST 路由」的畸形代码。
③ 多端场景差异无法适配
App、Admin 两端的路由规范、权限位置、请求方式、字段展示完全不同。如果全部塞在 Core Proto,会出现大量场景化字段、路由适配逻辑污染内核。
2、GoWind 专属设计:BFF 独立 Proto + i_ 前缀的核心目的
这套设计不是冗余,是为了彻底贯彻「Core 管能力、BFF 管场景」的分层思想。
① 包维度隔离:admin.service.v1 / app.service.v1
将管理端、用户端的路由协议物理隔离:
-
管理后台所有 REST 路由、接口规则,收敛在
admin.service.v1 -
前台多端所有 REST 路由、接口规则,收敛在
app.service.v1
彻底杜绝两端路由命名冲突、接口语义混淆、权限规则串扰。实现:两端协议独立迭代、互不污染。
② i_ 前缀文件隔离,解决全局命名冲突
在多服务、多 proto 场景下,极易出现不同服务同名 proto 文件(如 user.proto、content.proto),编译后会引发包冲突、结构体覆盖、编译报错等隐性问题。
统一 i_ 前缀(interface 层含义,代表对外接口层),显性标识:这是 BFF 对外暴露的接口协议,不是内核业务协议。
既解决了全局文件名冲突,又通过命名规范做了架构分层显性约束,新人看多了就能一眼区分:内核文件 vs 对外接口文件。
3、最关键设计:BFF 的 Proto 只定义 REST,不定义业务模型
这是整套设计的灵魂,也是新人最看不懂的点:
BFF 层 proto:只定义 Service、定义 Http Rule(path/方法/参数映射)
数据结构体、业务模型、数据库映射,全部复用 Core 的 Protobuf
很多新人误以为:独立 Proto = 全套独立结构体。
而 GoWind 的设计哲学是:数据模型统一在内核,路由场景分层在 BFF。
优势拆解:
-
数据绝对统一,无重复定义:所有核心结构体、枚举、规则全部来自 Core,不会出现 Core 一套结构、BFF 一套结构,彻底杜绝数据不一致、双向维护的问题。
-
路由灵活定制,适配多端场景:BFF 可根据前台/后台的 UI 交互习惯,自由定义 REST 路径、请求方式、参数拼装规则,无需改动 Core 内核。
-
彻底解耦内外协议:内网 gRPC 契约、外网 REST 契约完全分离,Core 升级字段、修复结构、优化规则,不影响前端路由;前端改路由、改接口风格,不影响内核稳定性。
4、一张表看懂:Core Proto vs BFF Proto 职责边界
| 所属层 | Proto 职责 | 协议类型 | 是否定义数据模型 | 是否定义路由 |
|---|---|---|---|---|
| Core 内核 | 定义标准业务能力、数据结构、枚举、内核RPC方法 | 内网 gRPC | ✅ 全部业务模型 | ❌ 不对外暴露路由 |
| Admin BFF | 定义管理端 REST 路由、Http 映射规则 | 外网 REST | ❌ 复用 Core 模型 | ✅ 仅管理后台路由 |
| App BFF | 定义用户多端 REST 路由、Http 映射规则 | 外网 REST | ❌ 复用 Core 模型 | ✅ 仅前台用户路由 |
5、这套设计最终解决了什么问题?
-
解决协议耦合问题:内外协议彻底隔离,内核稳定、外层灵活;
-
解决多端路由冲突问题:前后台路由物理分包,互不干扰;
-
解决全局文件命名冲突问题:i_前缀统一规范,杜绝编译冲突;
-
解决新人架构思维混乱问题 :通过目录、包名、文件名三层规范,强制约束开发者:内核管数据,BFF管入口;
-
保留数据统一性,同时最大化灵活度:数据一处定义、到处复用,路由按需定制、多端适配。
6、团队极简落地:BFF 层 Proto 新人开发规范(强制统一)
为彻底规避新人开发困惑、统一团队编码规范,固化 GoWind BFF 层 Proto 编写标准,所有 BFF 对外协议严格遵循以下5条强制规则,无特殊例外:
规则1:包路径强制分层隔离
管理端 BFF 协议统一归属包:admin.service.v1;前台 BFF 协议统一归属包:app.service.v1,严禁混包、跨包定义接口,彻底隔离前后台路由语义。
规则2:Proto 文件强制加 i_ 前缀
所有 BFF 层对外协议文件,必须以 i_ 开头(i 代表 interface 对外接口层),如 i_user.proto、i_content.proto,区分内核 Proto 文件,杜绝全局文件名冲突。
规则3:BFF Proto 只负责路由定义,不定义任何业务模型
BFF 层 Proto 文件仅编写 service 服务定义、HTTP 路由规则(path、请求方式、参数映射)。所有 Request、Response、数据结构体、枚举、业务模型,一律复用 Core 内核 Proto,禁止在 BFF 层重复定义、新增结构体。
规则4:内外协议严格解耦,各司其职
内网 gRPC 契约、数据约束由 Core 维护迭代,外网 REST 路由、前端适配规则由 BFF 维护。Core 数据结构变更,无需改动 BFF 路由;BFF 路由适配多端调整,不影响内核业务。
规则5:仅适配 HTTP REST,专注前端场景适配
BFF 层 Proto 仅用于生成对外 REST 接口,所有配置围绕前端浏览器、多端适配设计,不编写内网 RPC 服务逻辑,不承担核心业务校验、数据处理职责。
一句话极简口诀(新人必记):内核管模型、BFF管路由、文件带i前缀、两端分包写。
八、总结:微服务的终极真谛,是「分层解耦」而非「盲目拆分」
很多技术人员被传统微服务思维误导,认为服务越多、拆分越细,架构越优秀。而 GoWind 风行 CMS 的实践证明:适合存量项目的微服务,是无感、渐进、低风险的分层架构。
对于所有单体 CMS、单体后台系统而言,最优演进路径从来不是推倒重来,而是:
提纯 Core 核心能力,剥离双端 BFF 场景逻辑,分层解耦、渐进升级。
这套 Core + Admin BFF + App BFF 架构,既保留了单体项目开发简单、部署便捷的优势,又拥有微服务高扩展、高可用、高可维护、多端适配的企业级能力,完美解决了传统单体项目转型难、风险高、成本大的痛点,是内容中台、CMS 系统从单体平滑演进微服务的最佳实践方案。