springboot+MySQL+druid多租户多数据源

在现代的软件开发中,多租户多数据源的需求越来越常见。多租户意味着一个系统可以为多个客户提供服务,而每个客户拥有自己的独立数据源。多数据源则意味着一个系统可以连接多个数据库,每个数据库可能拥有不同的结构和数据。

在本文中,我们将介绍如何使用Spring Boot、MySQL和Druid来实现多租户多数据源的功能。我们将通过一个简单的示例来演示如何配置和使用这些技术。

环境准备

在开始之前,我们需要安装以下软件:

  • JDK 1.8 或以上版本
  • Maven
  • MySQL

创建Spring Boot项目

首先,我们需要创建一个新的Spring Boot项目。可以使用Spring Initializr来快速生成项目的基本结构。请按照以下步骤操作:

  1. 打开Spring Initializr网站(

  2. 在页面上选择"Project"为"Gradle Project","Language"为"Java","Spring Boot"为"2.5.3"。

  3. 在"Group"和"Artifact"字段中输入您自己的值。

  4. 在"Dependencies"字段中,添加以下依赖关系:

    • Spring Data JPA
    • MySQL Driver
    • Druid
    • Thymeleaf(用于创建简单的Web界面)
    • Spring Web(用于创建RESTful API)
  5. 点击"Generate"按钮下载生成的项目。

完成上述步骤后,您将得到一个基本的Spring Boot项目结构。

配置多租户多数据源

首先,我们需要配置多租户的支持。在Spring Boot中,我们可以使用ThreadLocal来保存租户ID,以便在系统的各个地方可以方便地获取和使用。

我们可以创建一个TenantContext类来管理ThreadLocal中的租户ID。请按照以下步骤操作:

  1. 创建一个TenantContext类,并在该类中定义一个静态的ThreadLocal变量和相关的操作方法:
public class TenantContext {
    private static final ThreadLocal<String> CONTEXT = new ThreadLocal<>();

    public static void setTenantId(String tenantId) {
        CONTEXT.set(tenantId);
    }

    public static String getTenantId() {
        return CONTEXT.get();
    }

    public static void clear() {
        CONTEXT.remove();
    }
}
  1. 创建一个TenantInterceptor类来拦截请求,并将请求中的租户ID设置到ThreadLocal中:
public class TenantInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String tenantId = request.getHeader("X-Tenant-Id");
        TenantContext.setTenantId(tenantId);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        TenantContext.clear();
    }
}
  1. 在Spring Boot的配置文件application.properties中配置拦截器:
spring.mvc.interceptors=org.example.TenantInterceptor

现在,我们已经配置好了多租户的支持。接下来,我们需要配置多数据源。

在我们的示例中,我们将使用MySQL作为数据库。我们需要为每个租户创建一个单独的数据库,并在系统中使用对应的数据源进行访问。

我们可以使用Druid来管理多数据源。Druid是一个开源的数据库连接池,它提供了许多强大的特性,如监控、过滤器等。

请按照以下步骤操作:

  1. 创建一个DatabaseConfig类,并在该类中定义多个DataSourceEntityManagerFactory的Bean:
@Configuration
@EnableJpaRepositories(basePackages = "org.example.repository")
public class DatabaseConfig {
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource masterDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource slaveDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, DataSource masterDataSource) {
        return builder.dataSource(masterDataSource).packages("org.example.entity").build();
    }

    @Bean