如何保证两个微服务之间的接口不被破坏?
How do I guarantee that the interface between two microservices is not broken?
假设我们有两个微服务:客户端和服务器。微服务架构最基本的特征之一是能够为每个微服务提供单独的管道,这意味着我们必须能够将它们独立部署到生产环境中。
这意味着不同的微服务可能由不同的团队开发,并且某些功能在一个微服务上的开发速度比在另一个微服务上的开发速度更快。这通常以客户端和服务器之间的合同(接口)被破坏而告终,因此客户端发送到服务器的 JSON 不再有效。
问题是如何防止两个微服务之间的通信由于它们之间的契约被破坏而中断的情况?处理此类问题的最佳策略是什么?
一种解决方案是端点版本控制。假设您的微服务是 REST APIs,您可以指示您的团队增加 API 端点的版本,如果他们对该端点所做的任何更改都会破坏它。遵循一个弃用周期,并在 6 个月后删除对旧端点的支持。它让您有时间切换到较新的版本,而不是破坏任何依赖旧版本的东西。
另一个解决方案是,不是微服务与微服务对话,而是有一个编排层。也就是说,一些微服务管理器抽象出任何微服务到微服务的通信。作为微服务消费者的应用程序随后成为编排层的消费者,编排层决定需要调用哪个微服务 api。如果更改 API 合同,这仍然会导致合同损坏问题,但您可以在全部集中的编排层修复它,而不是协调跨团队微服务更改。
客户端微服务团队应该为合同编写测试套件,并让它们在服务器微服务的构建管道中运行。这可以作为 CI-CD 的一部分自动执行。因此服务器微服务团队将立即知道他们的更改对其他客户端团队的影响。
The question is how to prevent cases where communication between two
microservices is broken due to a broken contract between them?
合约设计: 当你在设计合约时,服务器[也称为服务提供者或生产者]不能决定合约,只是在这里说是我提供的合同,现在去使用该服务。如果服务器有多个客户端(通常是这种情况),那么多个客户端将为合同提供 'demands',然后服务器将实现最小公共聚合作为服务产品。
合同变更:服务提供商应努力保持合同在大多数情况下与后台兼容。但是,如果合同需要进行重大更改,则可以通过启动新版本的端点来处理。在这种情况下,旧服务端点(例如 v1)的停用不会立即完成。服务的消费者会收到此更改的通知,并有时间切换到更新版本的合同。 (例如说 v2)
您可以获得有关 Martin Fowler 的 bliki 的更多信息:https://martinfowler.com/articles/consumerDrivenContracts.html
What is the best strategy to handle such issues?
我想,我已经回答了上面的攻略。但是,就工具而言,以下是一些有助于该场景的工具:
- 契约:https://docs.pact.io/
- Consul:这是服务发现工具,但是,如果您正在采用微服务,那么这对于处理大量服务将非常有用。 https://www.consul.io/
假设我们有两个微服务:客户端和服务器。微服务架构最基本的特征之一是能够为每个微服务提供单独的管道,这意味着我们必须能够将它们独立部署到生产环境中。
这意味着不同的微服务可能由不同的团队开发,并且某些功能在一个微服务上的开发速度比在另一个微服务上的开发速度更快。这通常以客户端和服务器之间的合同(接口)被破坏而告终,因此客户端发送到服务器的 JSON 不再有效。
问题是如何防止两个微服务之间的通信由于它们之间的契约被破坏而中断的情况?处理此类问题的最佳策略是什么?
一种解决方案是端点版本控制。假设您的微服务是 REST APIs,您可以指示您的团队增加 API 端点的版本,如果他们对该端点所做的任何更改都会破坏它。遵循一个弃用周期,并在 6 个月后删除对旧端点的支持。它让您有时间切换到较新的版本,而不是破坏任何依赖旧版本的东西。
另一个解决方案是,不是微服务与微服务对话,而是有一个编排层。也就是说,一些微服务管理器抽象出任何微服务到微服务的通信。作为微服务消费者的应用程序随后成为编排层的消费者,编排层决定需要调用哪个微服务 api。如果更改 API 合同,这仍然会导致合同损坏问题,但您可以在全部集中的编排层修复它,而不是协调跨团队微服务更改。
客户端微服务团队应该为合同编写测试套件,并让它们在服务器微服务的构建管道中运行。这可以作为 CI-CD 的一部分自动执行。因此服务器微服务团队将立即知道他们的更改对其他客户端团队的影响。
The question is how to prevent cases where communication between two microservices is broken due to a broken contract between them?
合约设计: 当你在设计合约时,服务器[也称为服务提供者或生产者]不能决定合约,只是在这里说是我提供的合同,现在去使用该服务。如果服务器有多个客户端(通常是这种情况),那么多个客户端将为合同提供 'demands',然后服务器将实现最小公共聚合作为服务产品。
合同变更:服务提供商应努力保持合同在大多数情况下与后台兼容。但是,如果合同需要进行重大更改,则可以通过启动新版本的端点来处理。在这种情况下,旧服务端点(例如 v1)的停用不会立即完成。服务的消费者会收到此更改的通知,并有时间切换到更新版本的合同。 (例如说 v2)
您可以获得有关 Martin Fowler 的 bliki 的更多信息:https://martinfowler.com/articles/consumerDrivenContracts.html
What is the best strategy to handle such issues?
我想,我已经回答了上面的攻略。但是,就工具而言,以下是一些有助于该场景的工具:
- 契约:https://docs.pact.io/
- Consul:这是服务发现工具,但是,如果您正在采用微服务,那么这对于处理大量服务将非常有用。 https://www.consul.io/