dram.me

分层化面向服务架构设计

补遗

  1. 有两点需要补充:1. 强调服务无状态性的重要性;2. 同层服务应尽量避免相互依赖,相互依赖问题可以通过拆分模块分属上下层解决。—— 2016-11-02

  2. 该架构与分治模型的区别:分治模型总体上是一个线性化模型,模块间关系是序列化结构。而分层服务架构藉由上层实现下层的平面化编排,并依托层次结构实现立体化,表达能力上要强于分治模型。—— 2016-11-06

  3. 该架构的应用场景:不仅适用于计算机技术领域,在组织管理架构、组织和个人规划等方面都可以应用。—— 2016-11-06

  4. 从全局来说,在本架构中基于对象的抽象在两个层面有体现:一是各服务作为独立对象(单例模式),二是服务间交互的数据为基础的数据结构,在面向对象语言中一般基于继承模型设计。总结来说,一类对象是对数据的抽象,另一类对象是对操作的抽象。—— 2016-11-07

  5. UNIX哲学某种意义上说也是服务化思想的体现,功能单一的命令是独立服务,服务之间以文本的数据模式通信。而复杂程序基于各种命令组合,则体现了分层结构的思想。—— 2016-11-09

  6. 当前RESTful服务的流行,是基于服务架构的广为熟知的应用,而其上承载的重要数据类型JSON,则是数据透明很好的体现。—— 2016-11-11

  7. Eric Evans在《领域驱动设计》第4章中提及Layered Architecture,并指出典型的分层架构包括四层:用户界面层(或表示层)、应用层、领域层(或模型层)、基础设施层。应用层和领域层的区分有点类似于OpenStack中Heat和Nova、Neutron的区别。—— 2016-11-25

  8. 在《领域驱动设计》第5章中Eric Evans将对象细分为Entity和Value Object两种形式,并引入Service和Module概念作为组成领域模型的基本元素。这样的概念分类可作参考。—— 2016-11-25

  9. 模块和过程嵌套的讨论中可以发现,模块具有状态性,而分层服务化架构更多的要求是无状态化。进一步分析可以得出,此架构需要的是模块提供的名字空间的隔离和组织,而不是模块包含的状态特性。—— 2017-01-21

  10. 分层模型在较细微的程序设计问题中也可以应用。例如删除约束问题,在删除对象时,可能该对象被其他对象依赖,此时是允许强制删除还是不允许呢?可以将关联对象分层,上层对象基于下层对象构建,在上层对下层还有依赖时,下层不允许被删除。另外,对象之间关系的管理,也可以先经由分层,然后归属到上层管理,这和依赖关系相一致。—— 2017-03-11

在复杂系统架构设计中,面向服务的设计是应用广泛并行之有效的一种理念模式。而这里提到的“分层化面向服务”则是对此的进一步完善。

具体来说,整体架构首先以层次划分,类似于OSI七层网络模型,或者云计算中IaaS、PaaS和SaaS的层次结构划分。上层功能依赖下层实现,下层以服务模式为上层提供接口。各层以独立服务化为单元拆分模块,同层服务间相对独立,允许部分依赖。

各层及各模块间交互流动的数据,以基础数据类型组织,以此保持数据结构上透明性。模块内部数据允许适度的抽象。

以上模式在Self中借助于对象的嵌套定义以及天然的单例模式可以方便地实现,而对于基于类的面向对象语言,则可能需要结合嵌套的模块机制实现。再如Squeak中,没有多层模块化的名字空间划分,在实现上述机制时就显得有点吃力。不过可以基于包名称以及类名称做折衷的方案。

另外一点值得注意的是,以上架构并没有应用面向对象的继承机制,继承机制更适用于小范围的模块内部实现,而整体架构设计上引入继承会增加模块间的耦合性,从而带来更多的复杂性。