CN113535723A - 一种多租户数据库管控方法、系统及存储介质 - Google Patents
一种多租户数据库管控方法、系统及存储介质 Download PDFInfo
- Publication number
- CN113535723A CN113535723A CN202110789014.6A CN202110789014A CN113535723A CN 113535723 A CN113535723 A CN 113535723A CN 202110789014 A CN202110789014 A CN 202110789014A CN 113535723 A CN113535723 A CN 113535723A
- Authority
- CN
- China
- Prior art keywords
- tenant
- database
- database management
- control
- statement
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2291—User-Defined Types; Storage management thereof
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/252—Integrating or interfacing systems involving database management systems between a Database Management System and a front-end application
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44505—Configuring for program initiating, e.g. using registry, configuration files
- G06F9/4451—User profiles; Roaming
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45562—Creating, deleting, cloning virtual machine instances
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种多租户数据库管控方法、系统及存储介质,方法包括:网络服务模块将租户端的多租户数据库管控请求发送至数据库接入模块,以使数据库接入模块确定多租户数据库管控请求对应的多租户数据库管控语句;MyBatis拦截器对多租户数据库管控语句进行拦截,向租户上下文容器获取租户端的租户ID,并根据预设隔离模式将租户ID添加至多租户数据库管控语句中,以使数据库接入模块根据预设隔离模式,利用完成信息添加的多租户数据库管控语句在租户ID对应的数据库区域执行数据库操作;租户上下文容器中缓存有租户端的租户ID。本发明可采用MyBatis拦截器实现多种隔离级别的用户数据存储隔离,可有效提升SaaS系统的灵活性。
Description
技术领域
本发明涉及网络应用领域,特别涉及一种多租户数据库管控方法、系统及计算机可读存储介质。
背景技术
SaaS(Software-as-a-Service)是一种基于网络应用的软件服务,用户可通过互联网使用SaaS平台服务商所提供的服务。为了达到向不同用户提供不同的软件服务的目的,用户数据存储隔离成为了SaaS系统软件的核心共性需求。
相关技术中,SaaS系统中的用户数据存储隔离功能主要面向特定的数据隔离级别和特定的数据中间件来实现,当需要变更隔离级别或是数据中间件时,则需要对系统框架进行重新开发,这导致现有SaaS系统中的多租户功能存在扩展性及灵活性差的问题。
发明内容
本发明的目的是提供一种多租户数据库管控方法、系统及计算机可读存储介质,可采用MyBatis拦截器实现用户数据存储隔离,在变更隔离级别时仅需变更MyBatis拦截器即可,进而可有效提升SaaS系统中多租户功能的扩展性及灵活性。
为解决上述技术问题,本发明提供一种多租户数据库管控方法,包括:
网络服务模块将租户端的多租户数据库管控请求发送至数据库接入模块,以使所述数据库接入模块确定所述多租户数据库管控请求对应的多租户数据库管控语句;
MyBatis拦截器对所述多租户数据库管控语句进行拦截,向租户上下文容器获取所述租户端的租户ID,并根据预设隔离模式将所述租户ID添加至所述多租户数据库管控语句中,以使所述数据库接入模块根据所述预设隔离模式,利用完成信息添加的多租户数据库管控语句在所述租户ID对应的数据库区域执行数据库操作;所述租户上下文容器中缓存有所述租户端的租户ID。
可选地,所述数据库接入模块根据所述预设隔离模式,利用完成信息添加的多租户数据库管控语句在所述租户ID对应的数据库区域执行数据库操作,包括:
当所述预设隔离模式为完全隔离模式时,所述数据库接入模块利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的目标数据库,并在所述目标数据库中执行所述数据库操作;
当所述预设隔离模式为半隔离模式时,所述数据库接入模块利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的目标数据表,并在所述目标数据表中执行所述数据库操作;
当所述预设隔离模式为完全共享模式时,所述数据库接入模块利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的数据,并对所述数据执行所述数据库操作。
可选地,当所述网络服务模块为微服务时,还包括:
网络服务模块确定所述租户端所需调用的下一级微服务,生成远程调用请求并将所述远程调用请求发送至所述下一级微服务;
链路传参器在拦截到所述远程调用请求时,向所述租户上下文容器获取所述租户ID,并将所述租户ID添加至所述远程调用请求中;
所述链路传参器将完成信息添加的远程调用请求发送至所述下一级微服务。
可选地,在根据预设隔离模式将所述租户ID添加至所述多租户数据库管控语句中之前,还包括:
所述MyBatis拦截器确定所述多租户数据库管控语句所属的多租户数据库管控方法是否配置有多租户指示器注解;
若是,则执行所述根据预设隔离模式将所述租户ID添加至所述多租户数据库管控语句中的步骤。
可选地,还包括:
所述租户上下文容器利用Servlet过滤器获取所述租户端的Servlet请求;
从所述Servlet请求的请求头中获取所述租户ID并存储。
可选地,在网络服务模块将租户端的多租户数据库管控请求发送至数据库接入模块之前,还包括:
Spring容器获取所述网络服务模块的配置文件,并根据所述配置文件中的多租户开关配置项,判断所述网络服务模块是否开启多租户模式;
若是,根据所述配置文件中的路由类型配置所述MyBatis拦截器,并自动载入所述租户上下文容器、所述数据库接入模块及所述网络服务模块;
若否,则自动载入所述数据库接入模块及所述网络服务模块。
可选地,所述根据所述配置文件中的路由类型配置所述MyBatis拦截器,包括:
所述Spring容器根据所述路由类型反射加载对应的路由配置类,并利用所述路由配置类自动配置所述MyBatis拦截器。
本发明还提供一种多租户数据库管控系统,包括:网络服务模块、数据库接入模块、MyBatis拦截器和租户上下文容器,其中,
所述网络服务模块,用于将租户端的多租户数据库管控请求发送至所述数据库接入模块;
所述数据库接入模块,用于确定所述多租户数据库管控请求对应的多租户数据库管控语句;根据所述预设隔离模式,利用完成信息添加的多租户数据库管控语句在所述租户ID对应的数据库区域执行数据库操作;
所述MyBatis拦截器,用于对所述多租户数据库管控语句进行拦截,向租户上下文容器获取所述租户端的租户ID,并根据预设隔离模式将所述租户ID添加至所述多租户数据库管控语句中;
所述租户上下文容器,用于缓存所述租户端的租户ID。
可选地,所述数据库接入模块,还用于当所述预设隔离模式为完全隔离模式时,利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的目标数据库,并在所述目标数据库中执行所述数据库操作;当所述预设隔离模式为半隔离模式时,利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的目标数据表,并在所述目标数据表中执行所述数据库操作;当所述预设隔离模式为完全共享模式时,利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的数据,并对所述数据执行所述数据库操作。
本发明还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上述所述的多租户数据库管控方法。
本发明提供一种多租户数据库管控方法,包括:网络服务模块将租户端的多租户数据库管控请求发送至数据库接入模块,以使所述数据库接入模块确定所述多租户数据库管控请求对应的多租户数据库管控语句;MyBatis拦截器对所述多租户数据库管控语句进行拦截,向租户上下文容器获取所述租户端的租户ID,并根据预设隔离模式将所述租户ID添加至所述多租户数据库管控语句中,以使所述数据库接入模块根据所述预设隔离模式,利用完成信息添加的多租户数据库管控语句在所述租户ID对应的数据库区域执行数据库操作;所述租户上下文容器中缓存有所述租户端的租户ID。
可见,本发明使用MyBatis拦截器进行用户数据存储隔离,该拦截器会对数据库接入模块所需执行的多租户数据库管控语句进行拦截,并向租户上下文容器获取对应的租户ID,随后将租户ID添加至多租户数据库管控语句中,以便数据库接入模块在租户ID对应的数据库区域执行数据库操作。由于各租户ID都具有对应的数据库区域,即租户端的数据能够隔离存储,因此本发明可以采用MyBatis拦截器实现用户数据存储隔离;同时,由于MyBatis拦截器根据预设隔离模式执行将租户ID添加至多租户数据库管控语句的添加步骤,当SaaS系统存在变更隔离级别需求时,仅需变更MyBatis拦截器即可,无需对系统框架进行重新开发,能够有效提升SaaS系统用户数据存储隔离功能的灵活性。本发明还提供一种多租户数据库管控系统及存储介质,具有上述有益效果。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例所提供的一种多租户数据库管控方法的流程图;
图2为本发明实施例所提供的另一种多租户数据库管控方法的流程图;
图3为本发明实施例所提供的多租户数据库管控系统的初始化的流程图;
图4a为本发明实施例所提供的一种多租户数据库管控系统的结构框图;
图4b为本发明实施例所提供的另一种多租户数据库管控系统的结构框图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
相关技术中,SaaS系统中的用户数据存储隔离功能主要面向特定的数据隔离级别和特定的数据中间件来实现,当需要变更隔离级别或是数据中间件时,则需要对系统框架进行重新开发,这导致现有SaaS系统中的多租户功能存在扩展性及灵活性差的问题。有鉴于此,本发明提供一种多租户数据库管控方法,可采用MyBatis拦截器实现用户数据存储隔离,在变更隔离级别时仅需变更MyBatis拦截器即可,进而可有效提升SaaS系统中多租户功能的扩展性及灵活性。请参考图1,图1为本发明所提供的一种多租户数据库管控方法的流程图,该方法可以包括:
S101、网络服务模块将租户端的多租户数据库管控请求发送至数据库接入模块,以使数据库接入模块确定多租户数据库管控请求对应的多租户数据库管控语句。
在本发明实施例中,网络服务模块位于Java网络应用的应用层(Service),即为SaaS系统的核心业务模块,用于响应及处理租户端(即用户端)发送的前端请求,并将前端请求对应的多租户数据库管控请求交由数据库接入模块处理。本发明实施例并不限定网络服务模块的类型,该模块可以为普通的Web应用,也可以为微服务应用,可根据实际应用需求进行设定。本发明实施例也不限定网络服务模块的具体功能,可根据实际应用需求进行设定。
进一步,在本发明实施例中,数据接入模块(Data Access Object,DAO)位于Java网络应用的持久层,负责响应及处理网络服务模块所发送的多租户数据库管控请求,并执行相应的多租户数据库管控语句。本发明实施例并不限定数据接入模块的具体形式,可参考Java Web(Java网络应用)的相关技术。本发明实施例也不限定具体的多租户数据库管控请求,例如可以为数据增加、数据删除、数据修改及数据查询等操作所对应的多租户数据库管控请求,具体也可参考Java Web的相关技术。
进一步,可以理解的是数据接入模块必须执行多租户数据库管控语句(SQL,Structured Query Language)才可在数据库内部执行相关的数据库操作。本发明实施例并不限定具体的多租户数据库管控语句,可参考数据库及Java Web的相关技术。本发明也不限定具体的数据库类型,同样可参考数据库的相关技术。
S102、MyBatis拦截器对多租户数据库管控语句进行拦截,向租户上下文容器获取租户端的租户ID,并根据预设隔离模式将租户ID添加至多租户数据库管控语句中,以使数据库接入模块根据预设隔离模式,利用完成信息添加的多租户数据库管控语句在租户ID对应的数据库区域执行数据库操作;租户上下文容器中缓存有租户端的租户ID。
MyBatis框架为Java网络应用常用的一种持久层框架,而MyBatis拦截器(Interceptor)则为MyBatis框架所提供的一种面向切面的自定义扩展方式,用于对多租户数据库管控操作进行增强,例如在多租户数据库管控语句执行前对其进行修改,以实现某种特定的查询效果;或是在多租户数据库管控语句执行结束后,对数据库的响应结果进行动态修改,其中,多租户数据库管控操作包括数据增加、数据删除、数据修改及数据查询操作。可以理解的是,MyBatis拦截器与数据接入模块均设置在持久层。由于MyBatis拦截器可在多租户数据库管控操作的执行切面上对执行内容进行增强,并不需要修改多租户数据库管控操作在数据接入模块中所对应的原始代码内容,因此本发明实施例可采用MyBatis拦截器实现各种隔离等级的用户数据存储隔离,并且在SaaS系统需要变更隔离等级时,仅需对MyBatis拦截器进行重新配置即可,无需修改多租户数据库管控操作的原始代码内容,更不需要对系统框架进行重新修改。简单来说,本发明实施例可将用户数据存储隔离这一任务交由MyBatis拦截器进行单独处理,能够有效降低系统耦合度,并提升SaaS系统的可扩展性及灵活性。
进一步,本发明实施例并不限定具体的预设隔离模式,例如可以为完全隔离模式、半隔离模式及完全共享模式,其中完全隔离模式表示一个租户使用一个数据库或schema(数据库对象集合),不同数据库之间采用租户ID进行区分;半隔离模式又可称为同库分表模式,即多个租户共享一个数据库或schema,而数据库中的业务表按照租户ID进行分表;完全共享模式表示多个租户共享一个数据库或schema,且用户数据在数据表中已租户ID进行区分。显然,不同的预设隔离模式对应不同的存储颗粒度,且租户数据均采用租户ID进行区分,因此MyBatis拦截器可通过对多租户数据库管控语句进行修改的方式,以不同的存储颗粒度对租户数据进行存储和读取,同时可将租户ID增加至多租户数据库管控语句中,以确保数据库接入模块能够准确读取租户数据。为了提升SaaS系统的可扩展性,在本发明实施例中,MyBatis拦截器可支持以上三种预设隔离模式。需要说明的是,本发明实施例并不限定MyBatis拦截器修改多租户数据库管控语句的具体方式,可参考MyBatis拦截器的相关技术。
进一步,需要说明的是,本发明实施例并不限定MyBatis拦截器能够基于现有的数据库中间件进行开发,例如Mycat、Sharding-jdbc、MyBatis-plus,考虑到Mycat、Sharding-jdbc、MyBatis-plus等均为成熟的数据库中间件,能够快速实现特定的用户数据隔离效果,进而有效节省开发时间,因此在本发明实施例中,MyBatis拦截器可以基于现有的数据库中间件进行开发。当然,为了进一步提升自定义程度,MyBatis拦截器也可根据实际应用需求进行自定义开发。进一步,本发明实施例并不限定各种数据库中间件对应何种预设隔离模式,可根据具体选用的数据库中间件,参考相关技术,例如在一种可能的情况中,可采用Mycat实现完全隔离模式、采用Sharding-jdbc实现半隔离模式、采用MyBatis-plus实现完全共享模式,当然,上述数据库中间件与预设隔离模式的对应关系也可存在其他情况,可根据实际应用需求进行调整。
在一种可能的情况中,数据库接入模块根据预设隔离模式,利用完成信息添加的多租户数据库管控语句在租户ID对应的数据库区域执行数据库操作,可以包括:
步骤11:当预设隔离模式为完全隔离模式时,数据库接入模块利用完成信息添加的多租户数据库管控语句查找租户ID对应的目标数据库,并在目标数据库中执行数据库操作;
步骤12:当预设隔离模式为半隔离模式时,数据库接入模块利用完成信息添加的多租户数据库管控语句查找租户ID对应的目标数据表,并在目标数据表中执行数据库操作;
步骤13:当预设隔离模式为完全共享模式时,数据库接入模块利用完成信息添加的多租户数据库管控语句查找租户ID对应的数据,并对数据执行数据库操作。
进一步,由于在数据库接入模块中,多租户数据库管控语句通常于处理多租户数据库管控请求的多租户数据库管控方法(Method)中,考虑到并非所有多租户数据库管控方法都需要进行多租户增强(即进行用户存储区域隔离),因此可对多租户数据库管控方法进行标记,以确保MyBatis拦截器仅对特定多租户数据库管控方法中的多租户数据库管控语句进行修改。具体的,该标记可以采用Java中的注解机制(Annotation)实现,例如可以为需要进行多租户增强的多租户数据库管控方法标记预设的多租户指示器注解,MyBatis拦截器在拦截到标注有该注解的多租户数据库管控方法时,才会对其中的多租户数据库管控语句进行修改。需要说明的是,本发明实施例并不限定多租户指示器注解的具体形式,具体可参考Java注解的相关技术,并根据实际需求进行设置。
在一种可能的情况中,在根据预设隔离模式将租户ID添加至多租户数据库管控语句中之前,还可以包括:
步骤21:MyBatis拦截器确定多租户数据库管控语句所属的多租户数据库管控方法是否配置有多租户指示器注解;若是,则进入步骤22;若否,则忽略该多租户数据库管控语句;
步骤22:执行根据预设隔离模式将租户ID添加至多租户数据库管控语句中的步骤。
进一步,考虑到数据库接入模块通常会采用两种方式设置多租户数据库管控方法,例如单独编写多租户数据库管控方法,或是将多个多租户数据库管控方法设置于一个接口类中,此时多租户指示器注解既可以标识在方法上,也可以标识在类上。当多租户指示器标注在接口类上时,则表示可对该接口类中的所有方法进行多租户增强;进一步,也可以为多租户指示器注解增加可配置的参数,以对接口类中的特定方法进行增强,或是不对特定方法进行增强,具体的,可以为多租户指示器注解增加一个数组类型的参数tenantAwareMethods,用于表示当前类中哪些方法需要织入租户逻辑语句(即进行多租户增强);也可以增加一个数组类型的参数ignoreMethods,用于表示当前类中哪些方法无须织入租户逻辑语句,特别地,若某一方法名称分别配置在tenantAwareMethods和ignoreMethods数组中,则ignoreMethods优先级更高,即该方法执行过程中不会进行租户逻辑语句的织入。当多租户指示器注解配置有tenantAwareMethods或ignoreMethods,MyBatis拦截器在拦截到配置有注解的方法时,会进一步读取该方法所归属的类的tenantAwareMethods或ignoreMethods配置,并根据该配置确定是否对方法进行多租户增强。进一步,为了方便调试及配置,多租户指示器注解还可包含布尔(Boolean)类型的参数isTenantAware,表示当前类或方法是否需要织入租户逻辑语句(即是否进行多租户增强)。
进一步,在本发明实施例中,MyBatis拦截器需要根据租户的前端请求的上下文信息,从租户上下文容器中获取租户ID,而租户上下文容器中缓存有租户端的租户ID。本发明实施例并不限定租户上下文容器获取租户ID的具体方式,例如可人工将租户ID写入租户上下文容器中,当然该容器也可主动获取租户端所发送的Servlet请求,并从Servlet请求中获取到租户端的租户ID,其中Java网络服务通常基于Servlet容器实现,即租户端通过向网络服务模块发送Servlet请求的方式调用网络服务模块的服务。考虑到租户端数量较多,为了提升租户ID的获取效率,租户上下文容器可通过获取租户端Servlet请求的方式提取到租户ID。
在一种可能的情况中,本方法还可以包括:
步骤31:租户上下文容器利用Servlet过滤器获取租户端的Servlet请求;
在本发明实施例中,Servlet过滤器(TenantAwareHttpRequestFilter)可自动拦截租户端发送的Servlet请求。本发明实施例并不限定Servlet过滤器的具体形式,具体可参考Servlet容器及Servlet容器拦截HTTP请求的相关技术。
步骤32:从Servlet请求的请求头中获取租户ID并存储。
进一步,需要说明的是,本发明实施例并不限定租户上下文容器所基于的类,例如一般情况下可以为ThreadLocal类,也可根据具体情况选用InheritableThreadLocal类,其中ThreadLocal类和InheritableThreadLocal类均为Java的线程类。
进一步,当网络服务模块为微服务时,由于在微服务场景中通常存在跨服务的RPC(Remote Procedure Call,远程调用)调用链(即多个微服务相互调用),网络服务模块可能向下一级微服务发送远程调用请求。为了确保租户ID能够有效传递至下一级微服务,在本发明实施例中,还可设置链路传参器,该链路传参器用于拦截远程调用请求,并根据租户的前端请求的上下文信息,向租户上下文容器获取租户ID,最后将租户ID写入远程调用请求的请求头中,以确保租户ID能够传递至下一级微服务。
在一种可能的情况中,当网络服务模块为微服务时,还包括:
步骤41:网络服务模块确定租户端所需调用的下一级微服务,生成远程调用请求并将远程调用请求发送至下一级微服务;
步骤42:链路传参器在拦截到远程调用请求时,向租户上下文容器获取租户ID,并将租户ID添加至远程调用请求中;
步骤43:链路传参器将完成信息添加的远程调用请求发送至下一级微服务。
需要说明的是,本发明实施例并不限定微服务之间的RPC调用链的实现方式,例如可以采用Spring Cloud Open Feign组件实现RPC调用链时,其中Spring Cloud OpenFeign用于实现微服务间的调用过程。需要说明的是,当Spring Cloud Open Feign设置有Hystrix熔断组件时,链路传参器将无法从基于ThreadLocal的租户上下文容器中获取到租户ID,此时可将租户上下文容器的实现类更换为InheritableThreadLocal类。
最后,需要说明的是,本发明实施例并不限定上述MyBatis拦截器、租户上下文容器、数据库接入模块、网络服务模块及链路传参器这些模块的初始部署方式,例如可以人工部署,也可以将MyBatis拦截器、租户上下文容器、数据库接入模块、网络服务模块及链路传参器设置为Bean,并通过Spring容器自动加载Bean的方式,自动加载上述模块,其中Spring容器为Spring框架的核心,Spring Bean为Spring容器所由实例化、组装和管理的对象。为了提升部署效率,提升开发人员的工作效率,在本发明实施例中,可以将MyBatis拦截器、租户上下文容器、数据库接入模块、网络服务模块及链路传参器设置为Bean,并利用Spring容器实现自动装配。可以理解的是,可以设置专用的配置文件,并将上述模块的配置信息写入该配置文件,以便Spring容器利用该配置文件实现自动装配。进一步,考虑到企业级SaaS应用往往还面临着私有化OP(On-Premise)部署的需求,无需部署多租户功能,换句话说,对于私有化的SaaS应用,仅需设置网络服务模块和数据库接入模块,无需部署MyBatis拦截器、租户上下文容器、网络服务模块及链路传参器等路由模块,因此在一种可能的情况中,还可在配置文件中添加多租户开关配置项,以便Spring容器按需加载。多租户开关配置项同样可利用Java的注解机制进行实现,例如在一种情况中,多租户开关配置项的形式可以为@EnableMultiTenancy。
在一种可能的情况中,在网络服务模块将租户端的多租户数据库管控请求发送至数据库接入模块之前,还可以包括:
步骤51:Spring容器获取网络服务模块的配置文件,并根据配置文件中的多租户开关配置项,判断网络服务模块是否开启多租户模式;若是,则进入步骤52;若否,则进入步骤53;
步骤52:根据配置文件中的路由类型配置MyBatis拦截器,并自动载入租户上下文容器、数据库接入模块及网络服务模块;
当然,若网络服务模块为微服务,此时也可自动载入链路传参器。
步骤53:自动载入数据库接入模块及网络服务模块。
考虑到MyBatis拦截器具有不同的预设隔离模式,为了按需动态加载不同预设隔离模式的MyBatis拦截器,在本发明实施例中,可自定义一个用于配置路由类型的枚举类DataRouterType,该枚举类中包含两个成员变量:路由名称name和路由配置类configurationClass,其中路由名称name可存储于配置文件中,以便Spring容器根据路由名称name加载路由配置类configurationClass,并利用路由配置类实现MyBatis拦截器。在本发明实施例中,枚举类DataRouterType内置提供了Mycat、Sharding-jdbc和MyBatis-plus三种类型的租户路由配置,其在枚举类中的路由名称name字段可直接填写为Mycat、Sharding-jdbc和MyBatis-plus;configurationClass为上述三种路由配置的实现类,Spring容器可直接加载configurationClass来实现MyBatis拦截器。当然,可以在枚举类DataRouterType中设置自定义实现配置类,并设置对应的自定义路由名称,以便Spring容器通过该自定义路由名称加载自定义实现配置类,进而提升SaaS系统的可扩展性。需要说明的是,本发明实施例并不限定Spring容器加载路由配置类的方式,可参考Spring容器的相关技术,例如可通过反射加载的方式加载该路由配置类。
在一种可能的情况中,根据配置文件中的路由类型配置MyBatis拦截器,包括:
步骤61:Spring容器根据路由类型反射加载对应的路由配置类,并利用路由配置类自动配置MyBatis拦截器。
基于上述实施例,本发明使用MyBatis拦截器进行用户数据存储隔离,该拦截器会对数据库接入模块所需执行的多租户数据库管控语句进行拦截,并向租户上下文容器获取对应的租户ID,随后将租户ID添加至多租户数据库管控语句中,以便数据库接入模块在租户ID对应的数据库区域执行数据库操作。由于各租户ID都具有对应的数据库区域,即租户端的数据能够隔离存储,因此本发明可以采用MyBatis拦截器实现用户数据存储隔离;同时,由于MyBatis拦截器根据预设隔离模式执行将租户ID添加至多租户数据库管控语句的添加步骤,当SaaS系统存在变更隔离级别需求时,仅需变更MyBatis拦截器的预设隔离模式即可,无需对系统框架进行重新开发,能够有效提升SaaS系统用户数据存储隔离功能的灵活性。
下面基于具体的流程图介绍上述数据库查找方法。请参考图2,图2为本发明实施例所提供的另一种多租户数据库管控方法的流程图。租户(1~n)向目标工行工程服务或微服务A(即网络服务模块)发送前端请求,该前端请求首先会经过目标工程网关,由目标工程网关进行身份安全验证,并添加租户ID。目标工程服务或微服务A对接收到的前端请求进行业务处理,对于生成多租户数据库管控请求(即数据请求)或是远程调用请求(RPC请求),多租户数据库管控请求将发送至持久层进行数据库操作(即发送至DAO层执行DAO层方法),而RPC请求则发送至下一级微服务(即微服务B);于此同时,租户上下文则利用Servlet过滤器获取到租户ID并缓存。MyBatis拦截器将会拦截DAO层方法,并在确定DAO层方法配置有多租户指示器注解后,向租户上下文获取租户ID并添加至SQL语句中,以便数据接入层利用增强的SQL语句执行数据库操作,进而实现不同隔离等级的租户数据隔离存储。链路传参器在拦截到RPC请求时,也会根据前端请求的上下文信息,到租户上下文容器中获取租户ID,进而将租户ID写入RPC请求的请求头中,实现租户ID在RPC调用链中的持续传递。同样,微服务B也具有目标工程网关、微服务B的具体业务实现模块、链路传参器、租户上下文、DAO层方法、MyBatis拦截器这些组件,此处不再赘述。
下面基于另一个流程图介绍上述系统的初始流程。请参考图3,图3为本发明实施例所提供的多租户数据库管控系统的初始化的流程图。Spring容器自动装配多租户配置类选择器(即配置文件),并判断多租户配置类选择器中的多租户开关是否开启,若否,则仅加载网络服务模块、数据库接入模块等目标工程中的核心业务模块;若是,则进一步从多租户配置类选择器确定路由类型,并继续进行租户上下文容器的初始化,在容器初始化完毕后,则会根据路由类型加载相应的Bean到Spring容器中,最后在进行目标工程其他模块的初始化。
下面对本发明实施例提供的多租户数据库管控系统及计算机可读存储介质进行介绍,下文描述的多租户数据库管控系统及计算机可读存储介质与上文描述的多租户数据库管控可相互对应参照。
请参考图4a,图4a为本发明实施例所提供的一种多租户数据库管控系统的结构框图,包括:网络服务模块401、数据库接入模块402、MyBatis拦截器403和租户上下文容器404,其中,
网络服务模块401,用于将租户端的多租户数据库管控请求发送至数据库接入模块402;
数据库接入模块402,用于确定多租户数据库管控请求对应的多租户数据库管控语句;根据预设隔离模式,利用完成信息添加的多租户数据库管控语句在租户ID对应的数据库区域执行数据库操作;
MyBatis拦截器403,用于对多租户数据库管控语句进行拦截,向租户上下文容器404获取租户端的租户ID,并根据预设隔离模式将租户ID添加至多租户数据库管控语句中;
租户上下文容器404,用于缓存租户端的租户ID。
可选地,数据库接入模块402,还可以用于当预设隔离模式为完全隔离模式时,利用完成信息添加的多租户数据库管控语句查找租户ID对应的目标数据库,并在目标数据库中执行数据库操作;当预设隔离模式为半隔离模式时,利用完成信息添加的多租户数据库管控语句查找租户ID对应的目标数据表,并在目标数据表中执行数据库操作;当预设隔离模式为完全共享模式时,利用完成信息添加的多租户数据库管控语句查找租户ID对应的数据,并对数据执行数据库操作。
可选地,请参考图4b,图4b为本发明实施例所提供的另一种多租户数据库管控系统的结构框图。当网络服务模块401为微服务时,该系统还可以包括:链路传参器405,其中,
网络服务模块401,还可以用于确定租户端所需调用的下一级微服务,生成远程调用请求并将远程调用请求发送至下一级微服务;
链路传参器405,用于在拦截到远程调用请求时,向租户上下文容器404获取租户ID,并将租户ID添加至远程调用请求中;将完成信息添加的远程调用请求发送至下一级微服务。
可选地,MyBatis拦截器403,还可以用于确定多租户数据库管控语句所属的多租户数据库管控方法是否配置有多租户指示器注解;若是,则执行根据预设隔离模式将租户ID添加至多租户数据库管控语句中的步骤。
可选地,租户上下文容器404,还可以用于利用Servlet过滤器获取租户端的Servlet请求;从Servlet请求的请求头中获取租户ID并存储。
可选地,该系统还可以包括:Spring容器,其中,
Spring容器,用于获取网络服务模块401的配置文件,并根据配置文件中的多租户开关配置项,判断网络服务模块401是否开启多租户模式;若是,根据配置文件中的路由类型配置MyBatis拦截器403,并自动载入租户上下文容器404、数据库接入模块402及网络服务模块401;若否,则自动载入数据库接入模块402及网络服务模块401;
可选地,Spring容器,还用于根据路由类型反射加载对应的路由配置类,并利用路由配置类自动配置MyBatis拦截器403。
本发明实施例还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述任意实施例的多租户数据库管控方法的步骤。
由于计算机可读存储介质部分的实施例与多租户数据库管控方法部分的实施例相互对应,因此计算机可读存储介质部分的实施例请参见多租户数据库管控方法部分的实施例的描述,这里暂不赘述。
说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上对本发明所提供的多租户数据库管控方法、系统及计算机可读存储介质进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
Claims (10)
1.一种多租户数据库管控方法,其特征在于,包括:
网络服务模块将租户端的多租户数据库管控请求发送至数据库接入模块,以使所述数据库接入模块确定所述多租户数据库管控请求对应的多租户数据库管控语句;
MyBatis拦截器对所述多租户数据库管控语句进行拦截,向租户上下文容器获取所述租户端的租户ID,并根据预设隔离模式将所述租户ID添加至所述多租户数据库管控语句中,以使所述数据库接入模块根据所述预设隔离模式,利用完成信息添加的多租户数据库管控语句在所述租户ID对应的数据库区域执行数据库操作;所述租户上下文容器中缓存有所述租户端的租户ID。
2.根据权利要求1所述的多租户数据库管控方法,其特征在于,所述数据库接入模块根据所述预设隔离模式,利用完成信息添加的多租户数据库管控语句在所述租户ID对应的数据库区域执行数据库操作,包括:
当所述预设隔离模式为完全隔离模式时,所述数据库接入模块利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的目标数据库,并在所述目标数据库中执行所述数据库操作;
当所述预设隔离模式为半隔离模式时,所述数据库接入模块利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的目标数据表,并在所述目标数据表中执行所述数据库操作;
当所述预设隔离模式为完全共享模式时,所述数据库接入模块利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的数据,并对所述数据执行所述数据库操作。
3.根据权利要求1所述的多租户数据库管控方法,其特征在于,当所述网络服务模块为微服务时,还包括:
网络服务模块确定所述租户端所需调用的下一级微服务,生成远程调用请求并将所述远程调用请求发送至所述下一级微服务;
链路传参器在拦截到所述远程调用请求时,向所述租户上下文容器获取所述租户ID,并将所述租户ID添加至所述远程调用请求中;
所述链路传参器将完成信息添加的远程调用请求发送至所述下一级微服务。
4.根据权利要求1所述的多租户数据库管控方法,其特征在于,在根据预设隔离模式将所述租户ID添加至所述多租户数据库管控语句中之前,还包括:
所述MyBatis拦截器确定所述多租户数据库管控语句所属的多租户数据库管控方法是否配置有多租户指示器注解;
若是,则执行所述根据预设隔离模式将所述租户ID添加至所述多租户数据库管控语句中的步骤。
5.根据权利要求1所述的多租户数据库管控方法,其特征在于,还包括:
所述租户上下文容器利用Servlet过滤器获取所述租户端的Servlet请求;
从所述Servlet请求的请求头中获取所述租户ID并存储。
6.根据权利要求1至5任一项所述的多租户数据库管控方法,其特征在于,在网络服务模块将租户端的多租户数据库管控请求发送至数据库接入模块之前,还包括:
Spring容器获取所述网络服务模块的配置文件,并根据所述配置文件中的多租户开关配置项,判断所述网络服务模块是否开启多租户模式;
若是,根据所述配置文件中的路由类型配置所述MyBatis拦截器,并自动载入所述租户上下文容器、所述数据库接入模块及所述网络服务模块;
若否,则自动载入所述数据库接入模块及所述网络服务模块。
7.根据权利要求6所述的多租户数据库管控方法,其特征在于,所述根据所述配置文件中的路由类型配置所述MyBatis拦截器,包括:
所述Spring容器根据所述路由类型反射加载对应的路由配置类,并利用所述路由配置类自动配置所述MyBatis拦截器。
8.一种多租户数据库管控系统,其特征在于,包括:网络服务模块、数据库接入模块、MyBatis拦截器和租户上下文容器,其中,
所述网络服务模块,用于将租户端的多租户数据库管控请求发送至所述数据库接入模块;
所述数据库接入模块,用于确定所述多租户数据库管控请求对应的多租户数据库管控语句;根据所述预设隔离模式,利用完成信息添加的多租户数据库管控语句在所述租户ID对应的数据库区域执行数据库操作;
所述MyBatis拦截器,用于对所述多租户数据库管控语句进行拦截,向租户上下文容器获取所述租户端的租户ID,并根据预设隔离模式将所述租户ID添加至所述多租户数据库管控语句中;
所述租户上下文容器,用于缓存所述租户端的租户ID。
9.根据权利要求1所述的多租户数据库管控系统,其特征在于,所述数据库接入模块,还用于当所述预设隔离模式为完全隔离模式时,利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的目标数据库,并在所述目标数据库中执行所述数据库操作;当所述预设隔离模式为半隔离模式时,利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的目标数据表,并在所述目标数据表中执行所述数据库操作;当所述预设隔离模式为完全共享模式时,利用所述完成信息添加的多租户数据库管控语句查找所述租户ID对应的数据,并对所述数据执行所述数据库操作。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如权利要求1至7任一项所述的多租户数据库管控方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110789014.6A CN113535723A (zh) | 2021-07-13 | 2021-07-13 | 一种多租户数据库管控方法、系统及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110789014.6A CN113535723A (zh) | 2021-07-13 | 2021-07-13 | 一种多租户数据库管控方法、系统及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113535723A true CN113535723A (zh) | 2021-10-22 |
Family
ID=78098773
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110789014.6A Pending CN113535723A (zh) | 2021-07-13 | 2021-07-13 | 一种多租户数据库管控方法、系统及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113535723A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115391828A (zh) * | 2022-10-31 | 2022-11-25 | 泰豪软件股份有限公司 | 基于微服务架构的多租户平台的数据隔离方法及系统 |
CN115842674A (zh) * | 2022-11-29 | 2023-03-24 | 武汉易久批信息技术有限公司 | 适用于云服务多租户隔离的方法及系统 |
CN116401231A (zh) * | 2023-03-20 | 2023-07-07 | 一临云(深圳)科技有限公司 | 数据源管理方法、设备及存储介质 |
-
2021
- 2021-07-13 CN CN202110789014.6A patent/CN113535723A/zh active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115391828A (zh) * | 2022-10-31 | 2022-11-25 | 泰豪软件股份有限公司 | 基于微服务架构的多租户平台的数据隔离方法及系统 |
CN115842674A (zh) * | 2022-11-29 | 2023-03-24 | 武汉易久批信息技术有限公司 | 适用于云服务多租户隔离的方法及系统 |
CN115842674B (zh) * | 2022-11-29 | 2023-09-26 | 武汉易久批信息技术有限公司 | 适用于云服务多租户隔离的方法及系统 |
CN116401231A (zh) * | 2023-03-20 | 2023-07-07 | 一临云(深圳)科技有限公司 | 数据源管理方法、设备及存储介质 |
CN116401231B (zh) * | 2023-03-20 | 2024-04-26 | 一临云(深圳)科技有限公司 | 数据源管理方法、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113535723A (zh) | 一种多租户数据库管控方法、系统及存储介质 | |
US10564946B1 (en) | Dependency handling in an on-demand network code execution system | |
US10725752B1 (en) | Dependency handling in an on-demand network code execution system | |
US11714675B2 (en) | Virtualization-based transaction handling in an on-demand network code execution system | |
CN107979508B (zh) | 微服务测试方法及装置 | |
US9201644B2 (en) | Distributed update service | |
US20210406090A1 (en) | Methods, systems and apparatus for governance of virtual computing infrastructure resources | |
US9026655B2 (en) | Method and system for load balancing | |
US7757296B2 (en) | Method of managing software components that are integrated into an embedded system | |
EP0817043A2 (en) | Apparatus and method for operating an aggregation of server computers using a dual-role proxy server computer | |
US10318347B1 (en) | Virtualized tasks in an on-demand network code execution system | |
CN112286589A (zh) | 具有动态子包加载的应用容器 | |
US20200036599A1 (en) | Methods, systems and apparatus for custom interface specification in a cloud management system | |
US10866841B2 (en) | Communication system and method for accessing and deploying temporary microservices on a heterogeneous platform | |
CN108255708B (zh) | 测试环境中访问生产文件的方法、装置、存储介质及设备 | |
CN110727589A (zh) | 测试方法、装置及设备 | |
US20210359914A1 (en) | Methods, systems and apparatus for dynamically extending a cloud management system by adding endpoint adapter types | |
KR101618908B1 (ko) | 계약의 구현 및 바인딩에 의한 클라이언트 서비스에의 기능의 제공 | |
EP1782598A1 (en) | Dynamical reconfiguration of distributed composite state machines | |
CN115086166A (zh) | 计算系统、容器网络配置方法及存储介质 | |
CN116805946A (zh) | 一种消息请求处理方法、装置、电子设备及存储介质 | |
CN109408256A (zh) | 应用调用方法和装置 | |
CN112699034A (zh) | 虚拟登录用户构建方法、装置、设备及存储介质 | |
KR102124954B1 (ko) | 이기종 데이터베이스 관리 시스템을 동시 지원하기 위한 IoT 플랫폼 시스템 및 그 동작 방법 | |
CN109597660B (zh) | 应用配置或服务更新方法、装置、存储介质及终端设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |