我有一个用Go编写的API服务器,可以为不同的租户做一些工作。
我有许多端点应根据调用它的租户实现不同的代码,例如:s.GET("/api/orders", a.getOrders)将调用a.getOrders处理程序,该处理程序在工作后将为所有租户返回相同的JSON结构,但获取数据的实现可能有所不同(有时对于租户,我需要调用另一个Web服务,对于另一个租户,我需要查询不同的Web服务DB表等...)。
我正在考虑为每个租户创建不同的程序包,因此我将拥有一个common(用于常见的实现),tenanta(用于租户A的特定实现),tenantbtenantc等...现在,我的问题是:哪种是处理“重定向”的最佳方法?
我可以想到的第一件事(可能是不好的事情)是在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/

10-16 16:06