0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于SpringBoot实现多租户架构:支持应用多租户部署和管理

jf_ro2CN3Fa ? 来源:CSDN ? 2023-06-05 10:20 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、概述

1 什么是多租户架构?

多租户架构是指在一个应用中支持多个租户(Tenant)同时访问,每个租户拥有独立的资源和数据,并且彼此之间完全隔离。通俗来说,多租户就是把一个应用按照客户的需求“分割”成多个独立的实例,每个实例互不干扰。

2 多租户架构的优势

更好地满足不同租户的个性化需求。

可以降低运维成本,减少硬件、网络等基础设施的投入。

节约开发成本,通过复用代码,快速上线新的租户实例。

增强了系统的可扩展性和可伸缩性,支持水平扩展,每个租户的数据和资源均可管理和控制。

3 实现多租户架构的技术选择

对于实现多租户架构技术不是最重要的最重要的是正确的架构思路。但是选择正确的技术可以更快地实现多租户架构。

二、设计思路

1 架构选型

基于Java开发多租户应用推荐使用Spring Boot和Spring Cloud。Spring Boot能快速搭建应用并提供许多成熟的插件。Spring Cloud则提供了许多实现微服务架构的工具和组件。

1.1 Spring Boot

使用Spring Boot可以简化项目的搭建过程自动配置许多常见的第三方库和组件,减少了开发人员的工作量。

@RestController
publicclassTenantController{

@GetMapping("/hello")
publicStringhello(@RequestHeader("tenant-id")StringtenantId){
return"Hello,"+tenantId;
}
}

1.2 Spring Cloud

在架构多租户的系统时Spring Cloud会更加有用。Spring Cloud提供了一些成熟的解决方案,如Eureka、Zookeeper、Consul等,以实现服务发现、负载均衡等微服务功能。

2 数据库设计

在多租户环境中数据库必须为每个租户分别存储数据并确保数据隔离。我们通常使用以下两种方式实现:

多个租户共享相同的数据库,每个表中都包含tenant_id这一列,用于区分不同租户的数据。

为每个租户创建单独的数据库,每个数据库内的表结构相同,但数据相互隔离。

3 应用多租户部署

为了实现多租户在应用部署时我们需要考虑以下两个问题。

3.1 应用隔离

在多租户环境中不同租户需要访问不同的资源,因此需要进行应用隔离。可以通过构建独立的容器或虚拟机、使用命名空间等方式实现。Docker就是一种非常流行的隔离容器技术。

3.2 应用配置

由于每个租户都有自己的配置需求因此需要为每个租户分别设置应用配置信息,例如端口号、SSL证书等等。这些配置可以存储在数据库中,也可以存储在云配置中心中。

4 租户管理

在多租户系统中需要能够管理不同租户的数据和资源,同时需要为每个租户分配相应的权限。解决方案通常包括以下两部分。

4.1 租户信息维护

租户信息的维护包括添加、修改、删除、查询等操作,要求能够根据租户名称或租户ID快速查找对应的租户信息。

CREATETABLEtenant(
idBIGINTAUTO_INCREMENTPRIMARYKEY,
nameVARCHAR(50)NOTNULLUNIQUE,
descriptionVARCHAR(255),
created_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,
updated_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP
);

4.2 租户权限控制

在多租户应用中必须为每个租户分别设置对系统资源的访问权限。例如,A租户和B租户不能访问彼此的数据。

@EnableGlobalMethodSecurity(prePostEnabled=true)
@Configuration
publicclassSecurityConfigextendsWebSecurityConfigurerAdapter{

@Override
protectedvoidconfigure(HttpSecurityhttp)throwsException{
http.authorizeRequests()
.antMatchers("/api/tenant/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin();
}

@Autowired
publicvoidconfigureGlobal(AuthenticationManagerBuilderauth)throwsException{
auth.userDetailsService(userDetailsService())
.passwordEncoder(newBCryptPasswordEncoder())
.and()
.inMemoryAuthentication()
.withUser("admin")
.password(newBCryptPasswordEncoder().encode("123456"))
.roles("ADMIN");
}
}

三、技术实现

1 Spring Boot中的多租户实现

在Spring Boot中可以通过多数据源和动态路由来实现多租户机制。

1.1 多数据源实现

多数据源是指为不同的租户配置不同的数据源,使得每个租户都可以访问自己的独立数据。具体实现方法如下:

@Configuration
publicclassDataSourceConfig{
@Bean(name="dataSourceA")
@ConfigurationProperties(prefix="spring.datasource.a")
publicDataSourcedataSourceA(){
returnDataSourceBuilder.create().build();
}

@Bean(name="dataSourceB")
@ConfigurationProperties(prefix="spring.datasource.b")
publicDataSourcedataSourceB(){
returnDataSourceBuilder.create().build();
}

@Bean(name="dataSourceC")
@ConfigurationProperties(prefix="spring.datasource.c")
publicDataSourcedataSourceC(){
returnDataSourceBuilder.create().build();
}
}

以上代码是配置了三个数据源分别对应三个租户。然后在使用时,可以使用注解标记需要连接的数据源。

@Service
publicclassProductService{
@Autowired
@Qualifier("dataSourceA")
privateDataSourcedataSource;

//...
}

1.2 动态路由实现

动态路由是指根据请求的URL或参数动态地切换到对应租户的数据源。具体实现如下:

publicclassDynamicDataSourceextendsAbstractRoutingDataSource{
@Override
protectedObjectdetermineCurrentLookupKey(){
returnTenantContextHolder.getTenantId();
}
}

@Configuration
publicclassDataSourceConfig{
@Bean(name="dataSource")
@ConfigurationProperties(prefix="spring.datasource")
publicDataSourcedataSource(){
returnDataSourceBuilder.create().type(DynamicDataSource.class).build();
}
}

以上是动态路由的核心代码DynamicDataSource继承自AbstractRoutingDataSource,通过determineCurrentLookupKey()方法动态获得租户ID,然后切换到对应的数据源。

2 Spring Cloud中的多租户实现

在Spring Cloud中可以通过服务注册与发现、配置中心、负载均衡等方式实现多租户机制。

2.1 服务注册与发现

使用Spring Cloud中的Eureka实现服务注册与发现。每个租户的服务都在注册中心以不同的应用名称进行注册,客户端可以通过服务名称来访问对应租户的服务。

2.2 配置中心

使用Spring Cloud Config作为配置中心。配置文件以租户ID进行区分,客户端通过读取对应租户的配置文件来获取配置信息。

2.3 负载均衡

使用Spring Cloud Ribbon作为负载均衡器。根据请求的URL或参数选择对应租户的服务实例进行请求转发。

2.4 API

在API网关层面实现多租户机制根据请求的URL或参数判断所属租户,并转发到对应租户的服务实例。

四、 应用场景

1 私有云环境

私有云环境指的是由企业自行搭建的云环境,不对外提供服务,主要应用于企业内部的数据存储、管理、共享和安全控制。相较于公有云,私有云的优点在于可以更好地保护企业核心数据,同时也能够满足企业对于数据安全性和可控性的要求。

2 公有云环境

公有云环境指的是由云服务商搭建并对外提供服务的云环境,用户可以根据需要购买相应的云服务,如云存储、云计算、云数据库等。相较于私有云,公有云的优点在于具有成本低廉、弹性伸缩、全球化部署等特点,能够更好地满足企业快速发展的需求。

3 企业级应用

企业级应用是指面向企业客户的应用程序,主要包括ERP、CRM、OA等一系列应用系统。这类应用的特点在于功能强大、流程复杂、数据量大,需要满足企业的高效率、高可靠性、高安全性和易维护性等要求。在云计算环境下,企业可以将这些应用部署在私有云或公有云上,减少了硬件设备的投入和维护成本,提高了管理效率。

五、实现步骤

1 搭建Spring Boot和Spring Cloud环境

首先需要在Maven项目中引入以下依赖:

 

org.springframework.boot
spring-boot-starter-web


 

org.springframework.cloud
spring-cloud-dependencies
2020.0.3
pom
import

然后需要在application.yml中配置相应的参数,如下所示:

spring:
datasource:
url:jdbc//localhost:3306/appdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username:root
password:123456

mybatis:
type-aliases-package:com.example.demo.model
mapper-locations:classpath:mapper/*.xml

server:
port:8080

eureka:
client:
serviceUrl:
defaultZone:http://localhost:8761/eureka/

management:
endpoints:
web:
exposure:
include:"*"

其中datasource.url为数据库连接的URL,username和password为数据库连接的账号和密码;server.port为Spring Boot应用启动的端口;eureka.client.serviceUrl.defaultZone为Eureka服务注册中心的URL。

2 修改数据库设计

接下来需要对数据库进行相应的修改,以支持多租户部署。具体来说,我们需要在数据库中添加一个与租户相关的字段,以便在应用中区分不同的租户。

3 实现应用多租户部署

接着需要在代码中实现应用的多租户部署功能。具体来说,我们需要为每个租户实例化对应的Spring Bean,并根据租户ID将请求路由到相应的Bean中去处理。

以下是一个简单的实现示例:

@Configuration
publicclassMultiTenantConfig{

//提供对应租户的数据源
@Bean
publicDataSourcedataSource(TenantRegistrytenantRegistry){
returnnewTenantAwareDataSource(tenantRegistry);
}

//多租户Session工厂
@Bean(name="sqlSessionFactory")
publicSqlSessionFactorysqlSessionFactory(DataSourcedataSource)
throwsException{
SqlSessionFactoryBeansessionFactory=newSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
returnsessionFactory.getObject();
}

//动态切换租户
@Bean
publicMultiTenantInterceptormultiTenantInterceptor(TenantResolvertenantResolver){
MultiTenantInterceptorinterceptor=newMultiTenantInterceptor();
interceptor.setTenantResolver(tenantResolver);
returninterceptor;
}

//注册拦截器
@Override
publicvoidaddInterceptors(InterceptorRegistryregistry){
registry.addInterceptor(multiTenantInterceptor());
}

//注册租户信息
@Bean
publicTenantRegistrytenantRegistry(){
returnnewTenantRegistryImpl();
}

//解析租户ID
@Bean
publicTenantResolvertenantResolver(){
returnnewHeaderTenantResolver();
}

}

其中MultiTenantConfig是多租户部署的核心配置类,它提供了对应租户数据源、多租户Session工厂、动态切换租户等功能。

4 实现租户管理

最后需要实现一个租户管理的功能,以便在系统中管理不同的租户。具体来说,我们可以使用Spring Cloud的服务注册与发现组件Eureka来注册每个租户的实例,并在管理界面中进行相应的操作。另外,我们还需要为每个租户提供一个独立的数据库,以保证数据隔离性。

六、小结回顾

本文详细介绍了如何使用Spring Boot和Spring Cloud实现一个支持多租户部署的应用。主要包括搭建Spring Boot和Spring Cloud环境、修改数据库设计、实现应用多租户部署、实现租户管理等方面。

应用场景主要包括SaaS应用、多租户云服务等。优劣势主要体现在提升了应用的可扩展性和可维护性,但也增加了部署和管理的复杂度。未来的改进方向可以考虑进一步提升多租户管理的自动化程度,减少人工干预和错误率。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2989

    浏览量

    111138
  • CRM
    CRM
    +关注

    关注

    1

    文章

    149

    浏览量

    21557
  • URL
    URL
    +关注

    关注

    0

    文章

    141

    浏览量

    15902
  • SSL
    SSL
    +关注

    关注

    0

    文章

    131

    浏览量

    26280
  • 虚拟机
    +关注

    关注

    1

    文章

    966

    浏览量

    29535
  • SpringBoot
    +关注

    关注

    0

    文章

    175

    浏览量

    439

原文标题:基于 SpringBoot 实现多租户架构:支持应用多租户部署和管理

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一主从LORA网关实现农业大棚智慧管理系统方案

    的 LORA 网关架构,能够实现对农业大棚内环境参数、设备运行状态等信息的实时精准采集、传输与管理,助力农业生产迈向智能化、精准化管理。 系统架构
    的头像 发表于 07-14 15:59 ?251次阅读
    一主<b class='flag-5'>多</b>从LORA网关<b class='flag-5'>实现</b>农业大棚智慧<b class='flag-5'>管理</b>系统方案

    模光纤和单模光纤哪个更容易部署

    模光缆通常比单模光缆更容易部署,这主要归因于其在光源、连接技术、安装容错性以及成本等方面的优势。以下是具体分析: 一、光源与连接技术 模光缆: 使用LED或VCSEL(垂直腔面发射激光器)作为
    的头像 发表于 07-08 11:14 ?186次阅读

    开放生态+极简运维:租户园区网络的云原生管理实践

    新一代云化园区网解决方案,创新性地将数据中心级的Spine/Leaf架构以及“全三层”、“云架构”、“超堆叠”、“云漫游”等设计理念应用于园区场景,显著提升网络服务质量和运维水平。面对租户
    的头像 发表于 06-16 16:28 ?516次阅读
    开放生态+极简运维:<b class='flag-5'>多</b><b class='flag-5'>租户</b>园区网络的云原生<b class='flag-5'>管理</b>实践

    如何利用RAKsmart服务器实现高效站点部署方案

    利用RAKsmart服务器实现高效站点部署方案,需结合其网络优势、弹性资源管理和合理的架构设计。以下是分步实施方案,涵盖网络优化、资源分配
    的头像 发表于 05-19 10:38 ?188次阅读

    云电竞服务器 工作原理

    实例,实现硬件资源的按需分配与隔离运行。 资源池化?:CPU、GPU、内存等硬件资源整合为统一资源池,支持租户并行使用 弹性调度?:根据游戏负载自动调整资源配比(如《赛博朋克2077
    的头像 发表于 05-14 07:44 ?252次阅读
    云电竞服务器 工作原理

    云MES系统源码,支持 SaaS 租户支持二次开发

    万界星空科技MES生产制造执行系统源码,有演示,多个项目应用案例,成熟稳定。支持二次开发,商业授权后可商用。
    的头像 发表于 05-07 11:14 ?284次阅读
    云MES系统源码,<b class='flag-5'>支持</b> SaaS <b class='flag-5'>多</b><b class='flag-5'>租户</b>,<b class='flag-5'>支持</b>二次开发

    适用于数据中心和AI时代的800G网络

    数据中心依赖数千甚至上万个GPU集群进行高性能计算,对带宽、延迟和数据交换效率提出极高要求。 AI云:以生成式AI为核心的云平台,为租户环境提供推理服务。这类数据中心要求网络具备高带宽、稳定性
    发表于 03-25 17:35

    在线监测管理系统的智能化功能详解 多角色权限与多项目管理 终端适配

    在线监测管理系统的智能化功能详解 多角色权限与多项目管理 终端适配 在线监测管理系统采用基于BS架构设计,用户可通过浏览器
    的头像 发表于 03-19 17:18 ?402次阅读

    hyper v 安装,hyper v 安装的实用指南,hyper-v批量管理工具的使用指南

    在云计算的租户环境中,不同租户共享物理资源,通过虚拟机实现隔离。为了保障每个租户的服务质量和资源安全,云服务提供商需要对大量虚拟机进行有效
    的头像 发表于 01-24 11:00 ?542次阅读
    hyper v 安装,hyper v 安装的实用指南,hyper-v批量<b class='flag-5'>管理</b>工具的使用指南

    详解MySQL实例部署

    详解MySQL实例部署
    的头像 发表于 11-11 11:10 ?709次阅读

    【「嵌入式Hypervisor:架构、原理与应用」阅读体验】+全文学习心得

    景的需求。同时,嵌入式Hypervisor还支持租户模式,使得嵌入式系统能够更好地支持多样化的应用场景,提高了系统的灵活性和可维护性。 二、高级特性与优化策略 在书籍的中部章节,我学
    发表于 10-09 19:11

    协议移动电源的实现

    电子发烧友网站提供《协议移动电源的实现.pdf》资料免费下载
    发表于 09-30 11:44 ?0次下载
    <b class='flag-5'>多</b>协议移动电源的<b class='flag-5'>实现</b>

    《七剑下天山》之“七剑利刃”:“新一代”漏洞扫描管理系统

    。该平台七个方面功能尤其强大,堪称梁羽生的武侠小说《七剑下天山》之“七剑利刃”: ?日月剑?:租户管理。不同租户间能设置符合各租户自身特点
    的头像 发表于 09-09 11:23 ?685次阅读

    SaaS 租户MES生产车间管理系统源码,生产排程,工艺流程,工序采集

    后端框架:springboot 数 据 库:mysql 移 动 端:uniapp 支持 SaaS 租户,可自定义每个租户的权限,提供透明
    的头像 发表于 08-14 17:31 ?802次阅读
    SaaS <b class='flag-5'>多</b><b class='flag-5'>租户</b>MES生产车间<b class='flag-5'>管理</b>系统源码,生产排程,工艺流程,工序采集