1.1 微服务架构的特点
在介绍微服务架构之前,我们先来看看云原生的概念。
云原生的概念,最早由Pivotal团队的Matt Stine于2013年提出。这个概念提出之后,在各大社区掀起了讨论的热潮,并得到了社区的不断完善。顾名思义,云原生是指专门为云平台部署和运行而设计的应用。云原生包含的内容非常多,包括DevOps(开发运维一体化)、持续交付、微服务、敏捷基础设施和12要素等几大主题。
2015年,Linux基金会领头成立了云原生应用基金会(Cloud Native Computing Foundation,CNCF),它致力于云原生技术的普及和可持续发展。CNCF认为云原生系统必须包含的属性有:容器化封装、自动化管理和面向微服务。
现在我们来看看微服务架构的概念。
据说早在2011年5月,在威尼斯附近的一个软件架构师研讨会上,就有人提出了微服务架构设计的概念,用它来描述与会者所看见的一种通用的架构设计风格。时隔一年之后,在同一个研讨会上,大家决定将这种架构设计风格用微服务架构来表示。
刚开始,对于微服务架构是没有一个完整的描述的,其可以看到的主要特征就是小型化、细粒度,以及使用轻量的HTTP通信等。
2014年3月,在James Lewis和Martin Fowler发表的一篇博客文章中,总结了微服务架构设计的一些共同特点。下面摘录的一段描述,被普遍认为可以作为微服务架构的定义:
“简而言之,微服务架构是将单个应用程序作为一组小型服务开发的方法,每个服务程序都在自己的进程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。这些服务是围绕业务功能构建的,可以通过全自动部署机器独立部署。这些服务可能用不同的编程语言编写,使用不同的数据存储技术,并尽量不用集中式方式进行管理。”
上面提到的单个应用程序是指传统设计中的一个应用系统,或者一个大型应用,现在大家流行把它叫作单体应用。
可以看出,微服务架构是将一个大型系统使用小型化分割的方法,按业务功能拆分成各种独立的小应用。在各个小应用之间,可以使用轻量机制,即基于RESTful的HTTP进行通信,并以这种通信方式替换原来在程序之间直接调用的方式。微服务就是通过这种架构设计方法拆分出来的一个个独立的小型应用。
将一个大型系统分割成一些小型应用,而小型应用之间通过HTTP进行整合,这就是微服务架构的精髓所在。我们可以用一句通俗易懂的话来概括,那就是“分而治之,合而用之”。
从上面微服务架构的描述中,我们可以概括出微服务架构的几个显著特点。
1.小型化
微服务架构的突出之处就是小型化应用设计,最显著的特点就是应用程序变小了,以小为美。小型化的方式,使每个程序只负责完成一定范围内的业务功能,可以更加专一地做好一件事情。这是我们日常解决复杂问题的常用手法,即“大事化小,小事化无”。
2.自治化
每个微服务都是一个独立的应用,独立使用数据库,独立部署,独立运行。这种独立性符合高内聚松耦合的设计原则。在微服务开发和维护过程中,每个微服务都是独立自治的,一个服务的更新和迭代不会依赖于其他服务,同时也可以尽可能做到不对其他服务造成影响,或者可以将这种影响降到最小。
3.扁平化
去中心化的扁平化管理,可以更加自由地发挥每一个微服务的优势。但是这种自由并不是随意的混搭和组合,而是使用智能化的服务治理,让更多的微服务在发挥个性优势的同时,处在一种杂而不乱的有序可控的范围之内。虽然从整体上微服务已经没有集中管理的概念,但是微服务可以从全局范围出发,发挥更佳的性能优势。
4.轻量级设计
微服务小型化的特点,就是轻量级设计方法的最好体现。这种轻量级的设计同样体现在微服务的通信设计之中。微服务之间的常用通信方式有两种,一种是使用轻量的REST协议进行API式的同步通信,另一种是使用轻量的异步消息通信。
5.渐进式设计
一个产品从成型到成熟是要经历一个过程的,这个过程是渐进式设计的。由于微服务小型而独立的特点,使得微服务设计可以以业务驱动的方式进行快速迭代,从而不断修正和调整,使产品趋于成熟。所以,微服务非常适合敏捷开发。