我有一个用Go编写的API服务器,可以为不同的租户做一些工作。
我有许多端点应根据调用它的租户实现不同的代码,例如:s.GET("/api/orders", a.getOrders)
将调用a.getOrders
处理程序,该处理程序在工作后将为所有租户返回相同的JSON结构,但获取数据的实现可能有所不同(有时对于租户,我需要调用另一个Web服务,对于另一个租户,我需要查询不同的Web服务DB表等...)。
我正在考虑为每个租户创建不同的程序包,因此我将拥有一个common
(用于常见的实现),tenanta
(用于租户A的特定实现),tenantb
,tenantc
等...现在,我的问题是:哪种是处理“重定向”的最佳方法?
我可以想到的第一件事(可能是不好的事情)是在a.getOrders
处理程序中放置一个开关,并从 session 或URL中解析tenantID
:
switch tenantID {
case "tenanta":
tenanta.getOrders()
case "tenantb":
tenantb.getOrders()
case "tenantc":
tenantc.getOrders()
default:
common.getOrders()
}
显然,它可能很快就会变长(目前我必须要处理20个以上的租户)。有没有更好的方法来处理这种情况?
谢谢
最佳答案
您可以做一个租户界面,例如
type tenant interface{
getOrders() Orders
}
现在,您可以声明实现此接口的任意数量的租户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/