掌握 SpringBoot 多租户架构,轻松驾驭复杂业务场景

B站影视 2024-11-20 09:41 4

摘要:先来搞清楚,多租户架构的“多租户”到底是啥意思?简单点说就是:在一个系统里支持多个租户同时使用,同样的资源可以隔离开彼此的访问数据和配置。比如我们在一个SaaS平台上,你是卖奶茶的,我是卖炸鸡的,咱俩都能用同一个系统开单,但彼此的数据是隔离的,这就靠多租户架构

今天来聊聊Spring Boot 多租户架构,这个技术看起来高冷,但实际上一旦掌握了,真的能让你在复杂业务场景中如鱼得水。

先来搞清楚,多租户架构的“多租户”到底是啥意思?简单点说就是:在一个系统里支持多个租户同时使用,同样的资源可以隔离开彼此的访问数据和配置。比如我们在一个SaaS平台上,你是卖奶茶的,我是卖炸鸡的,咱俩都能用同一个系统开单,但彼此的数据是隔离的,这就靠多租户架构来实现。

1. 满足个性化需求
不同租户(比如不同企业)对功能的要求不一样。多租户架构支持为每个租户提供特定的配置和功能,比如某租户需要多语言支持,另一个租户需要独立报表统计,完全没问题。

2. 降低运维成本
统一维护一套代码,所有租户都能自动享受新版本带来的功能和优化。这就像升级了个操作系统,大家直接跟着享福利,程序员还省了很多事情。

3. 节约开发成本
传统多系统架构要为每个客户独立开发部署,工作量大得头秃。而多租户直接复用代码,少了重复开发,腰也不酸了。

4. 提升系统可扩展性
多租户架构扩展起来很丝滑。新增一个租户?分分钟的事,不用额外改动主系统。

共享数据库模式:所有租户共用一个数据库,但通过字段(如tenant_id)来区分数据归属。这种模式对小型应用友好。独立数据库模式:每个租户一个独立数据库,数据隔离性更好,但运维成本高。适合大型租户或者对数据隔离要求高的业务。

用 Spring Boot 实现多租户,最常见的手法就是动态切换数据源。这是关键代码示例:

@Configurationpublic class DataSourceConfig { @Bean @Primary public DataSource dataSource { Map targetDataSources = new HashMap; // 添加多个数据源 targetDataSources.put("tenant1", createDataSource("jdbc:mysql://localhost:3306/tenant1")); targetDataSources.put("tenant2", createDataSource("jdbc:mysql://localhost:3306/tenant2")); // 动态路由数据源 AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey { return TenantContext.getCurrentTenant; } }; routingDataSource.setTargetDataSources(targetDataSources); routingDataSource.setDefaultTargetDataSource(createDataSource("jdbc:mysql://localhost:3306/default")); return routingDataSource; } private DataSource createDataSource(String url) { DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create; dataSourceBuilder.url(url); dataSourceBuilder.username("root"); dataSourceBuilder.password("password"); return dataSourceBuilder.build; }}

说明

**AbstractRoutingDataSource**:动态路由的核心。根据当前租户ID动态切换数据源。**TenantContext**:上下文里存储当前租户信息,关键在于如何正确地获取和设置。

在 API 层,通过过滤器或者拦截器获取租户信息,比如从 HTTP 请求头、JWT Token 中解析出 tenant_id,并设置到上下文中。

@Componentpublic class TenantInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String tenantId = request.getHeader("X-Tenant-ID"); if (tenantId != null) { TenantContext.setCurrentTenant(tenantId); } return true; }}

优雅掌握 Spring Boot 多租户架构后,你的复杂业务场景再也不是问题了。这是一门系统化的艺术,而不是堆积代码。最后送一句话:“人生就像多租户架构,分离数据,保留个性,互不打扰。”‍

来源:麻辣小王子

相关推荐