Martin Fowler在Microservices一文中,提炼出了微服务架构的九大特性,用于指导大家设计架构。
1. 服务组件化
- 组件,是一个可以独立更换和升级的单元。就像PC中的CPU、内存、显卡、硬盘一样,独立且可以更换升级而不影响其他单元。
2. 按业务组织团队
- 由于每一个微服务都是针对特定业务的宽栈或是全栈实现,既要负责数据的持久化存储,又要负责用户的接口定义等各种跨专业领域的职能。因此,面对大型项目的时候,对于微服务团队的拆分更加建议按业务线的方式进行拆分,一方面可以有效减少服务内部修改所产生的内耗;另一方面,团队边界可以变得更为清晰。
3. 做“产品”的态度
- 在实施微服务架构的团队中,每个小团队都应该以做产品的方式,对其产品的整个生命周期负责。
4. 智能端点与哑管道
- 在单体应用中,组件间直接通过函数调用的方式进行交互协作。
- 而在微服务架构中,由于服务不在一个进程中,组件间的通信模式发生了改变,若仅仅将原本在进程内的方法调用改成RPC方式的调用,会导致微服务之间产生烦琐的通信,使得系统表现更为糟糕,所以,我们需要更粗粒度的通信协议。
- 在微服务架构中,通常会使用以下两种服务调用方式:
- 第一种,使用HTTP的RESTful API或轻量级的消息发送协议,实现信息传递与服务调用的触发。
- 第二种,通过在轻量级消息总线上传递消息,类似 RabbitMQ 等一些提供可靠异步交换的中间件。
5. 去中心化治理
- 在实施微服务架构时,通过采用轻量级的契约定义接口,使得我们对于服务本身的具体技术平台不再那么敏感。
- 这样整个微服务架构系统中的各个组件就能针对其不同的业务特点选择不同的技术平台,终于不会出现杀鸡用牛刀或是杀牛用指甲钳的尴尬处境了。
6. 去中心化管理数据
- 我们在实施微服务架构时,都希望让每一个服务来管理其自有的数据库,这就是数据管理的去中心化。
- 虽然数据管理的去中心化可以让数据管理更加细致化,通过采用更合适的技术可让数据存储和性能达到最优。但是,由于数据存储于不同的数据库实例中后,数据一致性也成为微服务架构中亟待解决的问题之一。
- 分布式事务本身的实现难度就非常大,所以在微服务架构中,我们更强调在各服务之间进行“无事务”的调用,而对于数据一致性,只要求数据在最后的处理状态是一致的即可;若在过程中发现错误,通过补偿机制来进行处理,使得错误数据能够达到最终的一致性。
7. 基础设施自动化
- 当我们实施微服务架构时,数据库、应用程序的个头虽然都变小了,但是因为拆分的原因,数量成倍增长。这使得运维人员需要关注的内容也成倍增长,并且操作性任务也会成倍增长,这些问题若没有得到妥善解决,必将成为运维人员的噩梦。
- 所以,在微服务架构中,务必从一开始就构建起“持续交付”平台来支撑整个实施过程,该平台需要两大内容,缺一不可。
- 自动化测试:每次部署前的强心剂,尽可能地获得对正在运行的软件的信心。
- 自动化部署:解放烦琐枯燥的重复操作以及对多环境的配置管理。
8. 容错设计
- 在单体应用中,一般不存在单个组件故障而其他部件还在运行的情况,通常是一挂全挂。
- 而在微服务架构中,由于服务都运行在独立的进程中,所以存在部分服务出现故障,而其他服务正常运行的情况。
- 在微服务架构中,快速检测出故障源并尽可能地自动恢复服务是必须被设计和考虑的。
- 通常,我们都希望在每个服务中实现监控和日志记录的组件,比如服务状态、断路器状态、吞吐量、网络延迟等关键数据的仪表盘等。
9. 演进式设计
- 随着系统的发展或者业务的需要,将一些经常变动或是有一定时间效应的内容进行微服务处理,并逐渐将原来在单体系统中多变的模块逐步拆分出来,而稳定不太变化的模块就形成一个核心微服务存在于整个架构之中。