核心概念
作者:唐亚峰 | battcn
字数统计:1.1k 字
学习目标
理解 SaaS、多租户、微服务等核心概念,为后续深入学习打下基础
什么是 SaaS?
SaaS(Software as a Service) 即软件即服务,是一种通过互联网提供软件的模式。
传统软件 vs SaaS
| 对比项 | 传统软件 | SaaS 软件 |
|---|---|---|
| 部署方式 | 本地安装 | 云端部署 |
| 维护成本 | 用户自行维护 | 服务商维护 |
| 更新升级 | 手动升级 | 自动更新 |
| 付费模式 | 一次性购买 | 订阅制 |
| 访问方式 | 限定设备 | 任意设备 |
SaaS 的优势
┌─────────────────────────────────────────────────────────┐
│ SaaS 架构优势 │
├─────────────────────────────────────────────────────────┤
│ 💰 降低成本 │ 无需购买硬件,按需付费 │
│ 🚀 快速部署 │ 开箱即用,无需安装配置 │
│ 🔄 持续更新 │ 自动获取最新功能 │
│ 📱 多端访问 │ 支持 PC、手机、平板等设备 │
│ 🔒 数据安全 │ 专业团队保障数据安全 │
│ 📈 弹性扩展 │ 根据业务需求灵活扩容 │
└─────────────────────────────────────────────────────────┘什么是多租户?
多租户(Multi-Tenant) 是 SaaS 的核心架构模式,让多个租户(客户)共享同一套应用程序,同时保证数据隔离。
租户隔离策略
Wemirr Platform 支持三种租户隔离策略:
1. 字段隔离(推荐入门使用)
┌────────────────────────────────────────┐
│ 共享数据库 │
├────────────────────────────────────────┤
│ ID │ tenant_id │ name │ data │
│ 1 │ A │ 张三 │ ... │
│ 2 │ A │ 李四 │ ... │
│ 3 │ B │ 王五 │ ... │
│ 4 │ B │ 赵六 │ ... │
└────────────────────────────────────────┘
通过 tenant_id 字段区分不同租户数据优点: 简单、成本低、易维护
缺点: 大租户可能影响小租户性能
适用: 中小型租户,年订单量 < 200W
2. Schema 隔离
┌─────────────────────────────────────────┐
│ 共享数据库实例 │
├─────────────┬─────────────┬─────────────┤
│ Schema_A │ Schema_B │ Schema_C │
│ ├─ users │ ├─ users │ ├─ users │
│ ├─ orders │ ├─ orders │ ├─ orders │
│ └─ ... │ └─ ... │ └─ ... │
└─────────────┴─────────────┴─────────────┘
每个租户独立 Schema,物理隔离表优点: 隔离性好、便于备份恢复
缺点: 租户数量受限、跨租户查询复杂
适用: 中型租户,需要较好隔离性
3. 数据源隔离
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Database_A │ │ Database_B │ │ Database_C │
│ (租户 A) │ │ (租户 B) │ │ (租户 C) │
│ ├─ users │ │ ├─ users │ │ ├─ users │
│ ├─ orders │ │ ├─ orders │ │ ├─ orders │
│ └─ ... │ │ └─ ... │ │ └─ ... │
└─────────────┘ └─────────────┘ └─────────────┘
每个租户完全独立的数据库优点: 完全隔离、性能最优、便于定制
缺点: 成本高、运维复杂
适用: 大型租户,年订单量 > 200W
如何选择?
| 场景 | 推荐方案 |
|---|---|
| 初创企业,快速验证 | 字段隔离 |
| 中型企业,平衡成本与隔离 | Schema 隔离 |
| 大型企业,高安全要求 | 数据源隔离 |
| 混合场景 | 组合策略 |
微服务架构
Wemirr Platform 采用 Spring Cloud 微服务架构:
┌─────────────┐
│ Nginx │
│ (负载均衡) │
└──────┬──────┘
│
┌──────▼──────┐
│ Gateway │
│ (API网关) │
└──────┬──────┘
│
┌─────────────────┼─────────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ IAM │ │ Suite │ │ Plugin │
│ (认证) │ │ (业务) │ │ (插件) │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
└─────────────────┼─────────────────┘
│
┌────────────┼────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ Nacos │ │ Redis │ │ MySQL │
│(注册中心)│ │ (缓存) │ │(数据库) │
└─────────┘ └─────────┘ └─────────┘核心服务说明
| 服务 | 端口 | 职责 |
|---|---|---|
| Gateway | 9000 | 统一入口、路由转发、限流、鉴权 |
| IAM | 5001 | 用户认证、授权、租户管理 |
| Suite | 5002 | 核心业务功能 |
| Plugin | 按需 | 可插拔的扩展模块 |
RBAC 权限模型
RBAC(Role-Based Access Control) 基于角色的访问控制:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 用户 │─────▶│ 角色 │─────▶│ 权限 │
│ (User) │ 1:N │ (Role) │ N:M │(Permission)│
└─────────┘ └─────────┘ └─────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ 菜单 │ │ 按钮 │ │ 数据 │
│ (Menu) │ │(Button) │ │ (Data) │
└─────────┘ └─────────┘ └─────────┘权限层级
- 菜单权限 - 控制用户能看到哪些菜单
- 按钮权限 - 控制用户能操作哪些按钮
- 数据权限 - 控制用户能访问哪些数据(本人、本部门、全部等)
技术栈一览
后端技术栈
| 技术 | 版本 | 说明 |
|---|---|---|
| JDK | 21 | 来自 wemirr-platform-dependencies/pom.xml(java.version) |
| Spring Boot | 3.5.7 | 来自 wemirr-platform-dependencies/pom.xml(spring-boot.version) |
| Spring Cloud | 2025.0.0 | 来自 wemirr-platform-dependencies/pom.xml(spring-cloud.version) |
| Spring Cloud Alibaba | 2025.0.0.0 | 来自 wemirr-platform-dependencies/pom.xml(spring-cloud-alibaba.version) |
| Sa-Token | 1.44.0 | 来自 wemirr-platform-dependencies/pom.xml(sa-token.version) |
| MyBatis-Plus | 3.5.15 | 来自 wemirr-platform-dependencies/pom.xml(mybatis-plus.version) |
| MySQL(运行环境) | 8.0.19 | 来自 附件/docker/docker-compose.yml(mysql:8.0.19) |
| Redis(运行环境) | 5.0 | 来自 附件/docker/docker-compose.yml(redis:5.0) |
| Nacos(运行环境) | 2.4.2 | 来自 附件/docker/docker-compose.yml(nacos/nacos-server:2.4.2) |
前端技术栈
| 技术 | 版本 | 说明 |
|---|---|---|
| Vben Admin(Monorepo) | 5.5.9 | 来自 wemirr-platform-ui/package.json(version) |
| Vue | 3.5.24 | 来自 wemirr-platform-ui/pnpm-lock.yaml(catalog: vue) |
| TypeScript | 5.9.3 | 来自 wemirr-platform-ui/pnpm-lock.yaml(catalog: typescript) |
| Ant Design Vue | 4.2.6 | 来自 wemirr-platform-ui/pnpm-workspace.yaml + pnpm-lock.yaml(catalog: ant-design-vue) |
| Vite | 7.2.2 | 来自 wemirr-platform-ui/pnpm-workspace.yaml + pnpm-lock.yaml(catalog: vite) |
| Pinia | 3.0.3 | 来自 wemirr-platform-ui/pnpm-workspace.yaml + pnpm-lock.yaml(catalog: pinia) |
版本说明
为避免“文档版本”和“项目实际依赖”不一致,上述版本来自本地源码:
- 后端:
wemirr-platform-dependencies/pom.xml - 前端:
wemirr-platform-ui/pnpm-workspace.yaml与wemirr-platform-ui/pnpm-lock.yaml
