现代建筑的伪二分法

当构建一个带有静态前端的现代应用程序时,我们常常会面临一个二元的选择:

  • 把所有押注押在 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

  • ✅ 在无需大量投资的情况下验证您的市场

  • ✅ 在复杂度需要时逐步演进

  • ✅ 掌控每一步的成本

  • ✅ 利用每种技术的最佳之处

  • ✅ 避免过早的过度设计

  • ✅ 保持灵活性以备将来

她表示:

  • 🎯实用主义: 她擅长的每一项技术

  • 🚀速度: 上市时间最短

  • 💰经济: 与价值相匹配的成本

  • 🔮可扩展性与您共成长的架构

  • 🛡️鲁棒性: 经过验证且可靠的服务

您的下一步

如果这种架构对你有共鸣,这里就是开始的地方:

  1. 创建一个 Supabase 账户(免费)

  2. 定义您的最小数据模式

  3. 配置 OAuth2 身份验证

  4. 创建您的第一个JBake页面,使用API

  5. 在 GitHub Pages 上部署

您将拥有一个功能完善的 MVP 在几天.

Spring Boot 将在您需要时自然到来。在此之前不会。


混合架构,就是在需要的时候恰好构建所需的东西的艺术。

祝开发顺利!🚀


如果你认为这篇文章能帮助其他开发者做出正确的架构选择,请分享这篇文章。

相关文章