【发布时间】:2025-12-25 04:55:11
【问题描述】:
我目前正在用 Go 编写一个需要处理多个租户的服务。我已决定使用单一数据库、共享表方法,使用“tenant_id”判别器进行租户分离。
服务的结构如下:
gRPC server -> gRPC Handlers -
\_ Managers (SQL)
/
HTTP/JSON server -> Handlers -
两台服务器,一台 gRPC(管理)和一台 HTTP/JSON(公共 API),每台服务器都运行在自己的 go-routine 中,并具有各自的处理程序,可以利用不同管理器的功能。管理器(我们称其为“库存管理器”)都存在于不同的根级包中。据我所知,这些是我的域实体。
对此我有一些疑问:
我找不到任何支持多租户的 Go 的 ORM。在 sqlx 包之上编写我自己的包是一个有效的选择吗?
未来的其他服务也需要多租户支持,所以我想无论如何我都必须创建一些库/包。
今天,我使用公共 API 服务器的 ResolveTenantBySubdomain 中间件解析租户。然后,我将解析的租户 ID 放在一个上下文值中,该上下文值与对经理的调用一起发送。在管理器的不同方法中,我从上下文值中获取租户 ID。然后将其与每个 SQL 查询/执行调用一起使用,如果租户 ID 丢失或无效,则返回错误。我是否应该为此使用上下文?
在gRPC服务器上解析租户,相信我必须使用UnaryInterceptor函数进行中间件处理。由于 gRPC API 接口只能被其他后端服务访问,我猜这里不需要通过子域解析。但是我应该如何嵌入租户 ID?在标题中?
真的希望我问的是正确的问题。 问候,卡尔。
【问题讨论】:
-
1.当然,为什么不呢? 2. 不是问题。 3. 上下文非常适合取消,但不适合数据处理。 4.标题,参数,但是你想这样做。这是您的设计决定。
-
我发现
sqlx非常适合我的项目。请注意所做的设计决策,以便从未映射的查询返回的字段被视为“未使用的变量”并将引发错误。请参阅标题“扫描目的地安全”jmoiron.github.io/sqlx 下的辅助文档
标签: sql go multi-tenant