BFF 与 SSR 架构选型:Next.js/Nuxt 与微服务的边界实践

2026-06-12 14:22:53
# BFF 与 SSR 架构选型实践 > 案例:企业官网 + 管理后台,SEO 要求高,后端 Spring Cloud 微服务 ## 一、三种模式对比 | 模式 | 优点 | 缺点 | |------|------|------| | 纯 SPA | 简单 | SEO 差、首屏慢 | | SSR(Nuxt/Next) | SEO + 首屏 | Node 运维、复杂度高 | | BFF 层 | 前端友好 API | 多一层维护 | **推荐组合**:**Nuxt 3 SSR + 轻量 BFF(Nuxt Server Routes)** 聚合微服务。 --- ## 二、架构图 ``` Browser → CDN → Nuxt SSR Server ↓ Server API (/api/**) Spring Cloud Gateway → 微服务群 ``` - **公开页**:SSR 渲染,`useAsyncData` 服务端取数 - **管理后台**:可 CSR + 登录态 - **BFF**:仅 Nuxt `server/api`,不单独起 Node 服务 --- ## 三、Nuxt 3 目录结构 ``` pages/ # 路由与 SSR 页面 server/ api/ products.get.ts # BFF:聚合商品列表 user/ profile.get.ts composables/ # useAuth, useApi middleware/ # 鉴权 ``` ### 3.1 BFF 聚合示例 ```typescript // server/api/product-detail.get.ts export default defineEventHandler(async (event) => { const id = getQuery(event).id const [product, reviews, stock] = await Promise.all([ $fetch(`${config.apiBase}/products/${id}`), $fetch(`${config.apiBase}/reviews?productId=${id}`), $fetch(`${config.apiBase}/inventory/${id}`), ]) return { product, reviews, stock } }) ``` 前端只调 `/api/product-detail?id=1`,**减少浏览器 3 次 RTT**。 --- ## 四、鉴权与 Session | 方案 | 场景 | |------|------| | HttpOnly Cookie + JWT | 同域 SSR 推荐 | | Bearer Token(Header) | 纯 API 移动端 | SSR 请求微服务时,从 Cookie 解析 Token,**Server 端注入 Authorization**,避免 Token 暴露给浏览器 JS。 ```typescript // server/utils/auth.ts export function getTokenFromEvent(event: H3Event) { return parseCookies(event).access_token } ``` --- ## 五、缓存分层 | 层 | 策略 | TTL | |----|------|-----| | CDN | 静态资源 hash | 1y | | Nuxt Route Rules | ISR 公开页 | 60s | | Redis | 热点 API 缓存 | 5min | | 微服务 | 本地 Caffeine | 30s | ```typescript // nuxt.config.ts routeRules: { '/news/**': { isr: 120 }, '/admin/**': { ssr: false }, } ``` --- ## 六、性能优化 1. **Payload 精简**:SSR 只传首屏字段,详情懒加载 2. **Streaming SSR**:Nuxt 3 实验性 stream HTML 3. **图片**:`` + CDN 裁切 4. **预连接**:`` 目标:LCP < 2.5s,TTFB < 600ms(国内 CDN)。 --- ## 七、何时需要独立 BFF 服务? - 移动端 + Web + 小程序 **共用聚合逻辑** → 独立 Node/Java BFF - 复杂 GraphQL 联邦 → Apollo Router - 团队无 Node 能力 → **Spring Cloud Gateway 聚合**(注意别写成上帝 Gateway) --- ## 八、反模式 - ❌ BFF 写业务逻辑、直连 DB - ❌ Gateway 为每个页面写聚合接口 - ❌ SSR 页面调 10+ 微服务(串行瀑布) - ❌ 把密钥写在 `nuxt.config` 客户端 bundle --- ## 小结 BFF 解决 **前端体验**,SSR 解决 **SEO 与首屏**;Nuxt Server Routes 是国内全栈团队低成本组合。边界原则:**BFF 只聚合与裁剪,业务规则仍在微服务**。