具有Play和JSON序列化的MicroServices

时间:2015-09-04 07:14:09

标签: scala playframework-2.2 microservices

让我们假设我有几个MicroServices,每个都暴露一组REST端点。假设MicroService A正在与MicroService B通信并且它们交换JSON数据。

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

我可以通过将模型类移动到一个小的依赖项中来减少这种重复,并在MicroServices上使用它。不是问题!这可能违背MicroService架构的目标,即“无共享”。但我觉得解决的更多潜在问题是代码重复。你们觉得怎么样?

2 个答案:

答案 0 :(得分:3)

我没有看到这一点'什么都不分享'在这种情况下。只要你将De / Serializer作为神器存在于某些关系中,你就不会分享"分享"什么,而你正在使用(某种程度上)外部库。 如果您使用例如记录,你的两个项目都将使用例如slf4s,但他们不共享它,因为每个人都单独使用它。

答案 1 :(得分:1)

在将功能分离为通信微服务时,需要记住以下几点:

在服务器和客户端之间绑定scala版本

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

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

您的共享库对客户端代码的要求越少越好。即使强制使用特定选择的Play服务器也会强制实现最佳避免的客户端和服务器之间的刚性和耦合。

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

支持协议随时间的变化

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

不允许向后兼容意味着您需要以锁定步骤更新这两项服务。这不仅降低了使用微服务的诸多优势,而且如果有必要,还会使处理回滚变得非常痛苦。

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

如果您可以采用这种方法,我就不会发现使用代码来增强与服务交谈的可访问性方面的问题。