gpt4 book ai didi

api - 同一端点的 Multi-Tenancy 实现

转载 作者:行者123 更新时间:2023-12-01 22:31:24 26 4
gpt4 key购买 nike

我有一个用 Go 编写的 API 服务器,它为不同的租户做一些工作。
我有许多端点应该根据调用它的租户实现不同的代码,例如:s.GET("/api/orders", a.getOrders)将调用 a.getOrders处理程序,在其工作后将为所有租户返回相同的 JSON 结构,但获取数据的实现可能不同(有时对于租户我需要调用另一个 Web 服务,对于另一个我需要查询不同的数据库表等。 ..)。
我正在考虑为每个租户创建不同的包,所以我将有一个 common (对于常见的实现),tenanta (针对租户 A 的具体实现),tenantb , tenantc等等......现在,我的问题是:处理“重定向”的最佳方式是什么?
我能想到的第一件事(可能也是坏事)是在我的 a.getOrders 中设置一个开关。处理程序并解析 tenantID从 session 或网址:

switch tenantID {
case "tenanta":
tenanta.getOrders()
case "tenantb":
tenantb.getOrders()
case "tenantc":
tenantc.getOrders()
default:
common.getOrders()
}
显然它可能会变得非常快(目前我必须处理 20 多个租户)。
有没有更好的方法来处理这种情况?
谢谢

最佳答案

你可以做一个租户界面,比如

type tenant interface{
getOrders() Orders
}
现在您可以声明实现此接口(interface)的任意数量的租户
package main

import (
"fmt"
)

type tenant interface {
getOrders()
}

type TenantA struct {
}

func (t TenantA) getOrders() {
fmt.Println("Tenant A")
}

var tenantMap = map[string]tenant{
"T-A": TenantA{},
}

func main() {
fmt.Println("Hello")
teneantTest := "T-A"

curTeneant, ok := tenantMap[teneantTest]
if !ok {
fmt.Println("Not Found")
return
}

curTeneant.getOrders()
}
现在您的所有租户都遵循相同的界面,如果所有租户都定义了最少的功能集,这将是编译时可测试的
这也将导致更清晰的抽象

关于api - 同一端点的 Multi-Tenancy 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63601665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com