对于好多打从一开始接触现代软件架构的友人来讲,云原生这个词,听起来总归有点高深莫测,微服务这个词,听起来总归有点高深莫测,容器这个词,听起来总归有点高深莫测。
事实上,它们产生的最初想法十分简单,仅仅是为了处理老式软件“愈趋笨重、改动时稍有变动就会影响全局”的难题。
以往的时候,我们常常会把全部的功能代码呢,就如同堆积大饼那般,一股脑地塞到同一个程序当中去,而这样的一种模式,它被称作是单体应用。
刚开始开发确实方便,但业务一复杂,用户一多,麻烦就来了。
任何小小的一个功能变动,哪怕只是进行改动,都必须历经将整个系统重新进行打包,进而开展测试,之后再上线的一系列流程,效率极其低下,是这样没错的。
单体应用的瓶颈出在哪里
要理解新架构的好处,得先看看老路子是怎么被卡住的。
以往的传统单体应用程序,将诸如用户掌管、下达订单、库存监管以及支付操作这样的所有功能,通通都放置到一个服务包裹之中。
此项服务于一台服务器上运行,连接着一个数据库,一般情况下也是采用同一种编程语言书写而成。

初期维护起来确实省心。
但随着访问量增长,问题就暴露了。
第一个难题在于扩展能力有所受限,当负载增大时,只能依靠给服务器增添内存,以及更换更为强大的 CPU,这被称作垂直扩展。
但硬件总有上限,而且成本非常高。
第二个痛点是灵活性差,想引入新的技术栈几乎不可能。
打个比方,团队要是想用 Python 来编写机器学习功能,并且还想让 Node.js 去进行前端渲染,那么单体架构就会很难同时达成这样的需求 的 实现。
微服务如何让软件变得灵活
微服务架构的思路刚好反过来。
它不是炮制那种被称为大碗饭的东西,而是将完整的业务予以拆分,拆分成多个彼此独立的、呈现小型化状态的服务品类,并且每个服务品类专门致力于做一件事情。
比方说,像上面所提及的活动预订程序,能够被拆分为独立的搜索服务,还有预订处理服务,以及支付服务。
每一个被称作服务的存在,皆是身为独立个体的进程,具备属于自身的数据库,甚而能够运用各不相同的编程语言去开展开发工作。
服务之间通过网络请求或消息队列来通信配合。

如此这般便达成了水平方向上的扩展,倘若哪一个服务处于忙乱应付不过来的状况,那就针对它单独增添服务器。
不同团队也能各管一摊,互不干扰。
不用让整个应用重新部署,服务的更新就能达成,持续交付因此变得越发不复杂简易了,变得简便容易多了。
与 Prometheus 这般的监控工具相协作,一旦有服务出现诸如响应变慢这类的问题,便能够立刻察觉。
容器和无服务器让部署更简单

服务被分解开了,然而怎样以高效的方式去管理这些分散在各个不同地方的 “零件”,这变成了一个全新的问题。
这时候就需要容器技术,比如Docker。
容器如同一个具备轻量级特质的打包盒,它能够将微服务,以及微服务所必需的运行环境,还有依赖库,全部都装纳进去。
不管是在用于开发的电脑之上,不管是在正式的服务器之上,这个盒子运行时所展现的行为都是相同的。
这解决了“在我电脑上是好的”这种经典难题。
容器还特别省资源,启动速度也快。
再往上便进入到无服务器架构状态了,开发者连服务器所处位置都无需去操心,仅仅只需将代码编写完成后上传即可,云平台会自动承担起运行以及扩展的责任,按照实际所消耗的情况来进行计费。
这几种技术结合起来,就为云原生应用打下了基础。
云原生应用的真正定义
云原生应用程序并非是单纯地运用云服务器,它是从起始点就针对云计算环境而进行设计的。
它的核心思想就是充分利用云的弹性、分布式特点。
要是你的应用被设计成了多个存在冗余情况的微服务,倘若能够运用上容器调度,并且集成了持续交付流水线,那么它便是云原生的。
这并非一定得运用 AWS、Azure 这类公有云,将其部署于自行搭建的分布式私有云之上,亦是如此。
比如在进行开发之际,就要将服务发现、熔断、重试这些属于分布式系统的常见问题予以周全考量,从而使得应用在本质上就具备一种高可用的能力。
万一某个节点宕机,别的节点可以立即接手,用户几乎没有感觉。

对于电商这类不能容忍停机的业务,这点非常关键。
云原生带来的实际挑战
虽然好处很多,但转到云原生也有一些挑战需要提前了解。
例如,诸多云厂商给出了极为便捷的专用服务(就像 AWS DynamoDB 这样),然而,这些 API 常常并非是跨云的。
要是以后想换一家云服务商,迁移工作会涉及大量代码改造。
额外来说,在云原生进行诸多应用安装的情形下,会预先假定你拥有些乎无限量的服务器资源,并且新节点能够随时开启。
可是,于自身的数据中心之内,去采购新的服务器,以及布置网线,均是需要耗费时间的,如此一来,这样的假设并不见得必然会成立。
因此,上云之前要评估好锁定效应和基础设施的实际情况。
即便这样,将 Prometheus、Kubernetes 这些属于 CNCF(云原生计算基金会)之下的成熟项目运用得当,绝大多数问题存在着成熟的解决办法。
对于云原生的理解,关键要看三点内容,其一,是要将单体拆分为具有独立且灵活特性的微服务,其二,是运用容器来提升部署以及运维的效率,其三,是在架构方面充分借助云所具备的弹性以及分布式能力。
它带来了快速迭代以及高可用的优势,尽管会面临跨云迁移,还有资源假设所带来的新挑战,然而云原生仍已成为现代软件开发的主流方向。
希望能帮到正在考虑架构转型的你。

Comments NOTHING