为了账号安全,请及时绑定邮箱和手机立即绑定

同一端点的多租户实现

同一端点的多租户实现

Go
炎炎设计 2022-06-27 11:14:32
我有一个用 Go 编写的 API 服务器,它为不同的租户做一些工作。我有许多端点应该根据调用它的租户实现不同的代码,例如:s.GET("/api/orders", a.getOrders)将调用a.getOrders处理程序,在其工作后将为所有租户返回相同的 JSON 结构,但获取数据的实现可能不同(有时对于租户我需要调用另一个 Web 服务,对于另一个我需要查询不同的 DB表等...)。我正在考虑为每个租户创建不同的包,所以我将有一个common(用于常见实现)、tenanta(用于租户 A 特定实现)、tenantb等等tenantc......现在,我的问题是:哪个是最好的如何处理“重定向”?我能想到的第一件事(可能是坏事)是在我的处理程序中放置一个开关并从会话或 url 中a.getOrders解析:tenantIDswitch tenantID {   case "tenanta":       tenanta.getOrders()   case "tenantb":       tenantb.getOrders()   case "tenantc":       tenantc.getOrders()   default:       common.getOrders()}显然它可能会变得非常快(目前我必须处理 20 多个租户)。有没有更好的方法来处理这种情况?
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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


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()

}

现在您的所有租户都遵循相同的界面,如果所有租户都定义了最少的功能集,这将是编译时可测试的


这也将导致更清晰的抽象


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信