如何理解微服务架构,组件化服务,容器化管理,集群化调度

2019-12-26   道以致远



前言

在介绍了有关Web应用程序的发展过程后,我们今天来说一下微服务架构,说起微服务架构可以说是现在最为流行的云服务应用开发框架。

严格来说微服务这种理念不是今天才有的,在以前就有人不断地尝试过,只不过是由于当时基础技术不够成熟,造成了其不能被大部分开发社区接受。

比如最早从SOA的概念来看,就有很多企业采用了虚拟机来运行组件化服务来构建企业级应用,可惜由于虚拟机本身需要带有操作系统,其过于重量级无法灵活的使用,同时其启动和关闭都过于缓慢繁杂,也导致了在一台服务器上安装多个虚拟机来运行多个组件化服务变的异常的繁杂难以维护,自然这个方向的发展就举步维艰。

容器技术的出现

而随着服务器虚拟化技术的发展,进而产生了在操作系统上进行容器化产生了Docker这样的容器化产品,让服务组件化运行的环境摆脱了操作系统的沉重包袱,只需要在操作系统级别上借助虚拟化的硬件平台,可以安装多个具体应用的容器,多个容器共享虚拟化的硬件平台而相互不会产生干扰。

如果我们在以前想通过协调管理多个虚拟机上运行的组件化服务来完成应用程序构建障碍重重的话,现在摆脱了操作系统束缚的容器化应用成为了理想的组件化服务运行基础。

可以说有了Docker这样的容器化基础应用,让我们的服务器突然有了一个基于操作系统的多插头插盘。

它能够抽象操作系统管理的像CPU,内存,存储和网络等所有重要资源,让我们根据具体应用的需要在组织和配置管理这些资源构建一个专门的运行环境。

而这些容器型的环境能够做到相互隔离,又能够通过指定的协议进行通信交互。

这跟我们前面说的所有的编程本质就是数据的隔离和交互通道的建立和管理一个道理。



微服务架构

关于微服务,它作为现在流行的软件开发架构,要想真正理解它,必须从软件架构的演化历史来看。

最初我们开发的应用程序是运行在计算机上的,由硬件主导计算机性能时代,我们开发的应用主要针对单台计算机的。

我们要提供应用的性能主要靠提高计算机本身的处理能力,于是大型计算机作为主服务器成为运行应用程序的主流。

到后来的服务器的小型化,但是还是没能摆脱硬件主导应用性能的架构。这个阶段主要是复杂的大型应用集中运行在大型计算机上。

随着计算机的普及,特别是个人电脑算力的提升,开始将服务器的部分运算转移到个人电脑上运行,于是就出现了客户端-服务器架构的应用。

在这种应用架构下,客户端负责处理简单的一些显示和初步处理操作,由服务器来运行主要的业务逻辑,这就是典型的C/S架构。

我们在使用C/S架构过程中,针对应用程序进行了功能的部分分离设计,开始出现专用的服务,如此就开始出现了对该架构的设计进行分层。

出现了表现层,业务逻辑层,数据层存储层等经典三层或者N层模式架构。

这些在我们应用程序开发过程中已经成为经典架构模式,当然我们在操作这些分层设计时也会对具体的功能进行进一步的分层,比如MVC的逻辑分层。

SOA架构与微服务

在到后来发展对企业级服务集成而设计的SOA架构。在这一阶段主要解决的是企业各服务之间的交互和集成。为此引入了数据总线概念,通过消息的标准接口协议定义来统一各服务组件之间的数据传输和交换。

我们知道在SOA架构中强调的是企业内部各个基础服务的整合和集成,每个集成组件都是一个功能完备的系统,它们能够通过向数据总线发送消息来跟与其本身异构的其它服务系统进行数据交换和服务响应。

而现在流行的微服务,从某种程度上说是SOA架构的细粒度化,通俗一点说就是将原来庞大巨型的应用系统垂直拆分成功能专一的组件化服务,从表现层一直到底层数据存储服务等垂直化组合,由于容器技术的支持,使之成为完全可以自主治理的独立服务组件。



微服务架构优势

微服务最大的特点就体现在其可伸缩性,以及性能的弹性,服务的稳定性等特点。

在过去我们传统的巨型集中体应用程序中,系统的各个功能是运行在同一个系统进程中的多个线程,这对我们对系统的维护和升级提出了极大的挑战。

特别是随着我们业务的增加,处理能力的扩容变的异常困难,如果系统某个部分功能出现问题需要修补,就需要对整个应用程序进行维护升级。

这让一些要求7X24小时服务的应用来说,稳定的可用性成为一个限制服务升级的最大问题。

在另外一种情形中,如果我们的应用程序对数据的处理能力是分时的,比如白天时间段并发处理能力要求会达到一定的峰值,而到了夜间需要处理的数据量就会回到低谷,峰值和低谷之间差别太大,我们传统的单体集成应用程序无法只能按照最大峰值来配置和部署应用,并接受在夜间低谷时大量的处理能力闲置浪费。

也就是不能够弹性灵活的管理服务的性能。

在系统的某个部分出现故障时,会让整个应用服务崩溃无法提供服务,比如某台数据库服务器出问题,无法提供正常的数据访问,前端某台web服务器阻塞,使得用户对我们系统的访问无法及时响应等。这些在传统的单体集成应用程序架构下是常见的问题。也就是说无法保证系统的稳定可靠性。

而上面所说的问题,在微服务系统架构下都得到了完美的解决。

怎么解决的呢? 首先微服务将系统从功能上做了简化,秉持着服务功能单一设计的原则,将系统的单一功能进行垂直化切割,使其成为一个独立的可独立部署并自我治理的组件服务。

功能越单一出错的几率就越小,可维护性就越强,同时微服务基础架构中引入了快速死亡的设计理念以及断路器模式,因为微服务基础架构的基础是底层网络连接和通信,很显然从所有功能组件都作为同一个单体集中应用进程的线程转变为微服务框架下,独立运行在一个单独主机或容器里的独立进程,其服务之间的通信从线程间调用(函数或者方法调用)转变为进程间调用(IPC)或者网络连接访问(HTTP访问)。

如此一个微服务架构的系统变成了一个运行在服务集群各个节点的多个服务相互之间通信串联而成的应用。而容器技术和容器的管理调度应用从出现,让管理每个服务组件的运行状态,以及对于某个服务节点的管理变的简单而直接。



微服务使服务集群化

简单说来我们可以通过容器管理调度程序来动态的部署和安装某个服务组件,也能够随时监控某个节点的服务是否正常,在出现问题,达不到预期性能指标时通过管理调度程序将该节点的组件服务关闭,并从能够提供服务的节点列表中撤出,不再参与对外提供服务。

而对于外部访问请求,则是通过前端请求路由组件路由到运行正常的服务节点来处理,而出现问题的服务节点可以通过断路器模式,一方面阻断外部请求的传入,一方面不断的去检查服务可用性,直到服务被重新启动并加入到可以提供服务的服务节点列表里,断路器会恢复对路由请求的处理。

从而保证了我们系统的任何一个服务都能够有对等的多个服务冗余集群来提供服务,而不会因为某个节点的故障而影响到整个系统的运行。

同时由于采用冗余的集群化服务节点矩阵来替代单个服务节点,能够更好的根据外部请求的流量来动态的调整参与处理的服务节点数量,即在流量增加超过某个峰值时动态的启动新的服务组件来增加并发处理能力,当访问流量降低到某一个阈值时,可以动态的关闭某些空闲的服务节点,已达到服务的弹性扩容和收缩。

由于采用了集群式的对等性服务组件对外提供服务,如此能够保证个别节点出现问题,不会影响对外服务的提供。从而大大加强了我们服务的可靠性和稳定性。

当然微服务做到这些,是要付出代价的,也就是其实现的复杂程度比起单体集中式巨型应用程序架构不知增加的多少倍,但是现在很多大公司和技术社区都在对它做很多的底层基础服务的研究和开发,尽量的简化微服务实现的复杂性成本。



流行微服务开发框架

比如我们现在流行的阿里巴巴公司贡献给开源社区的Apache Dubbo以及老牌Spring社区里组织实现的各个版本的Spring Cloud伞包项目。

其中Dubbo最初实现的是一个进程间远程过程调用(RPC)开发管理框架,支持多种协议的通信。

而Spring Cloud项目提供的技术组合则是基于Spring框架的技术系列,提供了基于HTTP网络通信访问协议的开发框架,主要支持基于HTTP REST API的开发。

说到微服务架构不得不提另外一家公司那就是奈飞(Netflix),它算是最早研究微服务架构实现的公司,因为其网上租碟片的内容查询和在线观看业务的需要,开始研究影片内容的量子化切片查询和在线观看时庞大的流量支持,让他们的原来的单体集中式架构无法继续支撑才开始通过很多悬赏挑战赛形式在微服务架构方面进行了大量的研究,它们将研究结果贡献给了开源社区,并在Spring Cloud项目中提供了一套它们的解决方案包。

简单来说,要实现从线程间调用到独立进程间或者跨网络访问的调用,需要实现的基础设施包括组件服务的列表管理,服务节点之间的连接和活性检测,复杂服务调用的分解和合并,服务集群管理,服务稳定性监控等等一些列的内容。其实其本质还是基于网络的数据流处理。当然这些流行的解决方案并没有直接的采用JDK提供的IO或NIO类库来开发,而是大都采用了目前比较流行的第三方网络基础架构实现Netty。

总结

这里我只是大体的理了理现代应用程序是如何过渡到现在流行的微服务架构的,重点说了一下微服务架构的特点和它解决的痛点。以及现在流行的微服务开发的基础框架特点,希望能够为想学习微服务架构开发的同学提供一个整体的思路,知道从哪里下手去学习。

当然,由于篇幅限制不能对每一个点具体展开来讲其原理和实现。希望以后能够找时间对微服务的基础开发设施内容做一下详细的讲解。