Spring 引导:处理多租户应用程序中的配置

Spring Boot: Handle configuration in multitenant application

我正在实施 Spring 引导应用程序,它将提供多租户环境。在我的案例中,这是通过为每个客户使用数据库模式来实现的。例子见 this project.

现在我想知道如何实现特定于租户的配置。我正在使用 @ConfigurationProperties 捆绑我的 属性 值,但这些值只实例化一次,而不是为每个租户实例化。

如果我想将 Spring Cloud Config 与特定于多个租户的 git 存储库一起用作配置后端怎么办?将 jdbc backend 用于 Spring Cloud Config 是否可行?

有什么方法可以使用默认的 Spring 机制,还是我必须自己实现一个基于数据库的配置框架?

编辑:例如,我有两个租户,名为 Tenant1 和 Tenant2。两者都是 运行 在同一上下文中的同一应用程序,并且正在写入数据库方案 tenant_1 和 tenant_2。

正在通过 keycloak 识别租户(参见 Spring Keycloak multi tenant example). So I identify the tenantId from the jwt token and select the database connection like described here

但是现在我需要 @Configuration beans 的相同机制。因为据我所知@Configuration beans 是单例,所以每个应用程序范围总是有一个配置,而不是每个租户一个配置。

所以使用 Spring Cloud Config Tenant1 使用 https://git-url/tenant1,Tenant2 使用 Hashicorp Vault 作为后端,也许 Tenant3 将使用基于 jdbc 的配置后端。所有这些都在一个(当然是可扩展的)应用程序中。

您可以使用 Spring Cloud Config 用于您的方案并且它是可采用的。它易于配置并提供开箱即用的功能。对于您的特定场景,您可以拥有任意数量的微服务 运行,但全部由连接到一个 Git Repository 的一个 Spring Cloud Config Server 控制。您的所有微服务都从 Spring Cloud Config Server 请求配置属性,并且直接从 Git Repository 获取属性。该存储库可以有多个 属性 文件。它可以保存所有微服务的公共属性或基于特定服务的配置属性。如果您想更安全地保存机密财产,也可以通过 HashiCorp 保险库实现。我将在下面留下一张图片,让您更好地了解这个概念。

在下图中,您可以看到具有通用配置 属性 文件的 Git Repository 和针对不同服务但在同一存储库中的特定配置 属性 文件。

我将添加另一张图片,以便您更好地了解如何将其与应用程序配置文件一起安排。

最后,我将添加一些额外的内容来展示 Spring Cloud Config 的强大功能以及它允许​​我们使用的开箱即用功能。您也可以在 运行 应用程序中自动刷新配置属性。您可以配置 Spring Cloud Config 来执行此操作。我将添加一个架构图来实现它。

此答案的参考文献来自 Spring in Action,第五版 克雷格沃尔斯

如果您的应用程序使用租户特定文件(html 模板等),可以应用以下内容。因为我已经使用以下方法处理许多租户并且工作正常且易于维护。

我建议您为所有租户配置维护一致的配置源 (JDBC)。这有助于您拥有一个可以为您的应用程序缓存和扩展的单一源。此外,您可以让您的租户导航到配置页面以管理他们的设置并随时更改它们以满足他们的需求。 (示例设置:每页记录数、主题、徽标、过滤器等...)

如果您想在租户注册时自动配置租户,那么在 git 的文件中配置租户将是一项艰巨的任务,因为这将涉及几个分布式服务。将它们放在 TenantSettings table 中,并以 tenantId 作为列可以帮助您立即轻松获取数据。