jshERP多租户架构解析:SaaS模式下的资源隔离实现
jshERP多租户架构解析:SaaS模式下的资源隔离实现
【免费下载链接】jshERP华夏ERP基于SpringBoot框架和SaaS模式,立志为中小企业提供开源好用的ERP软件,目前专注进销存+财务功能。主要模块有零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询、系统管理等。支持预付款、收入支出、仓库调拨、组装拆卸、订单等特色功能。拥有库存状况、出入库统计等报表。同时对角色和权限进行了细致全面控制,精确到每个按钮和菜单。项目地址: https://gitcode.com/gh_mirrors/js/jshERP
华夏ERP(jshERP)作为一款基于SpringBoot框架和SaaS模式的开源ERP软件,为中小企业提供了完整的进销存+财务解决方案。其多租户架构设计是支持SaaS模式的核心技术,能够实现不同企业用户之间的数据隔离和资源共享。本文将深入解析jshERP的多租户实现机制,帮助您理解SaaS模式下如何高效管理多个租户的资源。
🔍 什么是多租户架构?
多租户架构是一种软件架构模式,允许多个租户(通常指不同的企业或用户组)共享同一套应用程序实例,同时确保各租户数据的完全隔离。在jshERP中,每个租户都拥有独立的业务数据、配置信息和用户权限,但共享相同的代码库和基础设施。
🏗️ jshERP多租户实现原理
1. 数据库层面设计
jshERP采用共享数据库+共享数据表的模式,通过在每张业务表中添加tenant_id字段来实现数据隔离。这种设计平衡了数据隔离性和系统性能:
核心数据库表结构示例:
-- 租户主表 CREATE TABLE `jsh_tenant` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint DEFAULT NULL COMMENT '用户id', `login_name` varchar(255) DEFAULT NULL COMMENT '登录名', `user_num_limit` int DEFAULT NULL COMMENT '用户数量限制', `type` varchar(1) DEFAULT '0' COMMENT '租户类型,0免费租户,1付费租户', `enabled` bit(1) DEFAULT b'1' COMMENT '启用状态', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `expire_time` datetime DEFAULT NULL COMMENT '到期时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记' ) ENGINE=InnoDB COMMENT='租户表'; -- 业务表都包含tenant_id字段 ALTER TABLE jsh_account ADD tenant_id bigint DEFAULT NULL COMMENT '租户id'; ALTER TABLE jsh_depot ADD tenant_id bigint DEFAULT NULL COMMENT '租户id'; ALTER TABLE jsh_material ADD tenant_id bigint DEFAULT NULL COMMENT '租户id';2. 租户数据隔离机制
在jshERP-boot/src/main/java/com/jsh/erp/config/TenantConfig.java中,jshERP通过MyBatis-Plus的租户处理器实现自动的数据过滤:
public class TenantConfig { @Bean public PaginationInterceptor paginationInterceptor(HttpServletRequest request) { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); TenantSqlParser tenantSqlParser = new TenantSqlParser(); tenantSqlParser.setTenantHandler(new TenantHandler() { @Override public Expression getTenantId() { String token = request.getHeader("X-Access-Token"); Long tenantId = Tools.getTenantIdByToken(token); if (tenantId != 0L) { return new LongValue(tenantId); } else { // 超管用户,返回null不过滤 return null; } } @Override public String getTenantIdColumn() { return "tenant_id"; // 租户ID字段名 } @Override public boolean doTableFilter(String tableName) { // 判断是否需要过滤该表 String token = request.getHeader("X-Access-Token"); Long tenantId = Tools.getTenantIdByToken(token); if (tenantId != 0L) { // 系统表不需要租户过滤 if ("jsh_sequence".equals(tableName) || "jsh_function".equals(tableName) || "jsh_platform_config".equals(tableName) || "jsh_tenant".equals(tableName)) { return true; } else { return false; } } return true; } }); } }3. 租户身份识别
jshERP通过Token机制识别租户身份。在jshERP-boot/src/main/java/com/jsh/erp/utils/Tools.java中,系统从Token中提取租户ID:
public static Long getTenantIdByToken(String token) { Long tenantId = 0L; if(StringUtil.isNotEmpty(token) && token.indexOf("_") > -1) { String[] tokenArr = token.split("_"); if (tokenArr.length == 2) { tenantId = Long.parseLong(tokenArr[1]); } } return tenantId; }📊 租户管理功能详解
租户类型与权限控制
jshERP支持两种租户类型:
- 试用租户(type='0'):免费使用,功能可能受限
- 付费租户(type='1'):付费用户,享受完整功能
租户管理界面
在前端界面jshERP-web/src/views/system/TenantList.vue中,管理员可以:
- 查看所有租户列表
- 新增/编辑租户信息
- 启用/禁用租户
- 设置用户数量限制
- 管理租户到期时间
关键管理功能包括:
- 用户数量限制:控制每个租户的最大用户数
- 租户状态管理:启用/禁用租户账号
- 到期时间控制:设置租户服务有效期
- 备注信息:记录租户相关信息
🔧 技术实现要点
1. 索引优化
为提升查询性能,jshERP在关键业务表上创建了租户ID索引:
CREATE INDEX tenant_id ON jsh_depot_head(tenant_id) USING BTREE; CREATE INDEX tenant_id ON jsh_depot_item(tenant_id) USING BTREE; CREATE INDEX tenant_id ON jsh_material(tenant_id) USING BTREE; CREATE INDEX tenant_id ON jsh_account_head(tenant_id) USING BTREE;2. 数据迁移策略
系统升级时,jshERP提供了完整的数据迁移方案。在docs/数据库更新记录-首次安装请勿使用.txt中,可以看到详细的租户字段添加和索引创建过程。
3. 权限继承机制
用户与租户的关联通过tenant_id字段实现,确保用户只能访问所属租户的数据。同时,角色、仓库、客户等资源的权限也通过tenant_id进行隔离。
🚀 最佳实践建议
1. 租户数据备份策略
建议为每个租户建立独立的数据备份计划,确保数据安全性和恢复能力。
2. 性能监控
定期监控数据库性能,特别是涉及多租户查询的业务表,确保索引有效且查询性能良好。
3. 租户隔离测试
在开发环境中,务必测试不同租户之间的数据隔离性,确保不会出现数据泄露问题。
4. 租户生命周期管理
实现完整的租户生命周期管理,包括:
- 租户注册与初始化
- 租户配置管理
- 租户数据迁移
- 租户停用与数据归档
💡 总结
jshERP的多租户架构设计体现了SaaS模式的核心优势:资源共享、数据隔离、灵活扩展。通过巧妙的数据库设计和中间件拦截机制,实现了高效的多租户管理。这种架构不仅降低了企业的IT成本,还提供了良好的可扩展性,能够支持从小型企业到大型企业的不同规模需求。
对于正在考虑采用SaaS模式的企业级应用开发者,jshERP的多租户实现方案提供了宝贵的参考价值。其简洁而有效的设计思路,值得在实际项目中借鉴和应用。
提示:在实际部署jshERP时,建议根据业务规模选择合适的数据库配置,并定期优化租户相关的查询性能,确保系统在高并发场景下的稳定运行。
【免费下载链接】jshERP华夏ERP基于SpringBoot框架和SaaS模式,立志为中小企业提供开源好用的ERP软件,目前专注进销存+财务功能。主要模块有零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询、系统管理等。支持预付款、收入支出、仓库调拨、组装拆卸、订单等特色功能。拥有库存状况、出入库统计等报表。同时对角色和权限进行了细致全面控制,精确到每个按钮和菜单。项目地址: https://gitcode.com/gh_mirrors/js/jshERP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
