微服务之间的最佳调用方式( 五 )


DDD(Domain-Driven Design)建议不要共享这个类,而是在每一个有界上下文(模块)中都建一个新类,并拥有新的名字 。
虽然它们的数据库中的数据应该大致相同,但DDD建议每一个有界上下文中都建一个新表,它们之间再进行数据同步 。
这个所谓的“内部微服务设计”其实就是DDD,但当时还没有微服务,因此外表看起来是单体程序,但内部已经是微服务的设计了 。
它的书在2003就出版了,当时就很有名 。但它更偏重于业务逻辑的设计,践行起来也比较困难,因此大家谈论得很多,真正用的较少 。
直到十年之后,微服务出来之后,人们发现它其实内部就是微服务,而且微服务的设计需要用它的思想来指导,于是就又重新焕发了青春,而且这次更猛,已经到了每个谈论微服务的人都不得不谈论DDD的地步 。不过一本软件书籍,在十年之后还能指导新技术的设计,非常令人钦佩 。
这样设计的好处是它是一个单体程序,省去了多个微服务带来的部署、运维的麻烦 。但它内部是按微服务设计的,如果以后要拆分成微服务会比较容易 。至于什么时候拆分不是一个技术问题 。
如果负责这个单体程序的各个团队之间不能在部署时间表,服务器优化等方面达成一致,那么就需要拆分了 。
当然你也要应对随之而来的各种运维麻烦 。内部微服务设计是一个折中的方案,如果你想试水微服务,但又不愿意冒太大风险时,这是一个不错的选择 。
结论微服务之间的调用有两种方式,RPC和事件驱动 。事件驱动是更好的方式,因为它是松耦合的 。但如果业务逻辑是紧耦合的,RPC方式也是可行的(它的好处是代码更简单),而且你还可以通过选取合适的协议(Protobuf gRPC)来降低这种紧耦合带来的危害 。
由于事件溯源和事件通知的相似性,很多人把两者弄混了,但它们实际上是完全不同的东西 。微服务的数量不宜太多,可以先创建比较大的微服务(更像是服务组合) 。
如果你还是不能确定是否采用微服务架构,可以先从“内部微服务设计”开始,再逐渐拆分 。




推荐阅读