多租户体系实现

文章目录

  • 核心思路
    • 方案选择
    • 设计考量
      • 安全性
      • 扩展性
      • 通用性
      • 易用性
  • 具体实现
    • 租户信息透传
      • 透传变量名命名规范
      • 应用内透传
      • 应用间透传
    • 数据层租户隔离
      • MySQL存储方案:多租户Mybatis插件
        • Mybatis插件特点
        • 使用多租户Mybatis插件的优势
        • 参考文档
  • 应用场景

经过工作中的一处场景启发,我进行了深入学习并总结出本篇文章。

核心思路

方案选择

多租户模型基本有以下三种(具体可以见这里),第一种形式隔离做的最彻底(isolated),多租户之间只在硬件层面进行共享;第三种形式共享做的最彻底(shared),在硬件、应用和DB层面都做到了共享。
多租户应用
一个应用要多租户化,选择何种形式,需要考虑具体的业务场景,同时也要考虑投入产出比,不同的形式投入成本不同,可以参考下面的图。上面的三种形式最左边可以认为是isolated approach,最右边是shared approach,第二种介于中间。越靠右的方式从初期来看投入成本更高,但从长久来看投入成本会更低。
在这里插入图片描述

设计考量

框架层面考量,如果从单纯项目实现层面也需要思考这些方面

安全性

对于一个多租户应用来说,任何业务处理、数据读写都需要有明确的租户上下文,这涉及到方方面面:

  • 当前用户是否有特定租户的权限?
  • 当前的web请求、RPC服务调用、任务启动、消息处理是否有特定的租户?
  • 当前的数据读写是否有明确的租户参数?

一旦发现没有权限、没有租户的程序在执行,保护机制及时进行检验、发现并予以熔断报错。

扩展性

不同的租户,往往会有不同程度的差异,差异可能来自:

  • 业务逻辑
  • 数据模型

通用性

不同的租户有不同的需求和配置。如果多租户系统不能适应不同租户的需求,那么它就无法满足市场需求,也无法提供一致且可靠的服务。多租户的实现需要一次很好的抽象,系统化的思考和沉淀,把通用性做的好将极大发挥价值。

易用性

很多框架的建设因为太重最后被人放弃,多租户框架想走轻量级路线,以达到非常容易使用的目的。这要考虑很多的设计模式,比如让springboot红于一时的“约定胜于配置”(Convention Over Configuration),让使用者在80%的场景下使用起来非常简单,不用关心配置。多租户框架也可以做成一个jar包,要多租户化的应用只要引入即可。

具体实现

租户信息透传

专指各个代码执行链路上,租户信息的传递。为什么采用透传,而不是通过修改原有的函数签名,使用参数传递的方式完成租户信息传递?答案是显而易见的,租户隔离是面向整套系统的解决方案,全局的方法签名修改意味着巨大的改造成本。
租户信息透传就意味着需要封装一个全局的上下文对象,这个对象中需要包含应用需要用到的所有租户相关的必要信息,举例可以将这个对象命名为Context。同时国际化技术方案也有着同样的透传变量需求,再加上国际化相关的租户变量,Context中的变量及其命名规范如下。

透传变量名命名规范

变量 \ 作用域cookieheader(请求头)应用内
租户标识ak_regionRegionregion
租户ID\Region-IdregionId
租户名\Region-NameregionName
语言ak_user_localeUser-Localelocale
时区ak_user_timezoneUser-Timezonetimezone
用户工号ak_user_staff_idUser-Staff-IdstaffId

要实现全链路的租户信息透传,就要解决各种各样的情形下,租户变量的传递问题。全链路租户信息透传,又分为应用内透传应用间透传

应用内透传

各自的应用有自己的上下文,也就是登陆态session,可以将租户的信息保存在应用上下文中。那么如果启用异步任务,其中需要上下文信息怎么办。
java应用中,参考trace类型应用的方案,采用ThreadLocal保存租户信息。为了防止异步线程丢失租户信息,我们封装了统一的线程池工具类,对jdk提供的原生线程池进行了封装,增加了租户信息透传特性。这里大致实现方式可以看我这一篇文章。

应用间透传

对于应用间的http接口调用,在client端,我们可以封装统一的http client,将Context中的内容放到请求的header中;在server端,我们提供了实现java-servlet-api标准的filter,实现从请求头中提取Context变量的功能。

对于各种消息中间件,如Kafka,RocketMQ等,也可以制定了租户变量透传的标准,以保证消息链路租户信息的完整。
流程

数据层租户隔离

由于我们采用的是上文所说的“共享应用程序、共享数据库”的多租户模型,数据层的租户隔离是整个租户隔离技术体系中最重要的一环。对于每种数据源,我们需要向其schema中增加一个租户标识符,并在对该数据源的所有读写中,增加租户标识符的过滤。
对于MySQL这种存储介质,我们需要向每张表和视图中添加一个租户ID字段,并重写每一个SQL查询,向原有的过滤条件中增加租户ID的过滤,限制每一行数据只能被其所属的租户访问到,以保证数据安全性。

MySQL存储方案:多租户Mybatis插件

Mybatis插件特点

Mybatis插件支持拦截所有提交到dao层的SQL,并支持对提交的SQL进行改写,原理类似于Spring的Interceptor。
多租户Mybatis插件可以在运行时,动态获取到应用上下文中的租户变量,在执行查询时自动将region_id的筛选附加到SELCT语句的WHERE条件中;在执行写操作时,自动将region_id插入到数据表中。
在这里插入图片描述

使用多租户Mybatis插件的优势
  • 使用Mybatis插件进行数据层租户隔离,可以大大降低业务代码在租户改造过程中的开发成本。
  • 下面是使用Mybatis插件进行数据层隔离,与硬编码方式实现隔离的成本对比
使用Mybatis插件硬编码
mapper文件无需改造所有SQL都需要改造,增加region_id字段
dao接口无需改造所有dao层接口都需要增加region_id参数
service层代码大部分不需要改造所有dao层接口调用,都需要显式传递region_id参数
参考文档

Mybatis插件文档

应用场景

  1. 云计算服务:云服务提供商可以使用多租户体系来向多个客户提供虚拟化资源,如虚拟机、存储和网络。每个客户都有自己的隔离环境,可以独立管理自己的资源,而不会影响其他客户。

  2. 软件即服务(SaaS):SaaS提供商可以使用多租户体系来向多个客户提供相同的应用程序和服务。每个客户都有自己的数据和配置,但共享相同的应用程序代码和基础设施。

  3. 共享经济平台:共享经济平台,如共享办公空间、共享汽车和共享住宿等,可以使用多租户体系来向多个用户提供服务。每个用户都有自己的账户和权限,但共享相同的物理资源。

  4. 物联网设备管理:在物联网环境中,许多设备需要连接到云平台进行管理和监控。使用多租户体系,可以将多个设备的数据隔离开来,确保数据安全和隐私。

  5. 在线游戏:在线游戏可以使用多租户体系来支持多个玩家同时玩游戏。每个玩家都有自己的角色和进度,但共享相同的游戏世界和资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/239417.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLC编程中ST语言操作符的使用方法

ST(Structured Text)语言操作符主要用于PLC编程,主要包括算术运算符、比较运算符和逻辑运算符等。 算术运算符包括加()、减(-)、乘(*)、除(/)和指…

中国1981-2023年逐年每15天8km植被指数数据集

摘要 中国1981-2023年逐年每15天8km植被指数数据集来源于GIMMS NDVI数据,包括了1981年7月-2023年12月的长时间序列逐年每15天植被指数变化,格式为arcgis grid格式,投影为WGS84,其时间分辨率是15天,空间分辨…

什么是云服务器,阿里云优势如何?

阿里云服务器ECS英文全程Elastic Compute Service,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云百科aliyunbai…

C/C++--ProtoBuf使用

一.什么是ProtoBuf 1.序列化和反序列化概念 序列化:把对象转变为字节序列的过程,称为系列化。 反序列化:把字节序列的内容恢复为对象的过程,称为反序列化。 2.什么情况下需要序列化和反序列化 存储数据:将内存中的对象…

Vulnhub靶机:driftingblues 6

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:driftingblues6(10.0.2.22) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entr…

洛谷 P9868 [NOIP2023] 词典

原文链接&#xff1a;NOIP真题第四讲&#xff1a;词典 题目来源&#xff1a;2023 年 NOIP T1 本题考察点&#xff1a;【贪心、枚举、模拟】 前置知识 字典序&#xff1a;指按照a、b、c、...、z的顺序&#xff0c;即a<b<c<...<z&#xff1b; 一、题目及链接 题…

如何用ChatGPT写教案设计?以“沁园春雪”为例

1. 引言 随着人工智能技术的飞速发展&#xff0c;ChatGPT已成为教育领域的一大创新工具。ChatGPT不仅能够模拟人类对话&#xff0c;还可以帮助设计互动丰富、内容丰富的教案。本文将探索如何利用ChatGPT进行教案教学设计&#xff0c;特别是通过“沁园春雪”这一案例&#xff0…

项目压测优化实践思路

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

RuntimeError: CUDA error: device-side assert triggered

授人以鱼不如授人以渔 解决步骤 记录下解决步骤…cuda报错真要人命 首先根据终端的提示 他说让你加这个来定位具体的python代码错哪了&#xff0c;所以咱们就加。 我这里启动命令是&#xff1a; accelerate launch --config_file "utils/acc_configs/accelerate_con…

官方认可!360荣获“科技产业高质量发展突出贡献企业”称号

近日&#xff0c;2023年度朝阳区高质量发展突出贡献企业表彰大会在北京成功召开。会上&#xff0c;朝阳区管委会&#xff08;区科信局&#xff09;对朝阳区做出积极贡献的企业单位进行表彰&#xff0c;360数字安全集团作为数字安全的领导者&#xff0c;在技术能力、研发创新和实…

windows系统下docker软件中使用ubuntu发行版本的linux系统

1.软件下载 官网下载地址 下载安装之后&#xff0c;再去微软商店下载wsl软件&#xff0c;可以直接用&#xff0c;或者也可以使用命令行拉取&#xff08;下面会讲&#xff09; 2.在docker里面创建容器的两种方法 2.1.命令行创建 前言&#xff1a;输入 winr 打开命令行进行下面…

WordPress企业模板

首页大图wordpress外贸企业模板 橙色的wordpress企业模板 演示 https://www.zhanyes.com/waimao/6250.html

i18n多国语言Internationalization的实现

i18n 是"Internationalization”的缩写&#xff0c;这个术语来源于英文单词中首尾字母“”和“n”以及中间的字符数(共计18个字符) 当我们需要开发不同语言版本时&#xff0c;就可以使用i18n多国语言的一个操作处理&#xff0c;i18n主要实现那一方面的内容呢&#xff1f;…

RHCE9学习指南 第19章 网络时间服务器

19.1 时间同步的必要性 对于一些服务来说对时间要求非常严格&#xff0c;例如&#xff0c;图19-1所示由三台服务器搭建的ceph集群。 图19-1 三台机器搭建的集群对时间要求比较高 这三台服务器的时间必须要保持一样&#xff0c;如果不一样&#xff0c;就会显示报警信息。那么…

基于SSM的戏剧推广网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是…

试用清华Chatglm智能体

清华AI平台&#xff0c;感觉在见过的国内AI平台中做的是比较优秀的&#xff0c;目前该平台提供的智能体功能感觉更智能或者说更傻瓜式一些。定义可以定义专属智能体&#xff0c;这些智能体是自己想要的网络上的汇集处理后的信息&#xff0c;或者是绘画或者是编写某个方面的代码…

23111 网络编程 day3

思维导图 tip协作服务 程序如下&#xff1a; #include<myhead.h> #define SER_PORT 69 #define SER_IP "192.168.125.180"int do_upload(int cfd,struct sockaddr_in sin) {//向服务器发送上传请求char buf[512]"";//组装请求数据short *p1(short*…

程序员接私活还不知道这几个平台?那你真的亏了!

程序员接私活现在已经是一个老生常谈的话题了&#xff0c;现在市面上各种程序员接单平台层出不穷&#xff0c;也参差不齐&#xff0c;有比较老牌的知名平台&#xff0c;也有比较好的新兴平台&#xff0c;如此多的平台就容易让人眼花缭乱&#xff0c;不知道该如何选择。 这期文…

推荐系统模型(一) DFN 详解 Deep Feedback Network for Recommendation

背景 在大多数的推荐系统中&#xff0c;往往注重于隐式正反馈(例如&#xff1a;点击)&#xff0c;而忽略掉用户的其他行为(例如大多数CTR模型只考虑用户的喜欢&#xff0c;而忽略了不喜欢)。腾讯在Deep Feedback Network for Recommendation 一文中&#xff0c;提出了一个新颖…

玩转ig之Instagram蓝勾认证教程与条件

蓝勾是 Instagram 用于身份验证的标志&#xff0c;它表明你的账号是真实且唯一的。拥有蓝勾的账号在 Instagram 上更容易引起关注。用户会比较倾向于信任与被认证的账号&#xff0c;因为他们认为这些账号具有更高的权威性和公信力。所以对于品牌来说&#xff0c;想要在 Instagr…