1. 概述

根据不同用户的请求,选择不同的数据源,不同的数据源可以是Oracle、MySQL或者其它。用到的技术栈,没有什么复杂的技术,可以看到,依赖也就加了几个而已,如下:

2. 先睹为快

如下图,header中tenant为zhangsan,则使用db_oauth为数据源,tenant为lisi,则使用db_test为数据源,tenant为wangwu,则使用db_jxc为数据源。不同的数据源可以是不同的数据库类型,这里为了演示统一使用了MySQL,用不同的库作为不同的数据源。

3. 实现原理

3.1 先看一下入口这个controller,一个很正常的controller.

3.2 跟进service层,看一下这个bookService,一个正常的不能再正常的service.

3.3 跟进dao层,看一下这个bookDao

一个正常…似乎有些不正常的dao,主要是这里的这个jdbcTemplate,不是像以前一样直接通过@Resource注入进来的,而是通过父类的getJdbcTemplate方法获取的,下一步进到这个方法里边看个究竟。

3.4 动态获取jdbcTemplate

这里注入了一个datasourceProvider,首先从request的header中获取租户的标志,然后通过datasourceProvider的selectDataSource方法获取数据源。

3.5 继续跟进

这里通过一个map存储着所有的数据源,如果没有初始化,就将所有的数据源初始化完毕,然后放到这个map中,在使用的时候,通过租户标志从map中获取。也可以改成懒加载的模式,即下边注释的代码,在需要的时候才进行数据源的初始化,然后放到map中,供以后使用。

3.6 Keep Going~

进去看一下这个map里边put的是什么东西。首先从租户数据源配置表中获取所有的配置,然后对这些数据源进行一个个的初始化。getDataSouce方法中,也对数据源进行了一个map的映射,先放到一个容器中,如果初始化过了,直接拿出来使用即可。

3.7 这里才是真正的数据源初始化的地方,这里使用了druid,传统的生成方式而已,没有什么特别的地方。

3.8 需要注意的是,在系统启动的时候,需要指定一个默认的数据源,这个数据源中存放着租户的配置信息。

4. 附赠一张租户表

springboot多租户设计的更多相关文章

  1. 多租户概念以及FreeLink多租户设计思想

    多租户实现思想 多租户技术的实现重点,在于不同租户间应用程序环境的隔离(application context isolation)以及数据的隔离(data isolation),以维持不同租户间应用 ...

  2. Springboot项目架构设计

    导航 前言 流水线 架构的艺术 项目架构 理解阿里应用分层架构 superblog项目架构 结语 参考 本节是<Spring Boot 实战纪实>的第7篇,感谢您的阅读,预计阅读时长3mi ...

  3. SpringBoot 通用Error设计

    在项目中需要设计统一的错误消息,通常使用枚举类定义"错误码"与"错误消息": 并且也可以做错误消息自定义. 定义通过错误接口类:CommonError publ ...

  4. SaaS模式应用之多租户系统开发(单数据库多Schema设计)

    SaaS是Software-as-a-Service(软件即服务)的简称,这边具体的解释不介绍. 多租户的系统可以应用这种模式的思想,将思想融入到系统的设计之中. 一.多租户的系统,目前在数据库存储上 ...

  5. ABP框架 - 多租户

    文档目录 本节内容: 什么是多租户 多部署 - 多数据库 单部署 - 多数据库 单部署 - 单数据库 单部署 - 混数据库 多部署 - 单/多/混 数据库 ABP中的多租户 启用多租户 宿主与租户 会 ...

  6. ABP理论学习之多租户

    返回总目录 本篇目录 什么是多租户 ABP中的多租户 什么是多租户 维基百科:"软件多租户是指一种软件架构,在这种软件架构中,软件的一个实例运行在服务器上并且为多个租户服务".一个 ...

  7. springboot入门_helloworld

    开始学习springboot,在此做记录,有不正确之处,还望读者指正. springboot框架的设计目的是用来简化新Spring应用的初始环境搭建以及开发过程.主要体现有:1 xml配置文件,使用s ...

  8. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  9. SpringBoot之旅第六篇-启动原理及自定义starter

    一.引言 SpringBoot的一大优势就是Starter,由于SpringBoot有很多开箱即用的Starter依赖,使得我们开发变得简单,我们不需要过多的关注框架的配置. 在日常开发中,我们也会自 ...

随机推荐

  1. php代码在模板页的活用

  2. some daily

    1. 一般div元素的background-color只覆盖到border,而其margin的颜色由外层元素的背景色决定. 2. 当设置了border-box以后,width=border+paddi ...

  3. Linxu 用户和用户组管理1

    Linux 系统是一个多用户任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后 以这个账号的身份进入系统. 用户的账号一方面可以帮助系统管理员对使用系统的用户进 ...

  4. Microsoft.SQL.Server2012.Performance.Tuning.Cookbook学习笔记(一)

    一.Creating a trace or workload 注意点: In the Trace Properties dialog box, there is a checkbox option i ...

  5. mapping数据列表

  6. Timer更新UI的合理办法

    using System; using System.Windows; using System.Timers; using System.Windows.Threading; namespace T ...

  7. 什么是HOOK技术

    https://zhidao.baidu.com/question/50557962.html HOOK技术是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息 ...

  8. 学习java注意的地方

    Java语言拼写上严格区分大小写: 一个Java源文件里可以定义多个Java类,但其中最多只能有一个类被定义成public类: 若源文件中包括了public类,源文件必须和该public类同名: 一个 ...

  9. java super关键字和调用父类构造方法

    表示父类对象的默认引用 如果子类要调用父类被覆盖的实例方法,可用super作为调用者调用父类被覆盖的实例方法. 使用super调用父类方法 使用super调用父类的构造方法 调用构造方法 本类中调用另 ...

  10. linux下svn清除非版本控制文件的方法

    使用svn status命令,文件名前面显示问好的就是非版本控制的文件