xt

package module
v1.0.29 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 12, 2025 License: Apache-2.0 Imports: 19 Imported by: 0

README

基于gormGin封装的多租户处理框架

多租户方案

当下主流的多租户方案通常有三种:

  1. 独立数据库 每个租户单独的数据库,用户数据隔离级别最高,安全性更好,但是成本更高
  2. 共享数据库,隔离数据架构 多个或所有租户共享同一个数据库,但是每个租户的scheme不同,用户数据隔离级别中等
  3. 共享数据库和数据架构 所有租户共享同一个数据库和表,在数据表中通过TenantId字段区分不同租户,用户数据隔离级别最低,但是成本也更低

本工具采用的是第一种(独立数据库)

实现原理

  1. 初始化 传入一个连接配置,去读取数据库配置,并初始化数据库连接map单例
  2. 根据租户Id返回不同的数据库连接对象和gin.Context

食用方式

  1. 安装依赖
go get github.com/lixh00/xt
  1. 先添加需要同步的Model,如果不需要可以不执行这个步骤
if err := xt.AddModel(new(En));err != nil {
    panic(err)
}
  1. 创建一个提供租户数据库配置信息的函数,此步骤为必须(这儿是个参考,也可以不用xorm,只要返回数据匹配即可)
func GetTenantDbInfos() []xt.DatabaseClientInfo {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%v)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		"tenant", "tenant123", "192.168.1.37", 3307, "tenant")
	engine, err := xorm.NewEngine("mysql", dsn)
	if err != nil {
		panic(err)
	}
	defer engine.Close()

	var dbs []TDB
	if err = engine.Find(&dbs); err != nil {
		panic(err)
	}
	var d []xt.DatabaseClientInfo
	for _, ddd := range dbs {
		d = append(d, xt.DatabaseClientInfo{
			TenantId: ddd.TenantId,
			Host:     ddd.Host,
			Port:     ddd.Port,
			User:     ddd.Username,
			Password: ddd.Password,
			Db:       ddd.Db,
		})
	}
	logger.Say.Debugf("%+v", d)
	return d
}
  1. 开始使用
func main() {
	app := gin.Default()
	err := xt.Init(GetTenantDbInfos, nil)
	if err != nil {
		panic(err)
	}
	app.GET("/test", xt.GinHandler(func(ctx *xt.MultiTenantContext) {
		var us []En
		if err := ctx.DB.Find(&us); err != nil {
			logger.Say.Errorf("数据查询失败: %v", err)
			ctx.JSON(200, gin.H{
				"message": "系统错误",
			})
			return
		}
		ctx.JSON(200, gin.H{
			"message": us,
		})
	}))
	app.Run(":12345")
}

Documentation

Index

Constants

定义状态码

Variables

This section is empty.

Functions

func Add

func Add(tdb DatabaseClientInfo) error

Add 添加一个数据库连接

func AddModel

func AddModel(m interface{}) error

AddModel 添加一个需要同步的模型

func AddModels

func AddModels(m ...interface{}) error

AddModels 添加一堆需要同步的模型

func DisableSyncModels added in v1.0.9

func DisableSyncModels(disable bool)

DisableSyncModels 设置同步模型是否禁用

func GetByTenantId added in v1.0.2

func GetByTenantId(tenantId string) (*gorm.DB, error)

GetByTenantId 根据租户Id获取数据库连接对象

func GinHandler

func GinHandler(handler MultiTenantHandlerFunc) gin.HandlerFunc

GinHandler Gin处理器

func Init

func Init(p TenantDBProvider, i TenantIdResolver, auto ...bool) error

Init 初始化

func SetDisableForeignKeyConstraintWhenMigrating added in v1.0.18

func SetDisableForeignKeyConstraintWhenMigrating(flag bool)

SetDisableForeignKeyConstraintWhenMigrating @description: 设置是否禁用自动创建外键约束 @param flag

func SetLogger added in v1.0.3

func SetLogger(out logger.Interface)

SetLogger 设置日志输出工具

func SetRedisCacheConfig added in v1.0.27

func SetRedisCacheConfig(dsn, password string, db int, ttl time.Duration, cacheMaxItemCnt int64)

SetRedisCacheConfig @description: 设置Redis缓存连接配置 @param dsn @param password @param db

func SetSyncClientTime added in v1.0.12

func SetSyncClientTime(minute int64)

SetSyncClientTime 自动同步连接配置的时间间隔(单位:分钟)

func SetSyncModelsAfter added in v1.0.16

func SetSyncModelsAfter(handle SyncModelsAfter)

SetSyncModelsAfter @description: 设置同步模型后的回调 @param handle

func SetSyncModelsBefore added in v1.0.22

func SetSyncModelsBefore(handle SyncModelsBefore)

SetSyncModelsBefore @description: 设置同步模型前的回调 @param handle

Types

type DatabaseClientInfo

type DatabaseClientInfo struct {
	TenantId string     `json:"tenantId"` // 租户ID
	Info     TenantInfo `json:"info"`     // 租户信息
	Host     string     `json:"host"`     // 数据库地址
	Port     int        `json:"port"`     // 数据库端口
	User     string     `json:"user"`     // 数据库用户名
	Password string     `json:"password"` // 数据库密码
	Db       string     `json:"db"`       // 数据库名称
}

DatabaseClientInfo 数据库连接配置

func (DatabaseClientInfo) GetDSN

func (c DatabaseClientInfo) GetDSN() string

GetDSN 返回 MySQL 连接字符串

type MultiTenantContext

type MultiTenantContext struct {
	*gin.Context
	TenantId   string     // 租户Id
	TenantInfo TenantInfo // 租户信息
	DB         *gorm.DB   // 数据库连接
	Reply      Response   // 返回值
}

MultiTenantContext 多租户上下文

func (*MultiTenantContext) MustParam added in v1.0.14

func (ctx *MultiTenantContext) MustParam(key string) (v string)

MustParam 获取路径参数,如果不存在,就向前端返回错误

type MultiTenantHandlerFunc

type MultiTenantHandlerFunc func(*MultiTenantContext)

MultiTenantHandlerFunc 处理函数

type Response added in v1.0.24

type Response interface {
	Result(code int, data any, msg, err string)           // 手动组装返回结果
	Ok()                                                  // 返回无数据的成功
	OkWithMessage(message string)                         // 返回自定义成功的消息
	OkWithData(data any)                                  // 自定义内容的成功返回
	OkDetailed(data any, message string)                  // 自定义消息和内容的成功返回
	Fail()                                                // 返回默认失败
	FailWithMessage(message string)                       // 返回默认状态码自定义消息的失败
	FailWithError(msg string, err error)                  // 返回自定义消息和内容的失败
	FailWithErrorAndCode(msg string, err error, code int) // 返回自定义消息和内容以及错误代码的失败
	FailWithMessageAndCode(message string, code int)      // 返回自定义消息和状态码的失败
}

Response @description: 接口返回值

func R added in v1.0.14

R 工厂函数

type SyncModelsAfter added in v1.0.16

type SyncModelsAfter func(db *gorm.DB, tenantId string) error

SyncModelsAfter 同步模型完成之后调用函数

type SyncModelsBefore added in v1.0.22

type SyncModelsBefore func(db *gorm.DB, tenantId string) error

SyncModelsBefore 同步模型之前调用函数

type TenantDBProvider

type TenantDBProvider func() []DatabaseClientInfo

TenantDBProvider 租户数据库连接信息提供者

type TenantIdResolver

type TenantIdResolver func(*gin.Context) (string, TenantInfo, error)

TenantIdResolver 租户Id解析器

type TenantInfo added in v1.0.9

type TenantInfo struct {
	Id        string      `json:"id"`        // 租户ID
	Name      string      `json:"name"`      // 租户全名
	ShortName string      `json:"shortName"` // 租户简称
	TypeCode  string      `json:"type"`      // 租户类型
	Extended  interface{} `json:"extended"`  // 自行维护的扩展信息
}

TenantInfo 租户信息

func GetAllTenantInfo added in v1.0.9

func GetAllTenantInfo() (datas []TenantInfo)

GetAllTenantInfo 获取所有租户信息

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL