基座架构
了解 JSaas 基座平台的整体架构设计、核心组件及其协作方式。
整体架构
JSaas 采用分层化的基座架构,由底座平台统一管理多租户、认证、授权、日志、 消息等通用能力,各业务模块以插件形式接入,实现标准化与灵活性的平衡。
┌─────────────────────────────────────────────────┐ │ JSaas 基座平台 │ ├─────────────────────────────────────────────────┤ │ 统一入口层 (Gateway) │ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ │ 租户路由 │ 负载均衡 │ 限流熔断 │ 协议转换 │ │ │ └──────────┴──────────┴──────────┴──────────┘ │ ├─────────────────────────────────────────────────┤ │ 核心服务层 (Core Services) │ │ ┌────────┬────────┬────────┬────────────────┐ │ │ │ 认证服务 │ 授权服务 │ 租户管理 │ 配置中心 │ │ │ ├────────┼────────┼────────┼────────────────┤ │ │ │ 消息队列 │ 日志追踪 │ 任务调度 │ 文件存储 │ │ │ └────────┴────────┴────────┴────────────────┘ │ ├─────────────────────────────────────────────────┤ │ 模块加载层 (Module Loader) │ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ │ 模块注册 │ 依赖注入 │ 生命周期 │ 版本管理 │ │ │ └──────────┴──────────┴──────────┴──────────┘ │ ├─────────────────────────────────────────────────┤ │ 基础设施层 (Infrastructure) │ │ ┌────────┬────────┬────────┬────────────────┐ │ │ │ MySQL │ Redis │ Nacos │ MinIO │ │ │ └────────┴────────┴────────┴────────────────┘ │ └─────────────────────────────────────────────────┘
基座各层之间通过标准化的 Java SPI 接口通信,模块开发者只需实现规定的接口即可接入平台, 无需关心底层实现细节。
多租户机制
JSaas 支持三种多租户隔离策略,满足不同场景下的数据安全和性能需求:
共享数据库 / 共享 Schema
所有租户共用同一数据库和表结构,通过 tenant_id 字段隔离数据。适合中小规模租户,资源利用率最高。
sql
-- 每条业务数据自动注入租户标识
CREATE TABLE orders (
id BIGINT PRIMARY KEY,
tenant_id VARCHAR(32) NOT NULL, -- 租户隔离字段
order_no VARCHAR(64),
amount DECIMAL(10,2),
INDEX idx_tenant (tenant_id)
);共享数据库 / 独立 Schema
每个租户拥有独立的 Schema,数据隔离性更强,适合对数据安全有较高要求的场景。 基座会根据当前租户自动切换 Schema。
独立数据库
每个租户分配完全独立的数据库实例,物理隔离级别最高,适合金融、医疗等强合规场景。 基座通过动态数据源路由实现无感切换。
权限认证
基座内置统一的认证与授权体系,模块无需重复开发登录和权限功能:
1
JWT Token 认证
基座签发 JWT Token,包含租户ID、用户ID和角色信息,模块通过标准 Filter 拦截校验。
2
RBAC 权限模型
角色-权限-资源的标准化模型,模块只需声明自身资源,权限分配由基座统一管控。
3
单点登录 (SSO)
支持 OAuth 2.0 / SAML 协议,可集成企业已有的身份认证系统。
模块内的 API 接口如需鉴权,只需在 Controller 上添加 @RequireAuth 注解即可,基座会自动完成 Token 校验和权限拦截,无需手动编写鉴权代码。
数据隔离
在代码层面,开发者可以通过注解或 API 轻松实现租户级别的数据隔离:
java
// 方式一:注解声明租户上下文
@TenantAware
@GetMapping("/orders")
public List<Order> listOrders() {
// 基座自动注入当前租户ID,查询结果自动过滤
return orderService.findAll();
}
// 方式二:手动获取租户上下文
String tenantId = TenantContextHolder.getTenantId();
List<Order> orders = orderRepository.findByTenantId(tenantId);