为什么要费心构建云原生应用程序?

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 255 小节,累计 39w+ 字,讲解图:1716 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1300+ 小伙伴加入,欢迎点击围观

最近有人问我,将应用程序构建为“云原生”应用程序有什么意义?在研究了云原生开发之后,与在虚拟机或裸机服务器上运行相比,该开发人员并不清楚其收益。

许多开发人员对他们构建和运行应用程序的方式感到满意。为了转换,他们需要一个 令人信服的 理由,让他们可以快速轻松地找到。使用不同的时尚,例如“谷歌的方式”,并不是充分的理由。

所以真正的问题是,构建和运行云原生应用程序的令人信服的理由是什么?

什么是云原生?

这是一个充满意义的术语。它曾经与 cloud foundry 一起用作营销术语。现在有 云原生计算基金会 ,其中包括像谷歌这样的玩家(他们有 Kubernetes)。而且,基础架构即服务 (IaaS) 是什么?最初的知名云,其理想来自亚马逊?

云原生应用程序是专门设计用于利用云技术的应用程序。这意味着它们本机利用水平扩展,容错离开和随心所欲地开始,并根据需要使用外部服务或利用微服务。所有这一切都意味着零停机更新和一次性应用程序实例很容易……或者应该是。

那么,当你采用云原生时你会得到什么?

1.规模,规模,规模

当传统应用程序需要扩展时,它可以通过几种方式发生。

  1. 应用程序被移动到具有更多资源的更大的服务器。有了更多的资源,它可以处理更大的负载。或者,也许它被移动到具有不同配置的服务器,可以做一些特殊的事情。这是一个非常需要动手的操作。
  2. 可以将应用程序设置为在多个服务器上运行。这可以是独立的实例,也可以是相互了解的实例。有时需要更新应用程序来处理此设置。例如,在应用程序中内置会话处理的方式(想想粘性会话)。
  3. 见过 自定义设置来处理缩放。当负载变高时,一些系统会决定如何获得更多资源并实现它。我见过的系统是高度定制的,而且可能非常脆弱。无论如何,一旦你走上这条路,你就走上了 DIY 之路,无法利用其他人正在做的工作(以及自由分享)。

也可能有其他方式。在前两种情况下,您可以扩大规模以处理峰值负载,但从不调整资源以供其他用途使用。您最终拥有、维护并为托管您的应用程序的最坏情况付费。

迁移到云原生方法允许您根据需要扩大和缩小规模。向上和向下扩展一直发生在微服务或单个应用程序级别。它是根据需求发生的。这释放了资产以用于其他事情。哦,扩展内置于应用程序和平台的工作方式中,因此一切都可以实现。

2.避免踩到对方

您是否见过同一台服务器上的多个应用程序想要使用同一依赖项的不同版本的情况?或者,您有两个应用程序想要绑定到同一个端口。当多个应用程序在同一台服务器上运行时,有很多机会相互踩踏。随着越来越多的应用程序安装在服务器上,机会就会增加。

在云原生设置中,每个应用程序实例有一个容器(有时是一个虚拟机)。它不会踩到任何其他东西。这样做的机会大多被剥夺了。

3.万物容错

非云原生应用程序需要写入容错功能。如果应用程序崩溃,则需要编写一些特殊的东西来检测它并弄清楚如何处理它。工程师或运维人员可能需要登录服务器才能弄清楚如何修复它。

理论上(对于许多常见问题),运行云原生应用程序的系统可以处理大量容错(如果应用程序构建得不错)。如果一个应用程序崩溃,一些检测会发现它是一个问题,销毁损坏的实例,并用一个工作的新实例替换它。

当然,要实现此应用程序元素,需要可访问以进行监视。有些事情很简单,例如应用程序接收 TCP 连接的端口或它使用的内存和处理量。

4.一次性

我遇到过产品所有者或经理想看看一个想法是什么样子的案例。我们想在主线开发之外使用它。

在传统设置中,我需要找到一个地方来托管它。有时这甚至不是一个选项,或者只适用于真正高优先级的事情。有时这很容易,但每次都很容易使用它的途径是自定义设置。

将云原生应用程序部署到新位置通常是配置问题和几个简单的步骤。没什么大不了的。这使开发/测试变得更加容易。

结论

云原生无法解决任何尚未解决的问题。我见过可以解决所有这些问题的系统和设置。

云原生应用程序将这些东西从由具有特殊知识的向导实现的特殊情况变为司空见惯并可供所有开发人员使用。而且,它们所建立的系统相似,由相同的模式和相同或相似的技术支撑。