一句话核心:前后端分离是「客户端与服务端」的交互模式;微服务是「后端内部」的拆分方式。二者不是二选一,是叠加关系。前端不直接调用各个微服务,通过网关统一对接。
一、概念区分(先理清边界)
- 前后端分离
前端(Vue/React等)独立项目,部署在静态资源服务器;后端不再渲染页面,只返回JSON接口。关注点:前后端解耦,各司其职。
- 微服务
把单体后端拆成多个独立小服务(用户服务、订单服务、商品服务),各自独立开发、部署、扩容。关注点:后端内部模块解耦。
单体架构也可以做前后端分离;微服务后端,必须合理设计接口,才能和前端配合。
二、标准协同架构流程
plaintext
前端应用 → API网关 → 各个微服务
-
前端:页面、交互,只调用网关暴露的接口,不能直接访问微服务。微服务内网地址不对外暴露。
-
API网关(核心协同层)
-
路由转发:把前端请求分发到对应的微服务
-
统一鉴权、限流、CORS跨域处理
-
接口聚合:多个微服务的数据合并,一次性返回给前端(避免前端多次请求)
-
例子:Spring Cloud Gateway、Nginx、Kong
- 微服务集群
-
每个微服务只负责自己业务,独立数据库
-
服务之间通过RPC/HTTP互相调用(服务间通信,前端无感知)
- 公共组件
-
注册中心:管理微服务实例(Nacos/Eureka)
-
配置中心:统一配置
-
链路追踪、日志:排查前端发起、后端微服务链路的问题
三、协同的关键要点
- 接口契约先行
前端和后端微服务团队,提前约定接口文档(OpenAPI/Swagger)。
-
前端基于接口文档做页面开发,可以用Mock数据,前后端并行开发
-
每个微服务只输出领域接口,网关按需对外暴露
- 解决数据聚合痛点
微服务拆分后,一个页面的数据可能来自多个微服务。
❌ 不好做法:前端循环调用多个微服务接口(请求多、慢、复杂)
✅ 推荐做法:网关/聚合服务组装数据,前端只请求1次。
- 跨域、鉴权统一放在网关
前后端分离天然存在跨域问题,不要每个微服务单独处理跨域,统一在网关层配置CORS。
登录态(token)校验也放在网关,所有微服务不用重复写鉴权代码。
- 版本管理
网关做接口版本控制 /api/v1/order ,微服务迭代升级,平滑兼容前端旧版本。
四、简易对比:单体前后端分离 VS 微服务+前后端分离
-
单体+前后端分离:前端 ↔ 单体后端。后端是一个大包,所有接口都在一个应用里。简单,适合小项目。
-
微服务+前后端分离:前端 ↔ 网关 ↔ 多个微服务。扩展性强,适合大型项目;架构复杂度高。
五、数据流示例
用户在前端点击【查看订单详情】
-
前端发起请求: GET /api/v1/order/detail?id=1001
-
请求到达API网关,校验token、限流
-
网关路由转发到订单微服务
-
订单微服务需要用户名称,内部调用用户微服务;需要商品名称,内部调用商品微服务
-
订单服务汇总数据返回网关
-
网关返回JSON给前端渲染页面
整个过程,前端完全不知道后端有多少个微服务。
六、常见坑
-
前端直连微服务:安全风险,微服务暴露内网端口
-
不做接口聚合,前端串行请求多个接口,页面卡顿
-
每个微服务单独鉴权、跨域,大量重复代码
-
微服务雪崩:一个服务故障,连锁影响,需要网关熔断降级
七、极简技术栈参考
前端:Vue3 / React
网关:Spring Cloud Gateway / Nginx
微服务:SpringBoot + Nacos
通信:服务内部Feign(RPC),对外HTTP JSON