我有一个8微服务的解决方案。但是我们在8个微服务中使用相同的数据库。
到目前为止,我尝试了三种方法。
方法:1
在单个项目的appsettings.json
文件中设置连接字符串,并使用IConfiguration (DI)访问它。但现在,如果有一个变化,我需要手动更改所有8个应用程序。json文件
方法:2
创建了一个包含const string
连接字符串的共享类库,并在所有8个项目中引用它。这对我来说似乎很好,但在每次部署时,我们都必须重新编译。
方法:3
在中央共享位置创建一个JSON文件,并在每次需要连接到数据库时使用JSON解析器读取。对我来说,这看起来很灵活,但代价是性能。
有没有更好的方法来定义&在8个微服务之间使用连接字符串,而不影响灵活性和性能,或者影响最小?
仅仅因为单个微服务今天连接到同一个DB,并不意味着它们将来会这样,这应该通过ConnectionString的配置来管理。
因此方法2不可行。
方法1可以。是的,你必须改变它8次,但多久会改变一次呢?如果你确实开始使用不同的db,那么它可能只有一次。
方法3:在这里,我建议你不要自己这样做,而是通过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/
这取决于您的目标堆栈,您在哪里部署它。但这将是你的方法的某种变体。
a)如果你将所有微服务部署到同一组vm中,那么你可以创建一个共享的设置文件。有一个通用的配置构建器进程,它将从应用程序中读取。json, appsettings。{env}。Json,然后是新的共享设置,最后是环境变量。你可以控制共享设置的加载顺序,也就是说,你想让它们在appsettings之前加载还是在appsettings之后加载。
b)如果您在k8上部署,请将其作为秘密,然后将其加载到环境变量中。如果您有其他共享设置,您可以使用configmap,然后加载到环境变量中。
在这两个选项中,这个公共连接字符串将通过IConfiguration对象本身提供给您。因此,单个微服务不需要以不同的方式读取它们。
我们今天遵循类似的设置,因为我们在10个api中共享设置和连接字符串。共享设置本身,在VM上,我们单独部署它。因此,定期更改微服务本身不需要部署共享设置。
另外,假设稍后您的数据库需要进行微服务更改。您始终可以使用应用程序设置覆盖共享设置。{env}. Json或appsettings。Json或自定义配置映射。这就是为什么我提到,你可以控制加载设置的顺序。在我们的例子中,共享设置总是在配置构建期间首先加载。