我目前正在使用Go编写一个服务,需要处理多个租户。我已经确定使用一个数据库、共享表格的方法,并使用“tenant_id”来区分租户。
该服务的结构如下:
该服务的结构如下:
gRPC server -> gRPC Handlers -
\_ Managers (SQL)
/
HTTP/JSON server -> Handlers -
有两个服务器,一个是gRPC服务器(管理)和一个HTTP/JSON服务器(公共API),每个服务器都在自己的go-routine中运行,并具有各自的处理程序,可以利用不同管理器的功能。管理器(我们称之为"inventory-manager"),都位于不同的根级包中。据我所知,这些是我的领域实体。
在这方面,我有一些问题:
我找不到任何支持多租户的Go ORM。在sqlx包上编写自己的ORM是否是一个有效的选择?
未来的其他服务也需要支持多租户,所以我想我必须创建一些库/包。
今天,我通过为公共API服务器使用ResolveTenantBySubdomain中间件来解析租户。然后,我将解析后的租户ID放入与调用管理器一起发送的上下文值中。在管理器的不同方法中,我从上下文值中获取租户ID。然后,在每个SQL查询/exec调用中使用它,如果缺少或无效租户ID,则返回错误。我应该使用上下文来实现这个目的吗?
对于gRPC服务器上的租户解析,我认为我必须使用UnaryInterceptor函数进行中间件处理。由于gRPC API接口只能被其他后端服务访问,因此我认为在子域上解析是不必要的。但是,我应该如何嵌入租户ID?在头部吗?
真的希望我的问题是正确的。 谢谢,Karl。
sqlx
很适合我的项目。只需注意设计决策,即从查询返回的未映射字段被视为“未使用的变量”,并将引发错误。请参见此处的二级文档,标题为“扫描目标安全性”http://jmoiron.github.io/sqlx/ - RayfenWindspear