基于Gin框架的SAAS模式下多商户数据连接隔离问题, 寻求高端方案

各位大神帮指点下.
目前在做一个多租户系统,web框架gin , mysql xorm 开发,大概流程是这样的

  1. 登陆总后台,添加一个商户 (名称, 唯一标示,数据库链接),
  2. 根据商户分配的数据库链接地址 生成商户的数据库(一租户一库) 和 初始化数据
  3. 给租户添加后台管理登陆域名,前台访问域名
  4. 完成域名指向

======= 问题来了 ========

  1. 同一套代码,多个商户登陆商户后台,执行操作,数据库链接有可能不一样,数据库名一定不一样.
  2. 商户登陆的时候在中间件里根据域名判定是哪个商户登陆 然后找到这个商户对应的数据库配置,
  3. 通过配置连接数据库, DB链接指针存放到 gin.Context里面
  4. 每次查询的时候,从context获取链接地址

问题是,如果函数调用比较深,每次都要传context,这样代码太冗余.后续redis/ ES 也会分开
有哪位大佬有好的处理方案或者思路.

项目刚开开始, 参考地址 admin.mk117.com

gin
讨论数量: 8

那传DB 链接指针

4年前 评论

@catcn 是需要两次请求,不同的商户的DB的连接不同

4年前 评论

那判断商户的身份,根据身份创建不同的链接,每个链接添加一个标识,中间件进行商户的判断,获取商户标识对应的链接指针呢

4年前 评论

@caoayu 目前是这样做的,但是有问题.

  1. 用户登陆后,生成一个链接这个链接存放在哪里.
  2. 一般使用DB链接的地方很深,这个DB链接怎么传过去,如果存放在公共变量里, 其他的用户登陆有可能会覆盖掉
    类似这样, 每次都要传context(里面带的有本次数据库连接),
    怎么样 c gin.Context 能自动注入
func FuncA(c gin.Context) {
           res := FuncB(c)
}
func FuncB(c gin.Context) {
           res := FuncC(c)
           return 
}
func FuncC(c gin.Context) {
           res := FuncD(c)
           return 
}
4年前 评论

@theegg 公共变量设置为与用户标识相关,应该不容易覆盖吧,没想到好的方案 :joy:

4年前 评论

@caoayu go 一个请求生命周期不是独立的

4年前 评论

目前是在中间件把每个商户的标识都放到一个context 里向下传递,感觉不够优雅

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!