在微服务架构中,为什么他们说共享REST客户端库不好?

hmo*_*ica 1 java spring microservices

我们有15个使用Java Spring构建的服务,它们使用REST相互通信。

每次我们向池中添加新服务时,我们都会从头开始创建所有代码,包括将与其他服务对话的其余客户端代码以及用于映射所请求资源的POJO类。

我们最终将其他服务的源代码复制并粘贴到新服务中。

我认为最好将所有这些POJO和其余客户端代码放到一个库中,以便所有服务使用它,这将为我们节省很多工作代码,但是“他们”说我们不应该对微服务这样做。

那为什么呢?我们最终复制并一遍又一遍地粘贴完全相同的代码,我看不出有什么区别。

ilo*_*ner 12

我会说“他们”是错的,而你是对的。复制和粘贴客户端代码有几个问题:

  • 如果您的客户端代码中存在错误,则您必须在 15 个地方修复该错误,而不仅仅是 1 个。
  • 它会减慢速度。您现在必须测试和维护同一代码的多个副本。
  • 创建客户端库并通过标准依赖管理器(如 maven)分发它们是常见的做法。亚马逊与几乎所有其他人一起这样做https://github.com/aws/aws-sdk-java

总之,你是对的,亚马逊是支持你观点的最有力的例子。他们完全按照您对 Web 服务的建议执行操作,并且可以说他们是微服务领域中最大、最强大的参与者。

还要解决另一个答案中的紧耦合问题。好的 api 是向后兼容的,因此对 api 的更改不需要升级所有客户端,即使它们使用相同的客户端库。

  • 我完全同意你的评论。我还创建了多个客户端库以在项目中的微服务之间共享。最重要的是向后兼容,当你升级新版本时,它只影响某些服务而不是全部,其他服务会调用旧的api。 (2认同)
  • 你们都忽视了宽容读者原则。使用 REST 而不是 RPC 为我们提供了减少耦合的潜在优势。我们可以忽略客户端中不需要的字段,我们可以通过 JSON 进行讨论以便与语言无关,我们甚至可以避免 URL 与超媒体的耦合。您假设任何 REST API 都应该像纯 RPC 一样使用,并具有方法签名的二进制耦合。您基本上抵消了 REST 的好处。微服务的重点是降低耦合,所以 Sam Newman 是对的。您应该避免耦合,尤其是二进制类型。 (2认同)

Alw*_*ing 5

主要问题是耦合。Building Microservices的作者Sam Newman很好地指出:

通常,我不喜欢跨服务的代码重用,因为它很容易成为耦合的源头。具有用于域对象的序列化和反序列化的共享库是一个经典示例,该示例说明了代码重用驱动程序可能会出现的问题。将字段添加到域实体时会发生什么?您是否必须要求所有客户端升级他们拥有的共享库的版本?如果这样做,您将失去独立部署能力,这是微服务(IMHO)的最重要原则。

代码重复确实有一些明显的缺点。但是我认为这些缺点要比使用最终导致耦合服务的共享代码的缺​​点更好。如果使用共享库,请注意监视它们的使用,如果不确定它们是否是个好主意,我强烈建议您改用服务之间的代码复制。

https://samnewman.io/blog/2015/06/22/answering-questions-from-devoxx-on-microservices/