共计 7747 个字符,预计需要花费 20 分钟才能阅读完成。
本文是 2021 年 12 月 26 日,第三十五届 – 前端早早聊【前端搞 Node.js】专场,来自阿里巴巴的终端高级技术专家 —— 秦粤的分享。感激 AI 的倒退,借助 GPT 的能力,最近咱们终于能够十分高效地将各位讲师的精彩分享文本化后,分享给大家。(完整版含演示请看录播视频):https://www.zaozao.run/video/c35
残缺 PPT 请分割小助手(vx:zzleva)获取
注释如下
大家好,明天给大家分享的主题是《浮华过后的 Node.js》。我先简略介绍一下本人:我是极客工夫《Serverless 入门课》专栏讲师,同时,我负责阿里巴巴前端委员会 - 标准化方向的负责人,参加低代码和 Node.js 方向的共建,也是阿里设计效率中台 D-One 的负责人,并且还是 W3C、ECMA-TC39、JSCIG 的成员。
前言
大家能够看到,我所从事的工作范畴十分宽泛,精确来说,我是一名全栈工程师。但当初,我开始转向治理方向。因为我不确定大家的认知根底如何,所以在介绍明天的内容之前,我会先分享一些共识,以确保大家都能了解。
第一,我想分享的是对于 Node.js 在服务端运行的场景。此局部内容将不波及 Node.js 用于 CLI 工具或开发端工具的方面。
第二,我想探讨的是企业级利用的定义。企业级利用通常是指为大型企业或商业组织创立和部署的解决方案和利用。在设计企业级利用时,须要思考到可能拜访的 PV/UV 比拟大、事务密集、数据量大、用户多以及安全性等方面。
第三,我想分享的是邓宁 - 克鲁格效应,它是人类学习新事物或认知新事物时的一种认知偏见,分为五个阶段:
- 第一个阶段是无所不知
- 第二个阶段是愚民之峰
- 第三个阶段是失望之谷
- 第四个阶段是启蒙爬坡
- 第五个阶段是继续平原
人在认知一个新的事物或学习过程中,通常都会经验一个相似曲线的过程。比方,当你开始学习 Node.js 时,刚开始的时候你对它会有很高的冀望,但理论状况可能与你的预期相差很大,可能会发现有些货色 Node.js 做不了,或者须要很简单的操作。这时候可能会感到一种低谷,然而随着一直的学习和投入,你会呈现一个比拟高速的俯冲过程,也就是启蒙爬坡。当你把握 Node.js 的能力越来越纯熟时,如果想要将其利用于生产环境中,你会发现这两头还存在很大的跨度,这时候须要破费很长时间能力迟缓晋升。这种过程就像是失望之谷中的及格线 60 分,从 0 分到 60 分绝对较容易。然而要从 90 分到 100 分,你可能须要破费更多的工夫去学习和补救本人的常识盲区。
第四,我分享的内容是对于 Gartner 这家驰名的技术咨询公司。他们每年都会提供很多技术计划,其中包含一个咱们很关注的技术成熟度曲线。这个曲线实际上来自于邓宁 - 克鲁格效应,用于形容新技术的倒退过程,包含从启动期到高峰期再到低谷期,最初进入产品化的平缓期。他们每年都会公布这样的技术成熟度曲线,以便大家理解以后技术处于哪个阶段。
Scott 让我分享对于 Node.js 的内容,起初我是有所回绝的。然而当我看到知乎上的这篇文章《2021 Node.js 凉透了吗?》时,我十分愤慨,所以我决定做此次分享。实际上,Node.js 并没有失去它的魅力。尽管它当初处于产品化的平缓期,就像咱们之前提到的那张图所展现的那样。可能许多人感觉近些年来没有什么新的停顿和音讯,这让一些人感觉 Node.js 的存在感变得有些弱,但事实并非如此。
目前 Node.js 处于产品化的平缓期,次要在做底层稳定性的改良,使其更实用于企业级利用开发。此外,还有很多根底建设正在进行中。Node.js 技术的历程能够追溯到 2009 年 Ryan 公布,2010 年达到顶峰,包含 Express 等框架的推出让其大火一把。在 2012 年 Ryan 来到后,到 2014 年 IO.js 呈现,整个生态处于低谷。然而在 2015 年,ES6、IO Merge 的回归,以及 Node FA 的成立,让整个生态经验了疾速晋升。近年来增长速度有所减缓,但整个 Node.js 生态仍然十分良好。之所以进入平缓期,待会会讲到。
在 2018 年,有一个叫做 Node.js 地下铁沙龙的流动,很多 Node.js 的从业者都加入了。在成都站时,现场提出了一个问题,Node.js 是否具备企业级能力。过后,我分享了一些对于 Node.js 做后端微服务的教训,我是感觉到 Node.js 和 Java 相比还存在一些差距。在 SDK 层面,Node.js 和 Java 相比,在中间件等方面还有很大的差距。三年后的明天,Node.js 是否具备企业级能力,仍是大家探讨话题。
在 2019 年,阿里的 Node.js 小组 – NASA 开始进行 All-in-Serverless 的根底建设,这件事件也十分受欢迎,很多 Node.js 人都参加进去了,大家的参与度十分高。
Node.js 在当初的倒退中处于怎么的状态?为什么大家很少听到阿里的一些 Serverless 方向建设的音讯呢?心愿大家可能带着这些问题来加入明天的分享。
明天的分享次要分为三个局部:
- 第一局部是对于 Node.js 企业级利用赛道的解说
- 第二局部是对于 CNCF 的 Game Changer
- 第三局部则是对于生态的稳固与凋敝
Node.js 企业级利用赛道
首先,咱们进入第一个局部,即 Node.js 企业级利用赛道。这个赛道曾经十分炽热了,竞争十分强烈,能够说曾经进入了白热化的状态。如果要做一个企业级利用,咱们首先须要看一下框架生态与语言。
在右边是咱们的研发态,在左边则是咱们的运行态。对于大部分的前端同学来说,他们在前端畛域工作,而对于后端同学来说,则须要关注 Node.js 在服务端的运行状况。在研发过程中,咱们会有一些脚手架、类型束缚、业务逻辑 Code、生态包依赖、依赖框架、工程单测标准等等。
在运行企业级利用时,咱们须要思考的次要是变动层和语言层。变动层是指包含框架和第三方依赖等在内的运行态,而语言层则指编程语言自身。实际上,在运行时咱们并不需要太多的货色,因为咱们本人编写的代码只占很少的一部分,往往不到整个源代码的 20%。大部分的代码都来自于咱们引入的框架和第三方依赖。因而,咱们本人的代码量绝对较少,也只会对变动层产生影响。
变动层是一个高频迭代的语言 SDK,因为它须要频繁更新以适应业务变更。相同,语言层的更新绝对较少,通常只是为了跟 JavaScript 语言对齐或降级 V8 引擎,且是向下兼容的,不会带来太多的问题,因而你不必放心语言降级当前会呈现断崖式的更新,尽管也有,然而这个是非常少的。
在部署 Node.js 服务端运行环境或企业级利用时,咱们最关怀的是变动层,即咱们本人编写的代码以及引入的生态依赖和框架。对于语言层,咱们则绝对释怀一些。这是在企业级利用中须要十分关注的两个方面,即研发和运行。然而,如果将 Node.js 放到后端运行并放在整个企业级架构中,咱们须要与 Java 进行对齐,这时会发现咱们与 Java 之间的差距十分大。
当咱们在部署 Node.js 服务端应用程序时,咱们最放心的是变动层,也就是咱们本人编写的代码、生态和框架。相对而言,咱们对语言更加释怀,因为它更稳固。在企业级应用程序中,咱们须要十分关注开发和运行两个方面。如果将其搁置于后端并搁置在整个企业级架构中,咱们发现与 Java 相比还存在很大的差距和跨度。
Java 的生态能力十分弱小,简直涵盖了所有蓝色方框中的服务。当咱们应用 Node.js 进行开发时,咱们须要追赶 Java 的 SDK。阿里招募了一些 Node.js 方面的专家来做这个事件,包含 Egg.js 框架和插件,以及为了追赶 Java 的能力而编写的大量 SDK。
The Game Changer CNCF
咱们看一下 The Game Changer CNCF。CNCF 的诞生是从 Docker 开始的,从研发阶段到运行阶段,咱们在之前的源代码开发过程中,实际上短少了很多重要信息。例如,过程状态,内存状态,是否会解体,而且如果解体了,谁来负责重启它?因而,像 Egg.js 这样的框架,作为框架自身,会独自提供过程模型,包含 worker、master 和 agent。因而,在原生状态下,依然须要放心过程问题。
如果你在服务端运行简单的 Node.js 利用,你可能会放心环境;如果你运行的是简单的 Node.js 包,你可能会放心利用对操作系统的底层包的依赖;如果操作系统降级或者更换,你可能会放心利用是否会解体。此外,应用 Node.js 很难援用其余语言的性能。Docker 的呈现解决了这些问题,它能够提供一个独立的运行环境,使利用与操作系统和其余依赖之间解耦,从而减少利用的可靠性和可移植性。
在 Docker 呈现之前,服务端部署的利用都存在着环境差别、调试问题、扩缩容艰难等诸多难题,包含 Node.js。然而 Docker 的呈现彻底改变了这一场面,Docker 是一个过程模型,把运行时环境隔离起来。
Docker 解决了一些重要的问题。首先,它让本地和服务器端的环境一致性更强了,因为 Docker 的容器能够在不同的中央运行。这解决了 Node.js 调试问题,因为不必放心服务器端的环境是否和本地一样。其次,Docker 的容器是一个过程模型,扩大和放大非常简单,你能够依据过程的需要来调整容器,而不须要放心 Node.js 如何去抢资源。并且,你能够在一台计算机上部署多个容器。
Docker 的呈现对服务端利用开发带来了重大变动,打消了许多心理累赘。此外,边车 也是一个绝对容易了解的概念。在 Docker 中,咱们只是将应用程序放在容器中运行,然而咱们发现多种语言之间能够共享很多货色,不须要反复开发。例如,Java 生态曾经十分丰盛,而如果咱们要将 Node.js 与 Java 在语言层面上对齐,须要编写大量代码。然而,如果咱们间接调用 Java 语言,就会变得非常简单。边车 的概念就是在 Docker 容器中部署一个 SideCar 过程,它将 Docker 视为宿主,将 SideCar 部署在其中。
过程提供各种能力,包含当初风行的 Dipper 也是这个概念。它将另一个过程部署在容器中,除了你的 Node.js 利用之外,同一个过程还能够调用服务端的其余能力。这使得你的利用更加简略,只须要通过过程间调用调用编车的能力。编车将提供流量管制和各种服务端能力,并通过转发流量将其引入。因而,这里会产生一些概念,例如控制面板和数据面板。
应用 Docker 和 SideCar 的一个重要劣势是能够让本来的 Node.js 框架或者 SDK 变得更加简略,只须要解决过程间通信。此外,语言之间很多同质化的工作也能够相互利用,比方利用 Java 的生态,只需将其部署到一个额定的过程中。Docker 和 SideCar 在 CNCF 中都是很重要的概念,Docker 是 CNCF 的根底,但在 Docker 容器十分多时,就须要解决多容器治理的问题。Docker 公司本人推出了一些容器治理计划,例如 Docker Swarm 和 Docker Kube 之类的计划。
但真正让整个格局产生扭转,是谷歌推出的 Kubernetes,它把谷歌在服务器调度管制方面的能力进行了抽象化,并且应用一种叫做 Pod 的概念来治理 Docker 容器,每个节点上的 Kubelet 有一堆的 Pod,Pod 外面再治理多个 Docker 容器。这样,K8s 能够治理整个利用的生命周期,包含利用的生老病死。
基于 K8s 的服务端架构能力解决了服务端部署的问题,并建设了一个宏大的生态系统。当初 K8s 曾经成为了企业级利用架构的必备基础设施,被称为云端的操作系统。并且 K8s 反对组件插件的能力,也就是所谓的 component。
目前,曾经呈现了许多不同的解决方案,这些计划在 Docker 中是与编程语言无关的。不论你是用 Node.js、Java、PHP、Python 或其余语言编写利用,都能够通过这些计划进行部署。因而,在 CNCF 的生态系统中,所有的开发语言都能够参加到独特建设中。尽管是针对某些开发语言,提供的是不同的边车能力,但整个 CNCF 生态系统曾经具备了在服务端架构方面所需的所有能力。
当初在服务端架构中,各种问题的解决方案曾经应运而生,例如流量的限度、降级、压测、灰度等等。这些解决方案都是开源的,所以无论是 Node.js 还是 Java 等利用架构,不再须要放心这些问题。事实上,整个 Java 的生态也被彻底改变了。如果你仍在吹捧 Java,那阐明你的视线太狭隘了。
CNCF 曾经成为企业级利用架构的最终目标,但它惟一的毛病是太宏大且学习老本较高。如果你相熟服务端的架构设计和部署,只须要找到对应的 CNCF 开源解决方案即可。在 CNCF 之上,一个问题是在服务端部署时,利用须要有本人的生命周期视角。比方高流量进入或高并发场景下,如何扩容或缩容利用。尽管 CNCF 提供了相干解决方案,然而它太简单且不是从利用视角登程的。因而,Serverless的概念应运而生。
在服务端架构畛域,Serverless 的概念比 CNCF 更早呈现,但它们的视角不同。CNCF 正在建设 Serverless 能力,将很多简单的货色简化,并提供一个利用视角。阿里和微软正在共建的 Knative 就是这样一个计划,它具备利用视角,同时能够依赖底层 Kubernetes 提供的能力。Knative 目前曾经进入到 1.0 阶段,并无望被 CNCF 驳回。
随着复杂度的进一步下沉,其实框架的 SDK 变得更薄,Serverless 也处于稳步疾速俯冲期,大家依然能够参加共建。如果 Serverless 底层放在 CNCF 下面,那就会发现很多根底建设都曾经被 CNCF 干掉了。CNCF 是一个弱小的生态联盟,企业级利用架构的根底建设曾经被 CNCF 所笼罩。CNCF 是基于 Docker 容器的,因而它与编程语言无关,这让服务端部署应用程序变得更加不便了,即便像 Java 这样的语言也能够很不便地部署在 CNCF 上。
CNCF 是个 Linux 操作系统,与具体编程语言无关。它能够反对 PHP、Node.js、Java 等多种编程语言,逐步取代了 Java 等过来自带丰盛语言生态的计划。如果想在这个生态中生存,你须要奉献出你的开源解决方案,或者适应其余语言的解决方案。每个解决方案中都有大量抉择,因而你须要学会拥抱 CNCF,而不仅是绑定在某种编程语言上。在企业级利用架构中应用 Node.js 时,不应只局限于这种编程语言,而应该学习和应用 CNCF 提供的能力和解决方案。
利用的开发部署其实应该优先思考 Serverless。这是因为 CNCF 是绝对比拟重的一个货色,引入它可能须要至多启动三台服务器或虚拟机,而这对于一些规模较小的利用来说可能过于冗余。同时,框架层的设计也会变得越来越薄,因为咱们须要更加重视利用的开发和部署。
生态的凋敝与稳固
最初咱们来谈一下生态的凋敝与稳固。尽管咱们引入了 CNCF,然而其中还存在一个潜在危险,即 Node.js 代码中常常会引入生态包的依赖。在最近几年,尤其是 Node.js 寰球有这么多的开发者,它当初是一个受到黑客特地关注的语言,尤其是 npm 包,其整个安全事故处于一个高发阶段。咱们常见的一种状况是,原作者不想持续保护一个库,于是公开呐喊其他人接手。这时,歹意作者就会接手这个我的项目,并将本人的恶意代码放入其中进行公布。因为 Node.js 的代码都是相互依赖和援用的,所以恶意代码会疾速流传。
最近几年,Node.js 的生态包的依赖和安全性问题始终存在,寰球有很多开发者在应用,但同时也容易受到黑客的攻打。例如,replicate.npmjs.com 镜像站点在 2021 年 10 月发现了破绽,导致公有包被泄露;2021 年 12 月发现破绽,攻击者能够任意公布 npm 包,而不须要鉴权。这些问题对整个 Node.js 生态系统形成了极大的威逼。Java 也不例外,比方 log4j2 事件。
事实上,只有你依赖于第三方或第二方,所有语言都可能会遇到这个供应链的平安问题。对于开发者来说,引入每个供应链是否平安是十分无解的。为了保障平安,阿里外部对所有框架提出了保护 2 年的要求。此外,GitHub 和 npm 的团队已被微软收买,并设立了专门的平安团队来负责生态系统的平安。当初整个 npm 生态的安全性曾经做得十分好了,恶意代码检测和预警尤其是针对公共包的,10 分钟就能够修复。GitHub 上的依赖树和平安告警也已更新,并引入了 2FA 的鉴权。cnpm 团队在国内也为 Node.js 的倒退做出了很多奉献,提供收费高速的下载 npm 包、预编译系统二进制,以及平安的版本列表等。
我感觉所有做开源的工作者都是值得点赞的,尤其是负责任的这些开源的包 owner,Node.js 生态当初曾经十分稳固凋敝,其背地离不开这些团队默默的付出。
在国内,有很多人为 Node.js 生态系统做出了卓越的奉献,如朴灵老师、苏千、七念、狼叔、九十、天猪等。这些人中的大部分曾经退出了阿里。当一个人深刻参加一个生态系统的倒退并随同其历史做出奉献时,这个人的集体晋升是十分快的。因而,咱们应该尽可能地参加其中,而不是做一个旁观者。
回到我之前提到的两个问题,首先是 2018 年咱们在 Node.js 地下铁圆桌会上 Node.js 是否具备企业级能力 的问题。我认为,尽管 Node.js 目前曾经具备企业级利用能力,然而要达到这个程度须要借助 CNCF 的整个生态系统。如果咱们想通过语言层面的 SDK 追赶企业级利用的能力,整个 Node.js 社区里也没有那么多人可能长期继续地投入到这个畛域中去。尽管人手很多,然而在开源社区中,很难保障每个人都可能长期投入并放弃持续性的奉献。然而借助 CNCF 的生态系统,实现企业级利用能力是非常容易的。
至于让 Node.js 扛双 11 的外围流量这个问题,我认为这齐全不是问题,因为 Node.js 曾经具备了足够的能力。然而问题在于,是否有人敢去这么做?是否有人可能给咱们这个机会?
另外,我也提到了阿里前端共建 Serverless 的事件。当咱们最后开始做 Serverless 时,这个技术还处于比拟低谷的阶段,很多基础设施都还在开发之中。然而当初,整个 Serverless 基础设施曾经十分齐备了。
在做 Serverless 的时候,Node.js 的劣势并不只是基础设施共建,而是在语言、框架和利用层面都有很多机会,特地是在 ToB 的 SaaS 服务畛域,应用 Node.js 能够十分不便,并且失去宏大的生态反对。此外,开源社区也为咱们提供了很多的营养,不仅能够参加 Node.js 代码的开发,也能够回馈社区。即便无奈参加开发,至多也不应该攻打 Node.js,因为它是一个开源的框架。如果你感觉它不好,你能够参加共建,找到行业内的痛点,成为一个外围开发者。最初揭示大家,安全性问题须要时时注意,不要陷入惯性思维。
只管有许多人在为咱们默默地挡着石头,但如果你不小心被石头砸中了,那也是有可能的。你是要晓得其背地还是有一些供应链的问题,因为所有的语言都有这个问题,不仅仅是 Node.js。心愿大家可能打造更多的企业级 Node.js 利用的胜利案例,这须要大家的致力。Node.js 的倒退须要靠整个开源社区的力量。我想起鲁迅说过的话:Node.js 要倒退,开源社区靠大家。
最初
最初,我想举荐一本书《点石成金》,这本书对我的前端生涯启发很大。
此外,向大家举荐一下我的常识星球,欢送小伙伴们一起来学习交换。