如何将连接字符串存储在微服务的中央位置
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 文件。
这篇文章有点过时(因此语法可能已更改)但对如何执行其中的某些操作提供了很好的思路。
这取决于您的目标堆栈,即您部署它的位置。但这将是您方法 3 的变体。
a) 如果要将所有微服务部署到同一组 VM 中,则可以创建共享设置文件。有一个通用的配置生成器进程,该进程将从您的 appsettings.json、appsettings.{env}.json 读取,然后是您的新共享设置,然后是环境变量。您可以控制共享设置的加载顺序,即是否希望它们在 appsettings 之前或之后加载。
b) 如果你在K8s上部署,将其作为秘密,然后将其加载到环境变量中。如果你有其他共享设置,可以使用configmap,然后加载到环境变量中。
在这两个选项中,您都可以通过 IConfiguration 对象本身使用此公共连接字符串。因此,各个微服务不需要以不同的方式阅读它们。
我们今天遵循类似的设置,因为我们共享了 10 个 API 中通用的设置和连接字符串。共享设置本身,在 VM 上,我们单独部署它。因此,对微服务本身的定期更改不需要部署共享设置。
另外,可以说,稍后微服务更改所需的数据库。您始终可以使用 appsettings.json 或 appsettings.{env}.json 或自定义配置映射覆盖共享设置。这就是我提到的原因,您可以控制设置的加载顺序。在我们的例子中,共享设置总是在配置构建期间首先加载。
我有一个包含 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 文件。
这篇文章有点过时(因此语法可能已更改)但对如何执行其中的某些操作提供了很好的思路。
这取决于您的目标堆栈,即您部署它的位置。但这将是您方法 3 的变体。
a) 如果要将所有微服务部署到同一组 VM 中,则可以创建共享设置文件。有一个通用的配置生成器进程,该进程将从您的 appsettings.json、appsettings.{env}.json 读取,然后是您的新共享设置,然后是环境变量。您可以控制共享设置的加载顺序,即是否希望它们在 appsettings 之前或之后加载。
b) 如果你在K8s上部署,将其作为秘密,然后将其加载到环境变量中。如果你有其他共享设置,可以使用configmap,然后加载到环境变量中。
在这两个选项中,您都可以通过 IConfiguration 对象本身使用此公共连接字符串。因此,各个微服务不需要以不同的方式阅读它们。
我们今天遵循类似的设置,因为我们共享了 10 个 API 中通用的设置和连接字符串。共享设置本身,在 VM 上,我们单独部署它。因此,对微服务本身的定期更改不需要部署共享设置。
另外,可以说,稍后微服务更改所需的数据库。您始终可以使用 appsettings.json 或 appsettings.{env}.json 或自定义配置映射覆盖共享设置。这就是我提到的原因,您可以控制设置的加载顺序。在我们的例子中,共享设置总是在配置构建期间首先加载。