目录
计算机小史
传统的应用开发
模块化应用开发
Web应用程序的出现
Web应用程序激增的复杂度
单体架构的缺点
一个更好的部署方式
微服务架构
微服务的优点
微服务带来的问题
云原生可谓是当下IT领域的技术热点,对它的定义不同的组织众说纷纭,但在这些不同的定义当中总少不了微服务的身影。
众说纷纭的云原生
可见,想要深入了解云原生就必须得了解微服务。微服务究竟是什么,接下来就让我们一探究竟。
计算机小史
谈起微服务,不妨先让我们乘坐时光机,回到根本没有任何所谓微服务的年代,回到那个计算机大到足以填满整个房间的年代。操作计算机的科学家需要走到一台庞大的机器前,给计算机下达指令,计算机紧接着接受指令,执行指令。
世界上第一台电子计算机
时间快进到台式机的年代,程序依旧运行在台式机上,应用程序包含它所需要执行的所有指令。人们编写完应用程序,紧接着代码经过编译,编译的文件会一次性安装在计算机上,并且它会一直在同一台计算机上。
台式机时代
可以看到,这种历史很大程度上影响了应用开发的方式。
传统的应用开发
在传统的应用开发中,编写应用程序需要先启动一个新的代码项目,然后为实现各种各样的功能在项目里编写一系列代码,紧接着构建为一个整体,部署在用户的机器上。
传统的应用开发:编码、构建、部署
应用需要的功能越多,就需要编写添加更多的代码。所以项目的代码量会随着时间的推移逐渐增加。最初一个小型的代码库可能会随着时间的推移,变成一个大型复杂的代码库。大量的代码堆放在一起,最终成为一堆乱七八糟的代码库,管理代码成为了一件令人头痛的事情。
难以管理的代码库
模块化应用开发
随后人们意识到,有为处理大型项目更好的方法。开发人员将一个庞大的项目分解为一个个小模块,而不是把所有东西都放在一起,成为一堆乱七八糟的代码库。创建更小的模块,这些模块再组合得到应用程序。这些模块相互独立,专注实现部分功能。此外,这些模块是可重新使用的,因此可以将一个模块简单地添加到另一个项目以帮助另一个应用程序。
模块化的代码结构
和传统的应用开发一样,开发人员编写完代码,随后将代码构建为一个整体,将其整个部署在用户的机器上。
模块化应用开发
这里需要注意的一点是,在编写应用程序时,代码结构是呈模块化的,是相互独立的功能模块,这些模块组合在一起构成了应用程序。虽然代码结构是模块化的,但是最终所做的依旧是将它们组合成一个应用程序。当构建并运行它时,所有的模块都被混合成一个庞大的不可分离的程序,随后被部署在机器上。无论开发人员如何模块化并组合他们的源代码,最后的可执行文件只有一个,所有的模块混合在一起。
大多数时候,开发人员很乐意用这种方式来开发和部署应用程序。但是随后出现了两件事,彻底改变了这种局面,改变了我们构建应用程序的方式。
Web应用程序的出现
首先是Web应用程序的出现,人们开始从需要部署在用户机器上的桌面应用程序转向Web应用程序,这些Web应用程序安装在网络上某处的远程服务器上。
Web应用程序问世
在Web应用程序中,用户通过浏览器访问远程服务器,服务器再以HTML文件的形式返回用户所需要的结果。实际上应用程序没有部署在用户的机器上,而是部署在服务器的某个地方,用户只使用了浏览器,用户的请求会转交给服务器,然后服务器返回一个响应。
Web应用的运行方式
Web应用程序的出现究竟又是怎样改变了局面呢?
最初它并没有掀起什么波澜,唯一的改变是程序部署方式的改变。开发人员不再将应用程序安装到每一台用户机器上,而是安装到一台服务器上,所有用户通过浏览器来访问该服务器。此外,在这样的部署方式当中,代码依旧是清晰有条理的模块化组织结构,但这些模块到最后都混合组成一个应用程序。只不过原先是在用户机器上混为一体,而现在是在某个服务器上混为一体。
真正扭转局面的,还得结合另一层次的原因,即Web应用程序激增的复杂度。
Web应用程序激增的复杂度
这些年应用程序发生了另一种转变,Web应用程序随着时间的推移变得格外复杂。最初的Web应用程序只拥有非常简单的功能,但随着时间的推移,Web应用程序开始变得更好、更大、更快、更复杂。比如目前某些搜索引擎可以使我们在几毫秒内,从整个互联网中找到我们想要的东西。
Web应用程序发展迅猛
然而这些了不起的壮举背后是极其复杂的代码,这种复杂性不仅体现在代码本身,还体现在构建部署等方面。变得越来越难以维护的复杂性带来了一系列麻烦的问题。简而言之,Web应用的出现,以及它日益激增的复杂度,使得部署单一的应用程序不再行得通了。
单体架构不再行得通
这种部署单一应用程序的方式被称为单体架构。在这种的新的局面下,单体架构因为它暴露出的缺点而行不通了。那么单体架构又暴露出了怎样的缺点呢?
单体架构的缺点
1.部署难
第一个缺点体现在部署上。部署的程序越大,部署越具有挑战性。每次在部署程序时,因为任何地方都可能引入错误,开发人员不得不去测试整个程序。
2. 扩展性差
第二个缺点体现在它的扩展性上。以一个大型在线电子商务网站为例,它有着非常难以预测的流量高峰,在促销的时候流量大量涌向网站,促销过后流量随即放缓。流量有高峰也有低谷。为了应对这种流量的变化,现在有弹性服务器,当流量激增时,应用服务器实例的数量会增加,当流量恢复正常时,额外的服务器就会退役。
现在有一个电子商务网站部署为一个整体,这个整体具有购物功能、退货功能等其他一系列功能。假设网站购物模块迎来一个流量高峰,服务器数量随之增加。这里的关键点在于,除了购物模块,其他功能模块也会随之扩展 ,尽管没人使用它们,但它们必须扩大规模,因为它们部署时是作为一个整体存在的。所以,一个大型电子商务网站在迎来流量高峰时,必须花费更多的钱来创建这些重复不必要的模块,而真正需要扩大规模的模块只占其中很小一部分。
此外单体架构还存在一系列其他的缺点。在这种局面下,人们想到一种更好的部署方式。
一个更好的部署方式
在将应用部署到用户机器上时,我们不得不将整个应用部署到机器上,我们没有其他的选择。但对于Web应用程序的来说,就可以存在其他的部署方式,应用程序实际部署在服务器上。用户不用关心应用程序在哪里、部署以及执行的情况,他们只需要一个入口来与应用程序对话。在这种情形下,新的部署方式是,我们并不将整个应用程序混合成一个整体部署在一台机器上,而是将应用程序拆分为更小的迷你应用程序, 然后将这些迷你应用程序部署在不同的机器上,然后让它们通过网络相互通信、协同运作,最终作为一个应用程序来工作。
拿电子商务应用来举例,开发人员可以创建一个仅具有购物目录功能的购物目录应用程序,并将其部署在单独的服务器上,订单应用程序部署在另一台服务器上,配置文件应用同样部署在其他应用程序上。假设用户想要查看购物目录,视图应用程序对目录应用程序调用,然后视图应用程序返回结果。就像这样,许多应用程序通过网络相互调用相互通信,来从对方那里获得他们想要的任何东西。
这样做的好处首先是降低了部署的风险。对迷你应用程序进行更改时,因为它是一个单独的应用程序,只需单独测试该应用程序应用即可,而不用去测试剩余的应用程序。第二个好处体现在灵活的扩展上。在流量高峰期,只需扩展购物目录应用程序,将需要更多副本的应用程序部署在更多的服务器上。而这些迷你、相互独立相互协作的应用程序被称为微服务。
微服务架构
微服务是一种新的应用架构,它将应用程序分解为可以独立运行在不同硬件或服务器上的应用程序,这些独立的应用程序相互通信并协同工作,最终得到用户所需要的应用程序。在微服务的架构下,除了在代码编写中能够实现各个模块的独立,在程序部署时也能实现各个功能模块的相互独立。不需要构建和部署一个应用程序,而是会有好几个应用程序,每个应用程序独立实现一些小的功能,在运行时协同工作,从而形成实际的完整应用。
微服务的优点
1.部署灵活:微服务的优势体现在部署的灵活性,不同的团队可以独立创建和应用微服务,他们可以将它们放在不同的服务器上。
2. 技术灵活:微服务甚至可以用不同的语言或平台构建。因为微服务相互通信,所以实际使用的语言无关紧要,开发人员不需要统一使用语言和平台。
3. 扩展灵活:微服务还可以实现独立扩展,在购物流量高峰期间,它们还可以单独扩展,只需要扩展最常用的微服务即可,其他微服务不受影响。
微服务带来的问题
微服务架构带来巨大的好处的同时也带来了一大堆问题。
1.划分问题:先前是处理一个应用程序,现在却要处理数十个或数百个微服务形式的迷你应用程序。在将应用程序分离为微服务时,如何将它们划分得相互独立,是关键的一个问题。我们不想要修改一个功能时,需要对十个不同的微服务进行修改,所以需要考虑如何很好地将程序分离。
2. 通信问题:另一个问题是,如何确保微服务能够发现彼此,相互调用。
无论是单体架构还是微服务架构,它们没有好坏之分,只有适合不适合。这些不同的架构各有千秋,问题的关键在于针对具体的问题选用合适的架构。无论微服务架构有多么流行,这并不意味着微服务架构适合所有的应用开发,有许多应用更适合使用单体架构来构建。在如今云原生的时代,由于容器等技术的成熟,微服务架构已经广泛应用于软件的开发,发挥着巨大的作用。