如何将连接字符串存储在微服务的中央位置

How to store Connection Strings in a central location for Microservices

我有一个包含 8 个微服务的解决方案。 但是我们在 8 个微服务中使用相同的数据库。它们在设计时都考虑了单一职责。

So far I tried 3 approaches.

方法:1

在单个项目的 appsettings.json 文件中设置连接字符串并使用 IConfiguration (DI) 访问它。但是现在如果有变化我需要手动更改所有 8 appsettings.json 文件

方法:2

创建了一个共享 class 库,其中包含 const string 个连接字符串,并在所有 8 个项目中引用它。这对我来说似乎不错,但在每次部署期间我们都必须重新编译。

方法:3

在中央共享位置创建了一个 JSON 文件,并在每次需要连接到数据库时使用 JSON 解析器进行读取。这对我来说看起来很灵活,但会牺牲性能。

在不影响灵活性和性能或影响最小的情况下,是否有更好的替代方法来定义和使用 8 个微服务中的连接字符串?

仅仅因为今天的各个微服务连接到同一个数据库,并不意味着它们将来会连接,这应该通过配置 ConnectionString 来管理。

因此方法 2 被淘汰。

方法 1 很好。是的,您必须更改它 8 次,但是这将多久更改一次?如果您确实开始使用不同的数据库,那么它可能只有一次。

方法三: 在这里,我建议您不要自己这样做,而是通过 K8s/Helm 图表使用更标准的方法。

您可以通过存储在卷上的机密来执行此操作。或者更好的方法是通过 Helm Charts Values.yaml 文件。

这篇文章有点过时(因此语法可能已更改)但对如何执行其中的某些操作提供了很好的思路。​​

https://pascalnaber.wordpress.com/2017/11/29/handling-settings-and-environment-variables-of-your-net-core-2-application-hosted-in-a-docker-container-during-development-and-on-kubernetes-helm-to-the-resque/

这取决于您的目标堆栈,即您部署它的位置。但这将是您方法 3 的变体。

a) 如果要将所有微服务部署到同一组 VM 中,则可以创建共享设置文件。有一个通用的配置生成器进程,该进程将从您的 appsettings.json、appsettings.{env}.json 读取,然后是您的新共享设置,然后是环境变量。您可以控制共享设置的加载顺序,即是否希望它们在 appsettings 之前或之后加载。

b) 如果你在K8s上部署,将其作为秘密,然后将其加载到环境变量中。如果你有其他共享设置,可以使用configmap,然后加载到环境变量中。

在这两个选项中,您都可以通过 IConfiguration 对象本身使用此公共连接字符串。因此,各个微服务不需要以不同的方式阅读它们。

我们今天遵循类似的设置,因为我们共享了 10 个 API 中通用的设置和连接字符串。共享设置本身,在 VM 上,我们单独部署它。因此,对微服务本身的定期更改不需要部署共享设置。

另外,可以说,稍后微服务更改所需的数据库。您始终可以使用 appsettings.json 或 appsettings.{env}.json 或自定义配置映射覆盖共享设置。这就是我提到的原因,您可以控制设置的加载顺序。在我们的例子中,共享设置总是在配置构建期间首先加载。