好的服务要满足两个原则:低耦合与高内聚。
松耦合。如果做到了服务之间的松耦合,那么修改一个服务就不需要修改另一个服务。使用微服务最重要的一点是,能够独立修改及部署单个服务而不需要修改系统的其他部分。
高内聚。我们希望把相关的行为聚集在一起,把不相关的行为放在别处。因为如果你要改变某个行为的话,最好能够只在一个地方进行修改,然后就可以尽快地发布。
所以找到问题域的边界就可以确保相关的行为能放在一个地方,并且他们可以与其他边界以尽量松耦合的形式进行通信。
任何给定的领域都包含多个限界上下文,每个限界上下文中的东西分成两部分,一部分不需要与外部通信,另一部分则需要。每个上下文都有明确的接口,该接口决定了他会暴露哪些模型给其他的上下文。
限界上下文是一个由显式边界限定的特定职责。细胞之所以存在,是因为细胞膜定义了什么在细胞内,什么在细胞外,并且确定了什么物质可以通过细胞膜。
两个上下文之间可以有共享模型。应共享特定的模型,而不应该共享内部,就可以避免潜在的紧耦合。我们还识别出领域内的一些边界,边界内部是相关性比较高的一些业务功能,从而得到高内聚。模块边界成为绝佳的微服务候选。微服务应该清晰地和限界上下文保持一致,那么你就跨出了走向高内聚低耦合的微服务架构的第一步。
过早将一个系统划分成微服务的代价非常高,尤其是在面对新领域时。很多时候,将一个已有的代码库划分成微服务,要比从头开始构建微服务简单得多。当你在思考组织内的限界上下文时,不应该从共享数据的角度来考虑,而应该从这些上下文能提供的业务功能来考虑。