当前位置: 首页 > news >正文

淄博网站建设找卓迅怎么样免费建设网站

淄博网站建设找卓迅,怎么样免费建设网站,网站上传的图片怎么做的清晰度,微信公众号运营前言 别误会,本篇【并不是】 要用mybatis-plus自身的多租户方案:在表中加一个tenant_id字段来区分不同的租户数据。并不是的! 而是在假设业务系统已经使用mybatis-plus多数据源的前提下,如何实现业务数据库隔开的多租户系统。 这…

前言

别误会,本篇【并不是】 要用mybatis-plus自身的多租户方案:在表中加一个tenant_id字段来区分不同的租户数据。并不是的!
而是在假设业务系统已经使用mybatis-plus多数据源的前提下,如何实现业务数据库隔开的多租户系统。
这里面有点绕:多数据源可以是一个系统本身的功能需求,假设当前系统算做是个单租户,它使用了两个数据库: master1和sys1,那么做多租户改造后,假设现在有了2个租户,那么就要添加2个数据库:master2和sys2 , 总共就是四个数据库(数据源)了…
咱们这里简单化处理,假设一个业务系统只使用一个数据库

大纲

在本篇我们可以

  • 看到mybatis-plus底层多数据源的实现原理
  • 在不破坏多数据源的前提下,实现多租户功能
  • spring security结合jwt记录租户信息

代码版本:

springboot: 2.7.0
dynamic-datasource-spring-boot-starter: 4.3.0
io.jsonwebtoken: 0.12.3

回顾mybatis-plus多数据源使用

1.yaml配置:
在这里插入图片描述
2.serviceImpl:
在这里插入图片描述
或者使用切面动态设置crud对应的数据源。

改造需求

  • 不要把所有租户信息都直接放在yaml等配置文件中
  • 可动态的添加删除数据源
  • 用户登录成功后,把租户信息封装到jwt token中,后续业务访问提取中租户信息,动态切换数据源访问

方案

租户本身的信息可放在resources/tenants目录下,一个租户使用一个单独的配置文件,或者通过读取另外的数据库获取。本篇先使用前者。
修改某个租户的配置文件内容/数据库,重启服务/通过controller接口触发数据源的变更。

正篇开始
yaml配置文件中只保留一个主数据库,如上yaml截图所示。
另外的2个租户配置放classpath下tenant目录,如下所示:
在这里插入图片描述
新建多数据源配置类,内容如下:

@Configuration(proxyBeanMethods = false)
@Slf4j
public class MultiDataSourceConfig {@Resourceprivate DruidDataSourceCreator druidDataSourceCreator;@Resourceprivate DynamicRoutingDataSource dataSource;@PostConstructpublic void init() {ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();try {org.springframework.core.io.Resource[] resources = resolver.getResources("classpath:tenants/*.properties");for (org.springframework.core.io.Resource resource : resources) {Properties tenantProperties = new Properties();tenantProperties.load(resource.getInputStream());String tenantId = tenantProperties.getProperty("name");DataSourceProperty dataSourceProperty = new DataSourceProperty();dataSourceProperty.setPoolName(tenantId);dataSourceProperty.setUrl(tenantProperties.getProperty("datasource.url"));dataSourceProperty.setUsername(tenantProperties.getProperty("datasource.username"));dataSourceProperty.setPassword(tenantProperties.getProperty("datasource.password"));dataSourceProperty.setDriverClassName(tenantProperties.getProperty("datasource.driver-class-name"));dataSource.addDataSource(tenantId, druidDataSourceCreator.createDataSource(dataSourceProperty));}} catch (IOException exp) {throw new RuntimeException("Problem in tenant datasource:" + exp);}}
}

上述代码读取classpath:tenants/目录下的所有.properties配置文件内容,组装并添加数据源。

登录

登录操作时,查询此登录用户对应的租户信息,并在生成jwt token时,把租户信息也封装进去,通过http响应头返回给用户。如下所示:

public static void addToken(HttpServletResponse res, String username, String tenant) {String JwtToken = Jwts.builder().subject(username).audience().add(tenant).and().issuedAt(new Date(System.currentTimeMillis())).expiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME)).signWith(SIGNINGKEY).compact();res.addHeader("Authorization", PREFIX + JwtToken);}

业务操作

在一个拦截器类中:token校验,并从中提取出租户信息,如下所示:

public static String getTenant(HttpServletRequest req) {String token = req.getHeader("Authorization");if (token == null) {return null;}String tenant = Jwts.parser().setSigningKey(SIGNINGKEY).build().parseClaimsJws(token.replace(PREFIX, "").trim()).getBody().getAudience().iterator().next();return tenant;}
动态切换数据源

得到一个请求所属租户信息后,要访问数据库时切换源:记住这里
记住它:DynamicDataSourceContextHolder

    DynamicDataSourceContextHolder.push(tenant);try {chain.doFilter(request, response);} finally {DynamicDataSourceContextHolder.clear();}

完工!是的,使用层面上就结束了。接下来是原理分析。

剖析

1.有个类名叫:AbstractRoutingDataSource,mybatis-plus和spring-jdbc都有叫这个名的类,
并且它们都继承了AbstractDataSource类,但是这个父类也只是同名而已。但是它们的功能都说得很清楚:抽象动态获取数据源,它们都有个抽象方法:抽象获取连接池,如下所示:
在这里插入图片描述
spring-jdbc下的源码
在这里插入图片描述
然后看看mybatis-plus的抽象方法实现
在这里插入图片描述
在这里插入图片描述
所以回顾我们业务代码的写法:DynamicDataSourceContextHolder.push(tenant);
正是我们把当前请求对应的tenant作为数据源key 压栈了,后面切换数据源时依据它去得到数据源。那么还记得这个租户key 是在哪里和数据源对应上的吗
正是在正篇开头的新建多数据源配置类中:

dataSource.addDataSource(tenantId, druidDataSourceCreator.createDataSource(dataSourceProperty));
    /*** 添加数据源** @param ds         数据源名称* @param dataSource 数据源*/public synchronized void addDataSource(String ds, DataSource dataSource) {DataSource oldDataSource = dataSourceMap.put(ds, dataSource);// 新数据源添加到分组this.addGroupDataSource(ds, dataSource);// 关闭老的数据源if (oldDataSource != null) {closeDataSource(ds, oldDataSource, graceDestroy);}log.info("dynamic-datasource - add a datasource named [{}] success", ds);}

如此就打通了流程。如果大家感兴趣,可以看到com.baomidou.dynamic.datasource.DynamicRoutingDataSource类中有一些方法删除数据源,还有数据源分组功能,这可以用于主主(从,如果业务场景都是只读的话),策略是轮询和随机:
在这里插入图片描述

http://www.yayakq.cn/news/528293/

相关文章:

  • 建设网站的调研报告平面设计师招聘广告文案
  • 泗水网站建设源码论坛网站需要多大的空间
  • 北京的电商平台网站宁波seo哪家好
  • 公司网站上传图片兰州微信小程序制作公司
  • 潮州 做网站 有钱试用平台网站建设
  • 如何建一个网站泰安手机网站建设电话
  • 在百度做网站推广怎么做互联网中厂有哪些公司
  • 示范校建设专题网站网络推广是以企业产品或服务
  • 电商商城网站开发科技手札
  • 用asp做网站需要安装什么软件国内搜索引擎网站
  • 如何在局域网做网站仓山福州网站建设
  • 颖灵信息科技网站建设怎么制作网址
  • 中医科网站建设素材wordpress 原生相册
  • 如何建设一个好的企业网站百度怎样注册免费的网站
  • 邢台做移动网站公司网站建设更新维护工作
  • 公司网站制作与推广百度搜索智能精选
  • 商业性质网站设计上海百度竞价点击软件
  • 必应搜索网站图片设计用什么软件
  • 正规的培训行业网站开发wordpress网站类型
  • 凉山州规划和建设局网站如何做网站直播入口
  • 南京医院网站建设地方网站怎样做
  • wordpress 广告拦截插件东莞网站优化的具体方案
  • 有免费网站服务器吗网站的建设过程
  • 游戏网站设计风格有哪些wordpress 链接修改密码
  • 建网站需要什么服务器外包工是临时工吗
  • 网站规划建设个人网页制作策划书
  • 公司网站上线流程购买服务器后怎么搭建
  • 中企动力企业邮箱appseo数据是什么意思
  • 西安哪家做网站好百度网站引流怎么做
  • 做几个网站好什么网站可下载可做海报的图片