我认为这可能在理论上有所帮助。微服务背后的动机之一是无共享,消息传递过程。微服务就像Actor模型中的actor。这意味着每个进程都维护自己的本地状态,并且一个进程访问另一个状态的唯一方法是发送消息(即使那样,另一个进程也可以响应,但是喜欢这些消息)。实际上,“每个微服务都有自己的数据库”的意思是,进程(即微服务)的状态是本地的和私有的。在很大程度上,这表明应将“数据库” 并置微服务,即“数据库”应与微服务在同一逻辑节点上存储和执行。微服务的不同“实例”是单独的过程,因此每个应具有自己的“数据库”。
从这个角度来看,全局数据库或在微服务之间甚至微服务实例之间共享的数据库将构成共享状态。从微服务的角度来看,“适当”的处理方式是让共享数据库由“数据库”微服务介导。其他想要了解数据库内容的微服务会将消息发送到该“数据库微服务”。通常,这不会消除原始微服务对本地状态的需求(即每个微服务实例“数据库”)!变化之处在于该本地状态所代表的含义。与其存储“ User Sally是管理员”,不如存储“数据库微服务在五分钟前说'User Sally是管理员'”。换一种说法, 关于其他微服务的状态。
这样做的好处是每个微服务都是独立的。这使微服务成为故障的原子单位。您(大多数)不必担心处于部分功能状态的微服务。当然,问题已经转移到微服务网络。由于无法联系其他微服务,微服务可能无法执行所需的功能。但是,好处是微服务将处于定义良好的状态,并且可能能够提供降级或有限的服务,例如通过解决过时的信念。缺点是很难获得整个系统的一致快照,并且可能有很多(不需要的)冗余和重复。
当然,建议不要将Oracle实例粘贴到每个Docker容器中。首先,并不是每个微服务都需要一个“数据库”。一些进程不需要任何持久状态即可正常工作。例如,在两种协议之间转换的微服务不一定需要任何持久状态。对于需要持久状态的情况,单词“数据库”仅表示“持久状态”。它可以是其中带有JSON的文件,也可以是Sqlite数据库,也可以是Oracle的本地运行副本,也可以是任何其他本地方式持久存储数据。如果“数据库”不是本地的,那么从纯微服务的角度来看,应将其视为单独的(微)服务。为此,让RDS实例成为微服务的“数据库”毫无意义。同样,这种观点不是“一堆带有自己的RDS数据库的微服务”,而是“一堆与 RDS数据库通信的微服务”。此时,数据是否存储在同一数据库实例中没有区别。
在实用上,微服务体系结构增加了大量的复杂性。这种复杂性只是认真处理部分故障的代价。对于许多人来说,过大的杀伤力很可能不值得这样做。您应该以最有利的方式随意构建系统。对简单性和效率的担忧很可能导致偏离纯微服务架构。代价将是额外的耦合,这会引入自身的复杂性,例如服务之间的无形交互以及对您自由部署和扩展的限制。