带有 Play 和 JSON 序列化的微服务

MicroServices with Play and JSON Serialization

让我们假设我有几个微服务,每个微服务都公开一组 REST 端点。假设微服务 A 正在与微服务 B 通信,并且它们交换 JSON 数据。

这个 JSON 数据需要在微服务 A 和 B 上进行序列化和反序列化。这个序列化逻辑和模型在两个微服务代码库上都是相同的。

我可以通过将模型 类 移动到一个小的依赖项中并在两个微服务上使用它来减少这种重复。没问题!这可能违背了微服务架构的目标,即 "share nothing"。但我觉得更潜在的问题是代码重复。大家怎么看?

在这种情况下,我看不到要点 'share nothing'。只要你将你的 De/Serializer 作为神器保存在某个联系中,你就不会 "share" 任何东西,而是你正在使用一个(不知何故)外部库。 如果你使用例如日志记录,您的两个项目都将使用例如slf4s,但他们不共享它,因为每个人都单独使用它。

将功能分离为通信微服务时,需要牢记许多事项:

服务器和客户端之间的 Scala 版本绑定

如果您的服务器需要特定版本的 scala(例如,因为您使用的库仅适用于 2.10 版),这应该不会影响您在客户端中选择的 scala 版本。这指向让 类 代表您的通信路径的想法,就像在一个可以单独交叉编译的单独项目中一样。

服务器和客户端之间的库绑定

共享库对客户端代码的要求越低越好。即使强制选择特定的 Play 服务器也会在客户端和服务器之间强制执行一定程度的刚性和耦合,这是最好避免的。

最好的选择是该库导致对其他零个库的依赖。

支持协议随时间变化

拥有单独服务的优势之一是它们可以在不同的时间点进行升级和改进。无论何时更改,您都应该始终尝试让服务器支持以前版本的通信协议。这使您可以轻松回滚更新,并在不同的时间点更新客户端。

不允许向后兼容意味着您需要同步更新这两个服务。这不仅减少了使用微服务的许多优势,如果有必要,还会让处理回滚变得非常痛苦。


这里的通用故事是通过在服务器上做出的选择,在客户端上尽可能少地强制执行选择方式(scala 版本、库版本、必须发生协议更改的时间段)。

如果您能遵循这种方法,我认为使用代码来增强与服务对话的可访问性不会有问题。