您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

mybatis数据层的多租户拦截

时间:2019-08-01 10:56:38  来源:  作者:
mybatis数据层的多租户拦截

互联网厂商在进行公有云saas服务部署的时候,往往会面对多租户的场 景,多租户场景的设计,在架构上一般分为二个层次:

1、计算集群的多租户

计算集群的多租户顾名思义,就是针对不同的租户提供单独的服务集群,不同租户之间cpu相互独立,个别租户的流量洪峰不会影响其它租户正常服务。

计算集群的多租户实现有很多种方案,一般做法是,根据不同租户辟出独立集群,对外暴露统一的CDN域名或BGP域名,经流量调度到计算中心内部,由Nginx集群或网关根据URL中的租户参数,向租户所在集群转发请求。

由于多租户的场景的普遍性,最近几年新涌现的新框架和平台在设计伊始就考虑了多租户的场景,并集成了相关技术,比如k8的namespace,结合calico,可以实现非常灵活的多租户计算分组。

2、数据层的多租户

MySQL来举例,数据层的多租户一般有三种做法:

1)一个租户一个数据库

2)一个租户一个schema

3)多个租户同一个schema

其中区别,可以查询相关资料,网上很多,一般Saas服务从成本等因素考虑,大多数采用第3种方案,其主要标志为在元数据设计中,有多租户字段tenant_id。

3、多租户的数据层访问拦截

这里以JAVA+MyBatis来说明。

Mybatis plugin插件支持拦截所有提交到Dao层的SQL,并支持对提交的SQL进行改写,原理类似于Spring的Interceptor,多租户Mybatis插件能够在运行时,动态获取到应用上下文中的租户变量,在执行CRUD操作时,自动将多租户字段(tenant_id)条件附加到sql语句之中,如where条件之后。

1)使用mybatis插件的优点

使用mybatis插件,可以大大简化业务代码在多租户改造过程中的开发成本,对比硬编码方式,mApper和dao层无须改造,service层的代码改造量也可以大大降低。

2)原理

通过mybatis plugin拦截sql处理步骤和result处理步骤。sql预处理,自动增加tenant_id相关语句,result预处理,验证数据tenant_id字段符合要求。包括:

  • insert into,增加写入tenant_id数据
  • select 自动在where之后附加条件tenant_id = ?
  • update 在where之后附加条件tenant_id
  • delete 在where之后附加条件tenant_id
  • left join
  • 子查询

等等。

3)实现方式

插件用的是责任链模式,由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上传递,直到链上的某一个对象决定处理此请求。

具体实现方式为,实现接口Interceptor.java 的3个方法,分别是plugin、intercept和setProperties。

 

mybatis数据层的多租户拦截

 

  • intercept:它将直接覆盖你所拦截的对象,有个参数Invocation对象,通过该对象,可以反射调度原来对象的方法;
  • plugin:target是被拦截的对象,它的作用是给被拦截对象生成一个代理对象;
  • setProperties:允许在plugin元素中配置所需参数,该方法在插件初始化的时候会被调用一次

 

实现类需要添加几个注解,来拦截对应的签名:

 

mybatis数据层的多租户拦截

然后实现Interceptor接口的方法即可,通过Plugin工具类方便生成代理类,通过MetaObject工具类方便操作四大对象的属性,修改对应的值。

 

mybatis数据层的多租户拦截

然后实现Plugin方法,生成代理类的方法是通过MyBatis提供的Plugin工具类,它实现了InvocationHandler接口(JDK动态代理的接口),看看它的2个方法:

 

mybatis数据层的多租户拦截

Plugin提供了静态方法wrap方法,它会根据插件的签名配置,使用JDK动态代理的方法,生成一个代理类,当四大对象执行方法时,会调用Plugin的invoke方法,如果方法包含在声明的签名里,就会调用自定义插件的intercept方法,传入Invocation对象。

最后,插件的初始化时在MyBatis初始化的时候完成的,读入插件节点和配置的参数,使用反射技术生成插件实例,然后调用插件方法中的setProperties方法设置参数,并将插件实例保存到配置对象中.

4、最后分享一下很不错的mybatis多租户插件,当然,你也可以自己实现

https://github.com/Mearalu/mybatis-multi-tenancy



Tags:mybatis   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本篇文章主要介绍了使用MyBatis框架完成数据库的增、删、改、查操作。准备工作运行schema.sql和data.sql脚本文件中的 SQL 语句创建t_user表并添加部分测试数据。schema.sql...【详细内容】
2022-07-15  Tags: mybatis  点击:(0)  评论:(0)  加入收藏
简介MetaObject 是 MyBatis 中的反射工具类,用于获取和设置对象的属性值。示例List<Order> orders = new ArrayList<>(2);orders.add(new Order("1", "001", "美的电压力锅")...【详细内容】
2022-07-06  Tags: mybatis  点击:(18)  评论:(0)  加入收藏
简介SqlRunner,一个非常实用的、用于操作数据库的工具类。该类对JDBC进行了很好的封装,结合SQL工具类,能够很方便地通过Java代码执行SQL语句并检索SQL执行结果。SqlRunner提供...【详细内容】
2022-07-05  Tags: mybatis  点击:(19)  评论:(0)  加入收藏
1. If 语句需求:根据作者名字和博客名字来查询博客!如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名字来查询<!--需求1:根据作者名字和博客名字来查询博客!如果作者名...【详细内容】
2022-06-30  Tags: mybatis  点击:(25)  评论:(0)  加入收藏
在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time、update_time、update_by、create_by等用来维护数据记录的创建时间、修改时间、修改...【详细内容】
2022-06-20  Tags: mybatis  点击:(23)  评论:(0)  加入收藏
Mybatis 是 Java 中一个非常好用的数据库框架,这儿记录一下在使用过程中遇到的坑。官方中文文档地址:http://www.mybatis.org/mybatis-3/zh/getting-started.html1、在Mybatis...【详细内容】
2022-06-20  Tags: mybatis  点击:(34)  评论:(0)  加入收藏
今天介绍一个 MyBatis - Plus 官方发布的神器:mybatis-mate 为 mp 企业级模块,支持分库分表,数据审计、数据敏感词过滤(AC算法),字段加密,字典回写(数据绑定),数据权限,表结构自动生成...【详细内容】
2022-06-17  Tags: mybatis  点击:(43)  评论:(0)  加入收藏
1. Mybatis 存在的痛点我们知道 MyBatis 是一个基于 java 的持久层框架,它内部封装了 jdbc,极大提高了我们的开发效率。但是使用 Mybatis 开发也有很多痛点: 每个 Dao 接口都需...【详细内容】
2022-06-14  Tags: mybatis  点击:(37)  评论:(0)  加入收藏
MybatisPlus是国产的第三方插件, 它封装了许多常用的CURDapi,免去了我们写mapper.xml的重复劳动,这里介绍了基本的整合SpringBoot和基础用法。2|0引入依赖在项目中pom文件引入m...【详细内容】
2022-05-05  Tags: mybatis  点击:(52)  评论:(0)  加入收藏
一、前言我们在日常开发中经常使用ORM框架,比如Mybatis、tk.Mybatis、Mybatis-Plus。不过最广泛的还是Mybatis-Plus,我们的一些表,都会有创建时间、更新时间、创建人、更新人。...【详细内容】
2022-04-24  Tags: mybatis  点击:(172)  评论:(0)  加入收藏
▌简易百科推荐
首先我们来看看以下这两个地址是否可以相互通信呢? 初步一看,貌似可以通信,但是再细看,发现两者的掩码完全不同,故而肯定不能通信了?然而并非如此,如果对两者的通信有更深刻的认识,...【详细内容】
2022-07-15  科技之电脑角    Tags:Ip地址   点击:(1)  评论:(0)  加入收藏
你好,这里是网络技术联盟站。上一节瑞哥花了2000多字图解了DHCP的原理和配置,说到DHCP,那么DNS肯定也要了解一下,今天瑞哥会从DNS的原理、DNS的工作流程、DNS的报文分析等方面给...【详细内容】
2022-07-11  wljslmz    Tags:DNS   点击:(33)  评论:(0)  加入收藏
1.TCP keepalive1.1.概念A keepalive (KA) is a message sent by one device to another to check that the link between the two is operating, or to prevent the link f...【详细内容】
2022-07-08  java小悠    Tags:TCP keepalive   点击:(19)  评论:(0)  加入收藏
当用户访问网站时,在浏览器地址栏中输入域名,就能自动转跳到对应的网站,但其实每个网址背后有一个相应的IP地址,因为要用户记住及输入一串数字比较困难,所以衍生一个叫DNS服务器...【详细内容】
2022-07-08  香港IT人    Tags:DNS   点击:(16)  评论:(0)  加入收藏
今天看了篇这方面的文章介绍得不清不楚,看完了也不知道是怎么回事,后来查了些资料,总算是搞明白了,现在就来分享一下结果。 URI:就是表示一个资源的名字。比如:google.com 仅有资...【详细内容】
2022-07-08  Web技术前沿    Tags:URI   点击:(20)  评论:(0)  加入收藏
描述文件dbc文件:Database CAN,CAN协议的描述文件。文件中关键字含义如下图:dbc文件结构dbc文件格式解析1.版本与新符号version: 版本信息可以为空,也可由用户自定义new symbol:...【详细内容】
2022-07-07  花的kindred    Tags:CAN报文   点击:(39)  评论:(0)  加入收藏
当用户试图通过 HTTP 或文件传输协议 (FTP) 访问平台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码。状态代码记录在 IIS...【详细内容】
2022-07-06  闫少轩    Tags:HTTP TFP   点击:(17)  评论:(0)  加入收藏
Modbus RTU通讯协议在数据通讯上采用主从应答的方式进行。只能由主机(PC,HMI等)通过唯一从机地址发起请求,从机(终端设备)根据主机请求进行响应,即半双工通讯。该协议只允许主机发...【详细内容】
2022-07-06  亿佰特物联网实验室    Tags:Modbus   点击:(22)  评论:(0)  加入收藏
IP 地址是一组数字,用于在连接到网络时识别特定设备。 不同的设备具有唯一的 IP 地址,计算机使用它们通过 Internet 相互交互。但是,当两个或多个设备的 IP 地址相似时,网络无法...【详细内容】
2022-07-04  小麒2020    Tags:IP 地址冲突   点击:(36)  评论:(0)  加入收藏
概述为了确保通信安全和隐私以及应对各种窃听和中间人攻击,越来越多的网络流量被加密,然而,攻击者也可以通过这种方式来隐藏自己的信息和行踪。近期我们捕获了一个样本,此样本...【详细内容】
2022-07-01  北京观成科技    Tags:TCP   点击:(34)  评论:(0)  加入收藏
站内最新
站内热门
站内头条