多租户实现
# 简介
联犀 使用了gozero框架,底层orm选用gorm, 数据隔离使用字段级隔离,业务无需关注该字段即可实现多租户.
租户的使用可以参考: 租户管理
# 业务使用
我们先来看一个租户隔离的表的定义实现
type DmUserDeviceCollect struct {
ID int64 `gorm:"column:id;type:bigint;primary_key;AUTO_INCREMENT"`
TenantCode stores.TenantCode `gorm:"column:tenant_code;index;type:VARCHAR(50);NOT NULL"` // 租户编码
ProjectID stores.ProjectID `gorm:"column:project_id;type:bigint;default:0;NOT NULL"` // 项目ID(雪花ID)
UserID int64 `gorm:"column:user_id;type:BIGINT;uniqueIndex:product_id_deviceName;NOT NULL"` // 问题提出的用户
ProductID string `gorm:"column:product_id;type:varchar(100);uniqueIndex:product_id_deviceName;NOT NULL"` // 产品id
DeviceName string `gorm:"column:device_name;uniqueIndex:product_id_deviceName;type:varchar(100);NOT NULL"` // 设备名称
stores.NoDelTime
DeletedTime stores.DeletedTime `gorm:"column:deleted_time;default:0;uniqueIndex:product_id_deviceName"`
}
func (m *DmUserDeviceCollect) TableName() string {
return "dm_user_device_collect"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
可以看到第二个字段名字为TenantCode 这是一个 stores.TenantCode
类型的参数,业务表如果需要租户隔离,添加该字段即可实现多租户隔离,无需填写租户号.
# 实现方案
首先要实现的是租户的确认,用户登录之后会获取一个token,在访问接口的时候会在http 头带上这个token,联犀中的api服务收到请求后会首先走到token校验中间件,token校验会访问core服务的rpc接口,
上次更新: 2024/10/11, 17:14:01