我一直在做很多关于管理微服务之间依赖关系的谷歌搜索。我们正试图从大型单片应用程序转向微服务,以便在组织上进行扩展,并且能够更快地开发并且多个团队并行工作。 但是,当我们尝试将monolith功能划分为微服务时,我们会看到交织在一起的业务逻辑和数据是如何实现的。当我们坐在一个大数据库的顶部并且能够进行大的关系连接时,这不是问题。但是对于微服务,这就成了一个问题。
一种解决方案是使微服务-A转到5-10个其他微服务以获取必要的数据(这相当于带有连接的DB视图)。另一种解决方案是使微服务-A监听来自5-10个其他服务的事件,并用相关的内容填充本地存储(这相当于物化视图)。无论哪种方式,微服务-A与5-10个其他服务耦合,并且如果微服务-A中需要新信息,则它所依赖的一些服务可能需要在微服务-A之前释放。请注意,微服务-A本身取决于其他服务。最重要的是,我们最终得到了DISTRIBUTED依赖地狱。
许多文章都提倡第二种解决方案 - 即事件采购,舞蹈编排等方面的内容。
我将非常感谢任何共享的经验,建议和见解。
Philometor。
答案 0 :(得分:3)
虽然从技术上讲不是回答"但我绝对可以分享我的一些观察和经验。您关于为数据库操作调用其他服务的服务的问题让我想起了一个项目,其中一位建筑师向高级管理层出售了关于"去耦"通过在一个非常大的企业数据库之前实现数百个REST接口本质上是一个分布式DAO模式,从其他应用程序持久化。该项目完全符合我的预测 - 一个令人沮丧的失败。
微服务并不是要将单片应用程序转变为分布式单片应用程序。在我上面的示例项目中,monolith变成了一个炉子管道,脆弱,混乱的混乱,耦合只移动到服务合同而不是Java类方法签名,并且性能损失如此糟糕,应用程序无法使用。最后我听说他们还在运行他们原来的巨石。
微服务应该更多地是应用程序的垂直分区而不是水平分区。在我看来,在业务功能划分方面考虑更好,而不是转换"现有的巨石。没有规则可以确定微服务的大小,但它应该足够大,可以完成一个完整的同步功能而无需直接依赖外部服务(尽可能多)来完成其工作。如果微服务执行影响50个表的复杂业务功能,那就这样吧!它拥有那么多桌子。理想情况下,如果服务中断,它应该只影响它负责的业务功能,而不是直接影响其他服务。正如您所看到的,这种思维与在我的项目示例中产生分布式混乱的思想完全相反。
您不仅需要确保用微服务替换monoliths的动机是合理的,而且还需要走出整体块并重新审视实际业务并开始对其进行分区。像其他一切一样,婴儿步骤是要走的路。从一个小的完整业务功能开始,并将其转换为单个微服务,而不是试图一次性替换整体。