混合架构:两全其美,使用 Supabase 与 Spring Boot
发布于 14 January 2026
现代建筑的伪二分法
当构建一个带有静态前端的现代应用程序时,我们常常会面临一个二元的选择:
-
把所有押注押在 Backend-as-a-Service 解决方案上(Supabase, Firebase) - 简单但受限
-
构建一个完整的后端(Spring Boot, Node.js) - 功能强大但复杂
这个选择是一个伪二难问题。混合架构提供了一条第三条途径:使用每项技术在其擅长的地方。
建筑愿景
传统架构:单体
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "传统架构" {
actor Utilisateur as user
component "前端" as frontend #LightBlue
component "单体后端" as backend #LightCoral {
[Authentification]
[CRUD]
[Logique Métier]
[Jobs]
[APIs Tierces]
}
database "数据库" as db #LightGray
user --> frontend
frontend --> backend : 所有请求
backend --> db
}
note right of backend
一切都通过后端
即使是简单的操作
⚠️ 单点瓶颈
⚠️ 从一开始就很复杂
⚠️ 强耦合
end note
@enduml
在这种方法中,即使是最简单的操作(阅读一篇文章,创建一条评论)也必须经过您的后端。您从第一天起就需承担复杂性的成本。
BaaS架构:所有代表
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "架构 BaaS 纯" {
actor Utilisateur as user
component "前端" as frontend #LightBlue
cloud "Supabase / Firebase" as baas #LightGreen {
[Auth]
[Database]
[Storage]
[Edge Functions]
}
user --> frontend
frontend --> baas : 所有操作
}
note right of baas
快速开发
无需管理服务器
⚠️ 复杂逻辑受限
⚠️ 厂商锁定
⚠️ 边缘函数受限
end note
@enduml
相反,一开始将一切委托给 BaaS 很有吸引力,但一旦业务逻辑变得复杂,它的局限性就会很快显现。
混合架构:职责分离
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
actor Utilisateur as user #LightBlue
package "前端层" {
component "静态网站 JBake" as frontend #SkyBlue
}
package "简单层 (Supabase)" #LightGreen {
component "身份验证" as auth
component "CRUD 基础" as crud
component "文件存储" as storage
component "实时" as realtime
}
package "业务层 (Spring Boot)" #Coral {
component "复杂逻辑" as logic
component "编排" as orchestration
component "计划作业" as jobs
component "集成" as integrations
}
database "PostgreSQL 共享" as db #LightGray
user --> frontend
frontend --> auth : OAuth2, JWT
frontend --> crud : 文章, 资料
frontend --> storage : 图片,文件
frontend --> realtime : 通知
frontend --> logic : 计算, 报告
frontend --> orchestration : 工作流程
logic --> integrations : 条纹, APIs
orchestration --> db
jobs --> db
crud --> db
auth --> db
note bottom of db
**单一真实来源**
由 Supabase 和 Spring Boot 共享
end note
note right of auth
免费,最高可达 50k 用户
配置仅需几次点击
OAuth2 多提供商
end note
note right of logic
仅在必要时启用
Kotlin + 协程
复杂事务
end note
@enduml
混合架构根据操作的复杂性和性质明确划分了责任。
设计原则
原则1:从简单开始,智能演进
@startuml
skinparam backgroundColor #FEFEFE
rectangle "**阶段 1 : MVP**" #LightGreen {
component "JBake + Supabase" as mvp
note right
✓ 开发天数
✓ 成本:0欧元
✓ 概念验证
end note
}
rectangle "**阶段 2 : 增长**" #LightYellow {
component "JBake + Supabase\n+ Spring Boot (可选)" as growth
note right
✓ 业务逻辑浮现
✓ 首批作业已计划
✓ 第三方集成
户
end note
}
rectangle "**阶段 3 : 规模**" #LightCoral {
component "完整架构" as scale
note right
✓ 复杂的编排
✓ 性能已优化
✓ 分布式缓存
end note
}
mvp -down-> growth : 当复杂性\n是合理的
growth -down-> scale : 优化\n继续
@enduml
如果你不需要 Spring Boot,就不要构建它。先使用 Supabase 开始,当复杂度需要时添加 Spring Boot。
原则2:按运营性质分离
@startmindmap skinparam backgroundColor #FEFEFE * 操作\n适用 left side ** 简单操作\n(Supabase) ***_ CRUD 标准 ****_ 阅读 ****_ 创建 ****_ 更新 ****_ 删除 ***_ 身份验证 ****_ 登录/Logout ****_ OAuth2 ****_ 会话管理 ***_ 存储 ****_ 上传文件 ****_ CDN 自动 ***_ 实时 ****_ WebSocket ****_ 通知 right side ** 复杂操作\n(Spring Boot) ***_ 业务逻辑 ****复杂计算 ****_ 业务规则 ****_ 高级验证 ***_ 编排 ****_ 多服务 ****_ 分布式事务 ****_ Saga模式 ***_ 已计划的任务 ****_ 定期报告 ****_ 同步 ****_ 清洁 ***_ 集成 ****_ 付款 (Stripe) ****_ APIs 第三方 ****_ 服务 ML/AI @endmindmap
原则 3 : 唯一真相来源
@startuml
skinparam backgroundColor #FEFEFE
database "PostgreSQL" as db #LightGray {
package "Schema: auth (Supabase)" #LightGreen {
[users]
[sessions]
[identities]
}
package "Schema: public (共享)" #SkyBlue {
[articles]
[comments]
[profiles]
}
package "Schema: business (Spring Boot)" #Coral {
[orders]
[payments]
[reports]
}
}
component "Supabase" as supabase #LightGreen
component "Spring Boot" as spring #Coral
supabase -down-> users : 管理
supabase -down-> sessions : 管理
supabase -down-> articles : 访问
supabase -down-> comments : 访问
supabase -down-> profiles : 访问
spring -down-> articles : 访问
spring -down-> profiles : 访问
spring -down-> orders : 管理
spring -down-> payments : 管理
spring -down-> reports : 管理
note right of db
优势:
• 无需复杂同步
• JOINs 在表之间可行
• 一致性得到保证
• 统一迁移
end note
@enduml
通过共享同一 PostgreSQL 实例,Supabase 和 Spring Boot 在相同的数据上工作,而无需复杂的同步。
流编排
流程 1 : 集中式身份验证
@startuml skinparam backgroundColor #FEFEFE autonumber actor "用户" as user participant "JBake" as jbake participant "Supabase Auth" as auth participant "Spring Boot" as spring database "PostgreSQL" as db == Authentification == user -> jbake : Clique "登录" jbake -> auth : 重定向 OAuth2 (Google/GitHub) auth -> user : 同意界面 user -> auth : 允许 auth -> auth : 生成 JWT auth -> jbake : 返回 JWT + Refresh Token jbake -> jbake : 存储令牌 (sessionStorage) == Accès aux Ressources == group Opération Simple (CRUD) user -> jbake : 创建一篇文章 jbake -> db : POST 和 JWT note right: Supabase 行级安全\n自动检查 JWT db -> jbake : 文章已创建 end group Opération Complexe (Métier) user -> jbake : 生成报告 jbake -> spring : POST /api/reports\n与 JWT spring -> spring : 验证 JWT Supabase spring -> spring : 摘录 声称(user_id, roles) spring -> db : 复杂查询 spring -> jbake : 已生成的报告 end note over auth, spring **JWT 是通用的** 经 Supabase 和 Spring Boot 验证 没有 double 身份验证 end note @enduml
关键点: 一个认证流程,一个 JWT,可在任何地方使用。
Flux 2 : 复杂业务流程的编排
@startuml skinparam backgroundColor #FEFEFE autonumber actor "客户" as user participant "JBake" as jbake participant "Spring Boot" as spring participant "Supabase 数据库" as supadb participant "Stripe API" as stripe participant "库存服务" as inventory participant "邮件服务" as email database "PostgreSQL" as db user -> jbake : 下订单 jbake -> spring : POST /api/orders/create == Orchestration Spring Boot == spring -> db : BEGIN TRANSACTION par Vérifications Parallèles spring -> inventory : 检查库存 inventory -> spring : 库存正常 else spring -> db : 检查客户资料 db -> spring : 已验证的客户 end spring -> stripe : 创建 Payment Intent stripe -> spring : 意图已创建 (ID: pi_xxx) spring -> db : 创建 Order (status: PENDING) db -> spring : 订单已创建 spring -> stripe : 确认支付 stripe -> spring : 付款已确认 spring -> db : 更新订单 (状态: PAID) spring -> inventory : 减少库存 spring -> db : COMMIT TRANSACTION par Notifications Asynchrones spring -> email : 邮件确认 else spring -> supadb : 插入通知 note right: 实时通知\nvia Supabase 实时 end spring -> jbake : 订单已确认 jbake -> user : 显示 确认 note over spring **Spring Boot 的职责:** • 事务 ACID • 多服务编排 • 错误时自动回滚 • 边界情况处理 end note @enduml
Spring Boot 带来的: 可靠地编排涉及多个系统的复杂流程,提供事务保证。
Flux 3 : 计划作业和同步
@startuml skinparam backgroundColor #FEFEFE participant "调度器\n(Spring Boot)" as scheduler participant "报告服务" as report participant "PostgreSQL" as db participant "外部 API" as api participant "邮件服务" as email participant "Supabase 存储" as storage == Job Quotidien : 2点整 activate scheduler scheduler -> report : 触发生成报告 activate report report -> db : 获取数据\n 过去24小时的 db -> report : 数据集 report -> report : 计算与聚合 report -> report : 生成 PDF report -> storage : 上传 PDF storage -> report : URL publique report -> email : 发送给管理员\n带有链接 PDF deactivate report == Job Hebdomadaire : 星期日 3h00 == scheduler -> report : 外部同步 activate report report -> api : 获取外部数据 api -> report : 新数据 report -> db : 更新表格 report -> db : 清理过时数据 deactivate report == Job Mensuel : 每月1日 == scheduler -> report : 开票 activate report report -> db : 活跃客户列表 report -> report : 计算金额 report -> api : 生成 发票 (Stripe) report -> email : 发送发票 deactivate report deactivate scheduler note right of scheduler 仅使用 Supabase 无法完成 边缘函数不适用 针对长期及周期性任务 end note @enduml
Spring Boot 所带来的: 可靠的计划任务,具备状态管理、自动重试和保证执行。
决策矩阵
何时使用 Supabase?
@startuml
skinparam backgroundColor #FEFEFE
start
:Nouvelle fonctionnalité à implémenter;
if (CRUD simple ?) then (oui)
:✅ **Supabase**;
stop
else (non)
if (Authentification ?) then (oui)
:✅ **Supabase Auth**;
stop
else (non)
if (Upload fichiers ?) then (oui)
:✅ **Supabase Storage**;
stop
else (non)
if (Temps réel ?) then (oui)
:✅ **Supabase Realtime**;
stop
else (non)
if (Row Level Security\nsuffisante ?) then (oui)
:✅ **Supabase + Policies**;
stop
else (non)
:⚠️ **Considérer Spring Boot**;
#Coral:Passer à l'arbre\nde décision Spring Boot;
stop
endif
endif
endif
endif
endif
@enduml
何时使用 Spring Boot?
@startuml
skinparam backgroundColor #FEFEFE
start
:Nouvelle fonctionnalité complexe;
if (Orchestration\nmulti-services ?) then (oui)
:✅ **Spring Boot**;
stop
else (non)
if (Transaction ACID\ncritique ?) then (oui)
:✅ **Spring Boot**;
stop
else (non)
if (Job planifié ?) then (oui)
:✅ **Spring Boot Scheduler**;
stop
else (non)
if (Intégration API\ntierce complexe ?) then (oui)
:✅ **Spring Boot**;
stop
else (non)
if (Calculs lourds\n> 10 secondes ?) then (oui)
:✅ **Spring Boot**;
stop
else (non)
if (Cache distribué\nnécessaire ?) then (oui)
:✅ **Spring Boot + Redis**;
stop
else (non)
:⚠️ **Probablement Supabase**;
#LightGreen:Revenir à l'arbre\nde décision Supabase;
stop
endif
endif
endif
endif
endif
endif
@enduml
按项目类型的架构示例
博客 / 作品集
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "个人博客 - 95% Supabase" {
component "JBake" as jbake #SkyBlue
package "Supabase (免费)" #LightGreen {
[Auth: OAuth2 Google]
[Articles (CRUD)]
[Commentaires]
[Images (Storage)]
[Notifications Realtime]
}
package "Spring Boot (可选)" #LightCoral {
[Newsletter Mensuelle]
note bottom: 仅计划的任务
}
database "PostgreSQL" as db
jbake --> [Auth: OAuth2 Google]
jbake --> [Articles (CRUD)]
jbake --> [Commentaires]
jbake --> [Images (Storage)]
jbake --> [Notifications Realtime]
[Articles (CRUD)] --> db
[Commentaires] --> db
[Newsletter Mensuelle] --> db
}
note bottom of "Spring Boot (可选)"
Spring Boot 非必须
Newsletter 可由第三方服务(如 Mailchimp)管理
end note
@enduml
裁决: 100% Supabase 足够了。
SaaS 应用程序
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "应用 SaaS - 混合架构" {
component "JBake / React" as frontend #SkyBlue
package "Supabase" #LightGreen {
[Auth Multi-tenant]
[Profils Utilisateurs]
[Données Simples]
[Storage Documents]
}
package "Spring Boot" #Coral {
[Facturation (Stripe)]
[Analytics Avancées]
[Rapports Mensuels]
[Quotas & Limites]
[Webhooks Stripe]
}
cloud "外部服务" {
[Stripe API]
[SendGrid Email]
}
database "PostgreSQL Partagé" as db
frontend --> [Auth Multi-tenant]
frontend --> [Profils Utilisateurs]
frontend --> [Données Simples]
frontend --> [Facturation (Stripe)]
frontend --> [Analytics Avancées]
[Auth Multi-tenant] --> db
[Profils Utilisateurs] --> db
[Données Simples] --> db
[Facturation (Stripe)] --> db
[Facturation (Stripe)] --> [Stripe API]
[Analytics Avancées] --> db
[Rapports Mensuels] --> db
[Rapports Mensuels] --> [SendGrid Email]
[Webhooks Stripe] ..> [Stripe API] : Écoute
}
note right of "Spring Boot"
必要用于:
• 管理订阅
• 循环计费
• 动态配额
• 复杂分析
• 可靠的 Webhook
end note
@enduml
裁决: 需要混合架构。 Supabase 用于核心部分,Spring Boot 用于关键部分(支付、发票)。
电子商务
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "电子商务 - 70% Spring Boot" {
component "店面 (JBake/React)" as frontend #SkyBlue
package "Supabase" #LightGreen {
[Auth Clients]
[Catalogue Produits\n(lecture seule)]
[Images Produits]
}
package "Spring Boot (核心业务)" #Coral {
[Gestion Commandes]
[Paiements Stripe]
[Gestion Stock]
[Calcul Frais Port]
[Génération Factures]
[Synchronisation ERP]
[Emails Transactionnels]
}
cloud "集成" {
[Stripe]
[Transporteur API]
[ERP Externe]
}
database "PostgreSQL" as db
frontend --> [Auth Clients]
frontend --> [Catalogue Produits\n(lecture seule)]
frontend --> [Gestion Commandes]
[Auth Clients] --> db
[Catalogue Produits\n(lecture seule)] --> db
[Gestion Commandes] --> db
[Paiements Stripe] --> [Stripe]
[Gestion Stock] --> db
[Calcul Frais Port] --> [Transporteur API]
[Génération Factures] --> db
[Synchronisation ERP] --> [ERP Externe]
[Synchronisation ERP] --> db
}
note right of "Spring Boot (核心业务)"
Spring Boot 不可或缺:
• 关键事务
• 复杂编排
• 多重集成
• 法律合规
• 同步作业
end note
@enduml
裁决Spring Boot 不可或缺。Supabase 仅用于身份验证和目录。
渐进式迁移策略
@startuml skinparam backgroundColor #FEFEFE |Semaine 1-2| start :创建项目 Supabase; :配置 Auth (Google, GitHub); :设置初始的PostgreSQL方案; :在 JBake 基础上实现 CRUD; :将 MVP 部署到 GitHub 页面; note right **可交付物 : 功能应用** **成本 : 0€** **时间 : 1-2周** end note |Semaine 3-4| :观察实际使用; :标识符限制; |Décision| if (Logique complexe\némerge ?) then (non) |Supabase| :仅继续使用 Supabase; :如需添加 Edge Functions; stop else (oui) |Spring Boot| :创建 Spring Boot 项目; :配置验证 JWT Supabase; :将复杂逻辑迁移到 Spring Boot; note right **选择性迁移** 仅此复杂 end note endif |Semaines suivantes| :部署 Spring Boot (Cloud Run, EC2); :连接到 PostgreSQL Supabase; :实现首批预定作业; :集成 APIs 第三方; stop note right **最终混合架构** Supabase + Spring Boot 完美和谐 end note @enduml
成本和运营注意事项
成本结构
@startuml
skinparam backgroundColor #FEFEFE
package "估算的月成本" {
rectangle "阶段 MVP\n(0-1000 users)" #LightGreen {
[JBake (GitHub Pages): 0€]
[Supabase: 0€]
[Spring Boot: N/A]
note bottom: 总计: 0€/mois
}
rectangle "增长阶段\n(1k-10k users)" #LightYellow {
[JBake (GitHub Pages): 0€]
[Supabase: 0€]
[Spring Boot (Cloud Run): 20-50€]
[PostgreSQL (si séparé): 0-30€]
note bottom: 合计:20-80€/mois
}
rectangle "规模阶段\n(10k-100k users)" #LightCoral {
[JBake (Netlify Pro): 19€]
[Supabase Pro: 25€]
[Spring Boot (instances multiples): 100-300€]
[Redis Cache: 20-50€]
[Monitoring: 20€]
note bottom: 总计: 184-414€/mois
}
}
note right of "规模阶段\n(10k-100k users)"
此时,收入已经充分证明了成本的合理性。
end note
@enduml
运营责任
@startuml
skinparam backgroundColor #FEFEFE
package "谁管理什么?" {
rectangle "Supabase 管理 (0 努力)" #LightGreen {
[Authentification]
[Base de données]
[Backups automatiques]
[Scaling automatique]
[Monitoring DB]
[Sécurité DB]
}
rectangle "GitHub 管理 (0 努力)" #SkyBlue {
[Hébergement site statique]
[HTTPS/SSL]
[CDN global]
[Déploiement automatique]
}
rectangle "待管理 (Spring Boot)" #LightCoral {
[Déploiement application]
[Monitoring APM]
[Logs centralisés]
[Scaling horizontal]
[Mises à jour sécurité]
}
}
note bottom of "待管理 (Spring Boot)"
可最小化使用:
• Cloud Run(无服务器)
• Kubernetes(如有必要)
• 托管服务(RDS,等)
end note
@enduml
结论:完美平衡
Supabase + Spring Boot 混合架构不是一种妥协,而是一种协同效应.
需牢记的原则
@startmindmap skinparam backgroundColor #FEFEFE * 架构\n混合 ** 简约开始 ***_ MVP 与 Supabase ***_ 0€ 的初始成本 ***_ 快速验证 ** 智能进化 ***_ 添加 Spring Boot\n 如有必要 ***_ 逐步迁移 ***_ 不进行全面改版 ** 利用优势 ***_ Supabase: 简洁 ***_ Spring Boot: 功率 ***_ PostgreSQL: 唯一来源 ** 最小化复杂性 ***_ 无同步 ***_ 不重复 ***清晰的架构 ** 优化成本 ***_ 起始免费 ***_ 渐进式缩放 ***_ ROI 显而易见 @endmindmap
何时选择此架构?
✅这种架构是理想的,如果:
-
您希望快速启动(MVP 以天为单位,而非月份)
-
您预计业务复杂性将会增长
-
您希望最小化初始成本
-
您喜欢PostgreSQL,并希望拥有一个唯一的真理来源。
-
您喜欢Kotlin和协程用于业务代码
-
您想要避免完全的供应商锁定
❌ 此架构在以下情况下不适用 :
-
您的项目很简单,且会一直保持简单(个人博客 → 100% Supabase 足矣)
-
您已经有一个您熟悉的后端技术栈
-
您更喜欢传统的单体
-
您需要 .NET、Python 或其他后端语言
最终全景视图
@startuml
skinparam backgroundColor #FEFEFE
package "完整混合架构" {
actor "用户" as users
rectangle "前端 (静态)" #SkyBlue {
[JBake / GitHub Pages]
note right: 免费, CDN 全局
}
rectangle "简单后端 (Supabase)" #LightGreen {
[Auth OAuth2]
[CRUD APIs]
[Storage]
[Realtime]
note right
免费最高支持 50k 用户
零配置服务器
end note
}
rectangle "业务后端 (Spring Boot)" #Coral {
[Orchestration]
[Jobs Planifiés]
[Intégrations]
[Transactions]
note right
仅在必要时启用
end note
}
database "PostgreSQL\nSource 唯一真理" as db #LightGray
users --> [JBake / GitHub Pages]
[JBake / GitHub Pages] --> [Auth OAuth2]
[JBake / GitHub Pages] --> [CRUD APIs]
[JBake / GitHub Pages] --> [Storage]
[JBake / GitHub Pages] --> [Realtime]
[JBake / GitHub Pages] --> [Orchestration]
[Auth OAuth2] --> db
[CRUD APIs] --> db
[Orchestration] --> db
[Jobs Planifiés] --> db
[Intégrations] --> db
}
note bottom of db
单一基础,双消费者
• Supabase 用于简单场景
• Spring Boot 用于复杂场景
• 无需同步
end note
@enduml
两全其美
这种架构为您提供:
🚀 Supabase 的速度
-
以小时为单位启动,而不是以周为单位
-
几次点击即可完成的 OAuth2 身份验证
-
自动生成的REST API
-
零服务器配置
💪 Spring Boot 的力量
-
Kotlin 和 Coroutines 用于优雅的异步代码
-
复杂业务流程的编排
-
可靠的计划作业
-
保证的 ACID 事务
-
完整的 Spring 生态系统
💰 进步经济
-
0€ 启动并确认
-
随增长而变化的成本
-
不要过早进行过度工程
🎯 架构灵活性
-
渐进式迁移,无需重构
-
仅在必要时添加 Spring Boot
-
没有完全的供应商锁定
-
可演进架构
更进一步
技术资源
Supabase 文档 :
Spring Boot 文档 :
补充条款:
-
使用 JWT 保护 API 安全
-
PostgreSQL性能优化
-
渐进式迁移模式
-
分布式架构中的错误处理
实际使用案例
这种混合架构在以下场景中被成功使用:
-
SaaS B2B: Supabase 认证,Spring Boot 计费
-
市场: 目录 Supabase, Spring Boot 事务
-
内容平台: 文章 Supabase, 分析 Spring Boot
-
内部工具CRUD Supabase, 工作流 Spring Boot
启动清单
第一阶段 - 基础(第1周)
-
创建 Supabase 账户 - [ ] 配置 PostgreSQL 项目 - [ ] 启用 Auth (Google, GitHub) - [ ] 定义初始模式 - [ ] 配置 Row Level Security - [ ] 使用 JBake 测试 API
第二阶段 - MVP (第2-3周)
-
实现主页面 - [ ] 集成 OAuth2 认证 - [ ] 创建 CRUD 表单 - [ ] 配置 Storage 用于文件 - [ ] 部署到 GitHub Pages - [ ] 在真实条件下测试
阶段 3 - 演变(根据需求)
-
识别复杂逻辑需求 - [ ] 如有必要创建 Spring Boot 项目 - [ ] 配置 Supabase JWT 验证 - [ ] 连接到 PostgreSQL Supabase - [ ] 迁移复杂功能 - [ ] 实现计划任务 - [ ] 部署 Spring Boot(Cloud Run 等)
需避免的反模式
❌ 不要做 :
-
在Supabase和Spring Boot之间复制数据
-
创建两个独立的 PostgreSQL 数据库
-
自行实现身份验证
-
使用 Spring Boot 进行简单的 CRUD
-
从一开始就过度设计
-
忽略 Supabase 的行级安全
✅ 更倾向于做:
-
共享一个 PostgreSQL 数据库
-
让 Supabase 处理身份验证
-
仅仅为了复杂性而使用 Spring Boot
-
从简单开始,逐步发展
-
利用每种技术的优势
-
使用 RLS 在数据库级别进行保护
发展前景
添加新功能
@startuml
skinparam backgroundColor #FEFEFE
rectangle "当代建筑" #SkyBlue {
[JBake]
[Supabase]
[Spring Boot]
}
rectangle "可能的发展" #LightYellow {
package "性能" {
[Redis Cache]
[CDN pour Assets]
[PostgreSQL Replicas]
}
package "监控" {
[Grafana]
[Prometheus]
[Sentry]
}
package "CI/CD" {
[GitHub Actions]
[Tests Automatisés]
[Déploiement Continu]
}
package "功能" {
[Search (ElasticSearch)]
[Queue (RabbitMQ)]
[Event Sourcing]
}
}
[Spring Boot] .down.> [Redis Cache] : Peut ajouter
[Spring Boot] .down.> [Queue (RabbitMQ)] : Peut ajouter
[Spring Boot] .down.> [Search (ElasticSearch)] : Peut ajouter
[Supabase] .down.> [PostgreSQL Replicas] : Peut ajouter
note bottom
**可扩展架构**
每个添加都是独立的
无需进行全局重构
end note
@enduml
水平缩放
当您的应用程序增长时,混合架构会自然地扩展:
Supabase :
-
自动扩展至数百万次操作
-
Read replicas 用于读取性能
-
用于安全的时间点恢复
Spring Boot:
-
多个实例位于负载均衡器之后
-
无状态设计便于水平扩展
-
Kubernetes 用于编排(如果需要)
PostgreSQL:
-
用于大型表的分区
-
连接池 (PgBouncer)
-
分片确实是必要的(罕见)
建筑见证
Startup SaaS (50k 用户)
_ 我们一开始就使用了 100% 的 Supabase。当用户达到 5k 时,我们仅为 Stripe 计费和月度报表添加了 Spring Boot。一年后,我们 80% 的操作仍然通过 Supabase 进行。Spring Boot 仅处理关键部分。这种分离使我们能够在不进行重构的情况下进行扩展。 _
E-learning 平台 (10k 用户)
_ Supabase 的 OAuth2 认证为我们节省了三周的开发时间。自动生成的 API 管理着我们全部的课程目录。Spring Boot 仅用于 PDF 证书和进度邮件。架构简单、易于维护且可扩展。 _
B2B 市场(3k 用户)
_ Spring Boot 处理买家和卖家之间的交易(关键)。Supabase 处理其余部分:资料、实时消息、文档。他们共享同一 PostgreSQL 数据库避免了复杂的同步。这是我们做出的最佳架构选择。 _
综合:现代建筑范式
Supabase + Spring Boot 混合架构代表了一种新范式:建筑专业方向.
@startuml
skinparam backgroundColor #FEFEFE
rectangle "旧范式" #LightCoral {
card "后端的所有内容" {
[Auth]
[CRUD]
[Logique Métier]
[Jobs]
[Storage]
[Realtime]
}
note bottom
自第 1 天起的最大复杂度
end note
}
rectangle "新范式" #LightGreen {
card "Supabase\n(Commodité)" {
[Auth]
[CRUD Simple]
[Storage]
[Realtime]
}
card "Spring Boot\n(Différenciation)" {
[Logique Métier]
[Jobs]
[Intégrations]
}
note bottom
渐进式复杂度
仅在必要时添加
end note
}
[Ancien Paradigme] -right-> [Nouveau Paradigme] : Évolution
@enduml
基本原则:不要构建已以服务形式存在的东西。专注于使您的应用与众不同的地方。
80/20 法则
在大多数应用程序中:
-
80% 的操作是标准的 CRUD → Supabase
-
20% 的运营需要业务逻辑 → Spring Boot
这一自然规则证明了混合架构的合理性。
@startuml
skinparam backgroundColor #FEFEFE
package "操作分布" {
rectangle "80% - 标准操作" #LightGreen {
[Lecture de données]
[Création d'entités]
[Mise à jour simple]
[Suppression]
[Upload fichiers]
[Authentification]
note bottom: 由 Supabase 管理
}
rectangle "20% - 业务逻辑" #Coral {
[Calculs complexes]
[Workflows multi-étapes]
[Transactions critiques]
[Intégrations tierces]
[Jobs planifiés]
note bottom: 由 Spring Boot 管理
}
}
note right
**最佳聚焦:**
您的开发时间
专注于使您的产品脱颖而出的20%
end note
@enduml
最终结论
混合架构不是技术妥协,而是一种战略决策.
它可以让您:
-
✅ 快速启动一个功能完整的MVP
-
✅ 在无需大量投资的情况下验证您的市场
-
✅ 在复杂度需要时逐步演进
-
✅ 掌控每一步的成本
-
✅ 利用每种技术的最佳之处
-
✅ 避免过早的过度设计
-
✅ 保持灵活性以备将来
她表示:
-
🎯实用主义: 她擅长的每一项技术
-
🚀速度: 上市时间最短
-
💰经济: 与价值相匹配的成本
-
🔮可扩展性与您共成长的架构
-
🛡️鲁棒性: 经过验证且可靠的服务
您的下一步
如果这种架构对你有共鸣,这里就是开始的地方:
-
创建一个 Supabase 账户(免费)
-
定义您的最小数据模式
-
配置 OAuth2 身份验证
-
创建您的第一个JBake页面,使用API
-
在 GitHub Pages 上部署
您将拥有一个功能完善的 MVP 在几天.
Spring Boot 将在您需要时自然到来。在此之前不会。
混合架构,就是在需要的时候恰好构建所需的东西的艺术。
祝开发顺利!🚀
如果你认为这篇文章能帮助其他开发者做出正确的架构选择,请分享这篇文章。
相关文章
31 May 2026
14 May 2026
12 May 2026