Microservices 如何处理微服务体系结构中的常见变量? 让我们考虑一种情况,在这种情况下,多个服务可以在任何时间上改变数据,并且应该在每一个微服务中同时更新。例如,有一个支持语言的列表或一些可以在一天内改变并影响许多服务的共同策略。

Microservices 如何处理微服务体系结构中的常见变量? 让我们考虑一种情况,在这种情况下,多个服务可以在任何时间上改变数据,并且应该在每一个微服务中同时更新。例如,有一个支持语言的列表或一些可以在一天内改变并影响许多服务的共同策略。,microservices,Microservices,我能想到的一个解决方案是另一个可以保存数据的微服务,任何需要当前状态的服务都可以请求它。缺点是,这些数据没有频繁更改,通过HTTP进行请求的成本并不是很低,而且这个(比方说)全局注册表服务有很多流量。由于数据不经常更改,许多服务可能只是缓存数据,以避免每次都请求数据,并且在对配置进行更改时无法对更改做出足够快的响应 另一个解决方案可能是将这种配置外部化——例如,在AWS中,S3上可能有一些可供其他人使用的配置文件。这里的缺点是,没有办法(据我所知)跟踪此类文件中的更改,如果配置中更改的值是正确的

我能想到的一个解决方案是另一个可以保存数据的微服务,任何需要当前状态的服务都可以请求它。缺点是,这些数据没有频繁更改,通过HTTP进行请求的成本并不是很低,而且这个(比方说)全局注册表服务有很多流量。由于数据不经常更改,许多服务可能只是缓存数据,以避免每次都请求数据,并且在对配置进行更改时无法对更改做出足够快的响应

另一个解决方案可能是将这种配置外部化——例如,在AWS中,S3上可能有一些可供其他人使用的配置文件。这里的缺点是,没有办法(据我所知)跟踪此类文件中的更改,如果配置中更改的值是正确的(没有输入错误等),也没有办法添加一些逻辑以进行验证


因此,我的问题是如何在microservice world中处理全局配置/注册表,以减少HTTP开销,您可以在许多服务中同时审核更改和引入更改?

我更喜欢选项1。除了HTTP开销之外,这还会导致系统处于不一致的状态。服务1可能正在处理新值,但服务2将处理旧值

由于这是一个我们正在讨论的分布式系统,我愿意冒可用性风险

有一个配置服务,允许您计划配置更改。不是说将A的值从x更改为y,而是说在时间t时从x更改为y。此t允许您一致地将更改传播到所有系统。您需要努力了解t的最小值对于您的服务集应该是多少,您将如何使所有服务确认更改并在正确的时间进行更改,以及您将如何管理介于两者之间的新服务


另一种方法是使用SpringCloud配置(或类似的东西)。它要求服务向集中式配置服务注册,并对所有服务进行刷新调用以更新配置。限制是,并非所有配置都可以刷新,如果您落后于LB,则仍然需要处理确保所有实例都得到更新的方法

使用将维护集中配置的配置服务器(spring cloud Config Server),您需要对配置服务器进行与配置相关的更改,每个微服务将在启动时启动配置服务器的配置,即使在一定时间间隔后启动,微服务也可以到配置服务器来验证配置中的任何更改并相应地更新。

有两种方法可以做到这一点,尤其是在产品中,更好的方法是使用外部配置存储模式

您可以将配置保存在外部存储中,如Azure Key Vault或Azure App configuration

在此处查找有关Azure key vault的更多详细信息:


配置服务不需要显式地将更改传播到其他服务,而是可以提供一个获取API,允许您请求在特定时间(比如说,未来一小时内)有效的配置,并让它返回生存时间。然后,客户机服务实例可以管理自己的缓存和阶段配置更改,而配置服务不必明确了解它们。你说的“我愿意冒可用性风险”是什么意思?您引入了一个依赖项和一个单点故障,而“所有”其他微服务现在都必须依赖于此,这给您的体系结构带来了脆弱性。有具有HTTP接口的高弹性集中式键值存储(例如,concur,etcd),可以让您省去头痛。这是关于CAP的问题,我在这里追求一致性和分区。同意我们有集中式键值存储,但要么您必须继续从etcd读取值,要么需要通知服务更新内存中的这些配置的机制,而这正是我所说的服务应该做的。谢谢您的输入。据我所知,SpringCloud配置在基于Spring的应用程序上运行。我们应该假设服务可以在nodejs或Scala上,所以我不确定这是否有帮助。如果我错了,您能纠正我吗?SpringCloudConfigServer提供属性以响应定义良好的REST调用。nodejs可以进行REST调用。。。我们通过使用多个活动的spring配置文件来部署云配置服务器,该服务器带有一个自定义后端(web服务器),支持共享和特定于应用程序的属性文件。我的案例是在多个项目或微服务之间共享一些常见的
常量
配置
。我的选择:1。将此通用模块发布到
npm
注册表。2.由于使用GCP,请考虑将这些常量或配置存储到<代码>数据存储> <代码>或<代码>元数据< /代码>。但我不知道哪条路更好。