http://kaelzhang81.github.io/2017/09/14/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%B9%9D%E5%A4%A7%E7%89%B9%E6%80%A7/ 作者:Kaelzhang on September 14, 2017


微服务的九大特性是微服务架构风格的重要设计原则。在Martin Fowler的官方博客上有详细阐述。不过由于该文篇幅比较大,阐述略为细致,对于读者来说不好把握其重点,故通过本文对其进行提炼总结。

特性一:“组件化”与“多服务”

解释 通过服务的方式实现系统的组件化。
原因

  1. 服务可独立部署、发布
  2. 服务接口更加明显(explicit)

说明 组件:被链接到程序,通过内存中的函数来调用。 服务:进程外的组件,通过诸如web service请求或RPC的机制通信。

特性二:围绕“业务功能”组织团队

解释 通过业务的划分来组件团队。
原因

  1. 端到端的业务服务(全栈、自治)
  2. 有效降低变更成本
  3. 团队边界更清晰

说明 传统组织是按照技术层面划分的,例如: UI团队、后台团队和数据库团队。该划分方式的弊端是当业务变更发生时,需要跨团队才得以完成,成本比较高。

特性三:“做产品”而不是“做项目”

解释 以做产品的方式来开发服务,对其整个生命周期(包括:测试、部署及运维)负责。
原因

  1. 做项目相当于奶妈,做产品类比于亲妈
  2. 微服务更便于掌握和维护

说明 对单体架构产品也适用,不过其由于关注面更大,导致难度更大。另外想强调的内容是“谁构建,谁运行”这一DevOps理念。

特性四:“智能端点”与“傻瓜管道”

解释 服务自身需要能够自治,服务之间的交互要轻量化。
原因

  1. 像经典Unix的“过滤器”(filter)那样来工作
  2. 轻量级的通信方式更易整合
  3. 与ESB的中心化和哑服务形成对比

说明 轻量级通信机制:

  1. 使用HTTP协议的RESTful API或轻量级的消息发送协议,来实现信息传递与服务调用的触发。
  2. 通过在轻量级消息总线上传递消息,类似RabbitMQ等一些提供可靠异步交换的结构。

  3. 特性五:“去中心化”地治理技术

    解释 技术实现方案无需“中心化”指定,而根据服务自身情况来选择。
    原因

  4. 采用轻量级的契约定义接口

  5. 服务之间的交互对技术选型不敏感

说明 不是每一个问题都是钉子,不是每一个方案都是锤子。

特性六:“去中心化”地管理数据

解释 服务的数据持久化也是自管理的,无需统一安排。
原因

  1. 服务之间的数据交互仅能通过服务接口来完成。
  2. 无需数据库层面的数据共享

说明 方式:

  1. 数据库中的存储内容拆分到新的同平台的其他数据库实例中
  2. 对具有特殊结构或业务特性的数据存储到其他技术的数据库实例

问题: 数据一致性也成为“微服务”架构中急需解决的问题之一,强调最终一致性。

特性七:“基础设施”自动化

解释 必须一开始就构建起“持续交付”平台来支撑整个实施过程。
原因

  1. 由原来的单系统编程多系统
  2. 云计算、容器技术以及DevOps的发展

说明 自动化测试:每次部署前的强心剂,尽可能的获得对正在运行软件的信心。 自动化部署:解放繁琐枯燥的重复操作以及对多环境的配置管理。

特性八:“容错”设计

解释 微服务整体复杂性比单体架构要高,故其需要更强调“容错”设计。
原因

  1. 服务数量多,依赖关系复杂
  2. 故障定位困难
  3. 微服务存在“雪崩效应”

说明 “雪崩效应”: 如果在A服务的链路上某个或几个被调用的子服务不可用或延迟较高,则会导致调用A服务的请求被堵住,堵住的请求会消耗占用掉系统的线程、io等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃。
方式:

  1. 故障检测
  2. 自动恢复

特性九:“演进式”设计

解释 控制变化并不一定意味着要减少变化,当变化发生时架构要进行演进
原因

  1. 服务可独立更换和升级
  2. 需求变化是必然发生的

说明 必须要考虑当一个服务发生变化时,依赖它并对其进行消费的其他服务将无法工作

参考资料:

  1. https://martinfowler.com/articles/microservices.html
  2. https://mp.weixin.qq.com/s?__biz=MjM5MjEwNTEzOQ==&mid=401500724&idx=1&sn=4e42fa2ffcd5732ae044fe6a387a1cc3#rd
  3. http://blog.didispace.com/20160917-microservices-note/