服务拆分的策略
绞杀者模式
绞杀者模式(Strangler Pattern)最早由Martin Fowler提出[10],指的是在现有系统外围将新功能用新的方式构建为新的服务的策略,通过将新功能做成微服务方式,而不是直接修改原有系统,逐步实现对老系统的替换。采用这种策略,随着时间的推移,新的服务就会逐渐“绞杀”老的系统。对于那些规模很大而又难以对现有架构进行修改的遗留系统,推荐采用绞杀者模式。
修缮者模式
修缮者模式就如修房或修路一样,将老旧待修缮的部分进行隔离,用新的方式对其进行单独修复。修复的同时,需保证与其他部分仍能协同工作。从这种思路出发,修缮者模式更多表现为一种重构技术。修缮者模式在具体实现上可以参考Martin Fowler的Branch By Abstraction重构方法。
这种模式的实现方式可以分成三个主要步骤。
抽象层提取
首先通过识别内部的待拆分功能,对其增加抽象接口层,同时对原有代码进行改造,确保其同样实现该抽象层。这样在依赖关系上就添加了一个中间层。
抽象层实现
为抽象层提供新的实现,新的实现采用微服务方式。
抽象层替换
采用新的实现对原有的各个抽象层实现进行逐步替换,直至原有实现被完全废弃,从而完成新老实现方式之间的替换。
管理服务的依赖关系
构建无环依赖架构
依赖关系有三种基本的表现形式,其中类似Service1依赖于Service2这种直接依赖最容易识别和管理;间接依赖即直接依赖关系的衍生,当 Service1 依赖Service2,而Service2又依赖Service3时,Service1就与Service3发生了间接依赖关系;而所谓循环依赖就是 Service1 和 Service2 之间相互依赖,循环依赖有时候并不像图中描述的那么容易识别,因为产生循环依赖的多个组件之间可能同时存在各种直接和间接依赖关系。
根据无环依赖原则(Acyclic Dependencies Principle,ADP),系统设计中不应该存在循环依赖,该条原则对于微服务架构而言同样适用。消除循环依赖的基本思路就是通过在两个相互循环依赖的组件之间添加中间层,变循环依赖为间接依赖。
有三种策略可以做到这一点,分别是上移、下移和回调。
上移
关系上移意味着把两个相互依赖组件中的交互部分抽象出来形成一个新的组件,而新组件同时包含着原有两个组件的引用,这样就把循环依赖关系剥离出来并上升到一个更高层次的组件中。
例子:
上移:
下移:
回调:
我们抽象出一个 Calculator 接口用于封装金额计算逻辑,该接口与Order处于同一层次,而User则实现了该接口,这样Order对User的依赖就转变成Order对Calculator接口的依赖,也就是把对User的直接依赖转变成了间接依赖。通过依赖注入机制,我们可以很容易地实现Order和User之间的有效交互。