查看原文
其他

【第1808期】2019年终云时代的Node FaaS技术展望

甄子 前端早读课 2019-12-17

前言

FaaS,功能即服务。今日早读文章由阿里淘宝技术部高级前端专家@甄子投稿分享。

正文从这开始~~

概要

这几年很少写文章,一方面确实很忙,另一方面怕误人子弟,一家之言望指正。

今天分享一下云时代的前端技术展望,在开始之前,先聊聊云时代的背景。任何大规模技术变革都逃不 开一个驱动力:商业价值。今天世界经济不确定性陡增、主要互联网市场人口红利消失、流量被市场寡 头控制......,整个互联网行业从没像今天这般短兵相接、剑拔弩张,这就要求互联网市场从业者更加注 重商业价值。

云时代带来了:极致效率、高可用、精细化成本控制,从而满足商业价值的要求。极致效率让招聘成本 和研发成本大幅度降低,资本对互联网从业者提供的加速性能爆棚。高可用让运维成本大幅度降低,现 在的互联网基础设施在云端为商业保驾护航,丝滑的阿里双十一验证了这一点。精细化成本控制让基础 设施如:服务器、带宽、存储空间......等,可随着业务发展按需投入,业务初期节约的资本可以投入到 获取用户等更加迫切的事情中去。因此,云计算为互联网商业带来了前所未有的优秀环境。

作为所有技术栈里最爱折腾的前端,拿着亚⻢逊云Lambda超过60%的JavaScript市占率,面对云计算 和云时代的大考,究竟应该怎样备考呢?本文将按照从环境到应用的顺序,逐步揭开云计算时代的面 纱。

云游

伪屏蔽:Serverless下的Node

容器技术起源于虚拟化,从Parallels Desktop,Vmware,VirtualBox,Virtual pc 到Xen、KVM、Hyper- V......。云计算起源于容器技术,从cgrpups、Docker的基础容器到FaaS函数容器。从最早的虚拟技 术,到后来的容器化技术,在前端技术领域里使用容器技术实现Serverless的开发方式,把Node从一个 包管理技术和开发调试工具,真正意义上变成生产力技术,还是跨越了许多坎坷。

首先需要真正意义上实现IaaS,对于应用来说,底层的基础设施服务化从Devops到Nops,最大的转变 在于Devops不是谁都能用好所以不具备普世价值。Devops提供了通过编程控制基础设施的能力,但 是,如果不深入理解分布式系统架构、不了解容错容灾和一致性问题......,并不能使用好Devops,他 不仅仅是启动服务器、挂载硬盘、安装运行环境、设置环境变量、启动服务、InitD启动脚本、启动守护 进程这么简单。

其次,从架构设计⻆度上看,一个分布式系统和一个非分布式系统有着本质的区别,并非把服务用 Node开发,借助容器技术部署到云端这么简单。从接入层来看,流量的负载均衡、流量分发、安 全......。从服务层来看,服务注册发现机制、任务分发、任务结果的Reduce、事务性支持、一致性支 持、调度、消息通信机制、服务监控......。分布式系统最核心问题就是引入网络通信带来的不确定性,这也是为什么编程问题里最复杂的是网络。

最后,从研发体系上看,无论C/C++还是Python、Java,都针对服务开发沉淀积累了大量技术生态,尤 其是针对分布式系统、大规模部署的复杂系统、大数据量和高并发系统、高实时性系统......都有成熟的 技术方案和研发体系支撑。Serverless出现可以作为传统服务开发的一个加速器和技术补充,Node服务 端开发远不如传统服务开发技术体系成熟,从技术生态上完善这个体系还有很⻓的路要走。

综上所述,Node进入到Serverless技术体系并涉足传统服务开发领域,看似表面光鲜的虚拟化技术、容 器技术、容器编排技术、服务注册发现技术、服务编排技术......,实则对技术细节做了伪屏蔽。技术上 看,虽然带来了充分的技术保障和实施可能性,但完善Node服务端开发技术体系,还需要Node FaaS 和Node Serverless生态在未来很⻓一段时间深耕技术细节,完善配套设施做到真屏蔽。

从思想上看,无论这个技术体系多厉害,从用户侧发起请求到服务侧响应,在云技术和Serverless体系 下依旧非常复杂,需要有体系化的技术思想和架构思想去理解,这也要求Node开发人员更多去了解学 习:MDA分析法、五视图分析法、领域模型......等设计思想和设计范式。

超级胶水:Fission看FAAS

理论

Javascript诞生之初,作为一⻔解释执行的语言,天生的动态性就决定了其“胶水”的特性。起初, Javascript把DOM和BOM粘在一起实现了DHTML;后来,Javascript把DHTML和HttpWebRequest粘在 一起实现了动态⻚面。十余年发展下来,Javascript自从加入ECMA语言层面增加了十来个特性,W3C 标准却带来了成百上千的浏览器特性,这意味着胶水自身的特性是够用的。这让我想起502,不管是 啥,擦干净抹上502一按就粘住了。

Node.js的出现让Javascript成为了真正的502,不仅在浏览器上可以粘这粘那的,在服务器上也可以粘 这粘那了。比如你可以把一个HTTP Request Accept下来,把Token粘到鉴权Service判断用户是否合 法,然后用AWK粘上Post内容来个文本分析,再粘个云端存储服务的REST API把某个Key的Value更新 一下,然后挂着200的状态返回个Response。

在Serverless下的Node技术体系更进一步,聪明的程序员发明了FaaS(Function as a Service)函数既 服务。经历了基础设施既服务、平台即服务、软件即服务的收敛过程,个性化诉求伴随着市场激烈竞争 所带来的业务压力,市场迫切需要在集中式的服务为基础的云上,快速构建个性化服务。云服务商把不 同的业务逻辑包装在函数里直接在云端函数容器执行的方案,从众多解决方案中迅速脱颖而出。究其原 因就是极致效率、高可用、精细化成本控制,业务有需求写个函数立刻构建、测试、发布上线,函数容 器背后的云技术乃至云原生来保证高可用,弹性缩扩容保证成本精细化控制,完美!

实战

Step 1

Fission需要Kubernetes 1.9以上版本,好在安装Docker后在GUI里可以简单的安装启动Kubernets,具体安装过程这里就不在赘述,请参考:https://www.docker.com/get-started

Step 2

安装Fission:

  1. $ kubectl create namespace fission

  2. $ kubectl -n fission apply -f \

  3. https://github.com/fission/fission/releases/download/1.7.1/fission-all-1.7.1.yaml

Install Fission CLI:

MacOS

  1. $ curl -Lo fission https://github.com/fission/fission/releases/download/1.7.1/fission-cli-osx \

  2. && chmod +x fission && sudo mv fission /usr/local/bin/

其他系统:https://docs.fission.io/docs/installation/#install-fission

查看安装状态:

  1. zhenyankun.zyk@zhenyankunzykdeMacBook-Pro ~  kubectl --namespace fission get svc

  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

  3. controller ClusterIP10.106.180.23<none>80/TCP 32m

  4. executor ClusterIP10.102.255.150<none>80/TCP 32m

  5. fission-1-7-1-prometheus-alertmanager ClusterIP10.111.38.166<none>80/TCP 32m

  6. fission-1-7-1-prometheus-kube-state-metrics ClusterIPNone<none>80/TCP 32m

  7. fission-1-7-1-prometheus-node-exporter ClusterIPNone<none>9100/TCP 32m

  8. fission-1-7-1-prometheus-pushgateway ClusterIP10.107.84.192<none>9091/TCP 32m

  9. fission-1-7-1-prometheus-server ClusterIP10.97.30.142<none>80/TCP 32m

  10. influxdb ClusterIP10.102.33.131<none>8086/TCP 32m

  11. nats-streaming ClusterIP10.105.145.227<none>4222/TCP 32m

  12. router LoadBalancer10.97.124.224 localhost 80:30532/TCP 32m

  13. storagesvc ClusterIP10.102.11.13<none>80/TCP 32m

这里用Fission来演示一下FaaS的魅力:

  1. # Add the stock NodeJS env to your Fission deployment

  2. $ fission env create --name nodejs --image fission/node-env

  3. # A javascript one-liner that prints "hello world"

  4. $ curl https://raw.githubusercontent.com/fission/fission/master/examples/nodejs/hello.js > hello.js

  5. # Upload your function code to fission

  6. $ fission function create --name hello --env nodejs --code hello.js

  7. # Map GET /hello to your new function

  8. $ fission route create --method GET --url /hello --function hello

  9. # Run the function. This takes about 100msec the first time.

  10. $ fission function test --name=hello

  11. Hello, world!

  12. $ curl http://localhost:80/hello

  13. hello, world!

可以看到,只要一个CLI即可解决所有问题,本地装个Docker和K8S立即能跑起来。推荐这个的原因是 方便的在本地搭建实验环境,真正动手学习K8S的容器编排、Docker的容器技术之强大,不用去 Amazon 花钱开Lambda服务就能体验FaaS的魅力。通过Fission实践可以掌握:

  • K8S加持的云原生开发方式 了解容器池化如何应对冷启动和瞬间高并发问题

  • 如何进行服务编排

  • 什么是LSTIO服务网格

  • 如何借助Prometheus这种云工具来攫取指标观察数据

  • 测试Javascript和其他语言在函数容器中的性能表现

  • ......其他花式玩法等你探索

由此,即可顺利跨上云计算这匹宝⻢良驹,驰骋疆场应对⻜速变化的市场环境和新技术,精确无误的把 各种云能力用Node FaaS这管强力胶黏合在一起。

云上开瓶器:Web IDE

作为一个1990年拥有电脑的编程老⻦,Delphi是我⻅过的第一个集成开发环境(IDE)。在Pascal的改 进版语言Object Pascal加持下,各种UI控件和自定义控件可以实现几乎所有的GUI,相较之下, SourceInsight只能算代码编辑器。这也是很多人不理解微软把VS Code叫做代码编辑器,把Visual Studio称为IDE的根本原因。

因为VS Code的开放,各种插件加持下,VS Code的IDE能力一点儿不比Visual Studio弱,是不是很神奇?所以,数千人有组织的研发团队,依旧赶不上开源社区的强大,这是包括阿里巴巴、Apple等大公 司拥抱开源生态的本质原因。所以,今天的开源VS Code成为地表最强IDE已极少有人质疑。

VSC Team 由著名工程师 Erich Gamma 领导,Erich 是《设计模式》作者之一,Eclipse 之父,拥有多 年的 IDE 开发经验。Erich举重若轻的利用Node把Extensibility管理的井井有条,为开放的插件生态创造 了无限可能。

多进程的架构不仅带来了优秀的性能,后台进程、UI和编辑器、I/O、插件、Debug、Search各司其 职。因此,只要网络带宽允许,理论上可以把任何一部分服务化。举个例子,只要你愿意,可以下载VS Code的源码,把I/O部分服务化,利用云存储服务来替换本地I/O,就可以简单的保证源代码、资源文件 等在云端的环境里安全可控。又或者,你可以把插件部分服务化,不论你在家里还是在公司启动VS Code,云端存储一致的插件,立即带给你一致的IDE和一致的开发体验。最后,干脆把后台进程和Renderer process也放在云端,⻬活了,一个云上的IDE就此诞生。当然,你不愿自己折腾,可以试试 微软的VS Code Online:https://visualstudio.microsoft.com/services/visual-studio-online/,或者Github上的Gitpod:https://gitpod.io/#https://github.com/alibaba/pipcook,或者在本地跑一下: https://github.com/cdr/code-server 。

如果把本文前半部分所讲的云端技术比作一瓶82年的拉菲,那云上的IDE无疑就是一把开瓶器,消除阻 挡品尝云技术美酒的瓶塞。挡在这瓶美酒之前的瓶塞主要是:能力发现、调试、部署。

能力发现有两个层面,一个是表面上、文档上云服务能力是什么?一个是本质上、代码上云服务能力是 什么?对于一个程序员,文档写的再详细,不亲自进去敲个Hello World、Echo Server,大抵是不放心 的。有了云上的IDE,你即刻可以“打开”云服务的能力,用代码去一探究竟。

调试是应用任何新技术、新研发模式的基础,因为你无法预测自己的想法是否能被那些自以为是的代 码,在陌生的运行环境里被正确执行。要驾驭分布式系统和现代云技术体系,尤其当面对混合云的时 候,要完整搭建整个调试环境是一件很痛苦的事情。云上的IDE因为其云原生的先天优势,可以方便的 在云端利用云技术、容器技术、容器编排技术快速的创建应用调试环境,甚至可以借助云测试和真机模 拟环境来进行调测、拨测。

部署在云服务和云设施之上,不同的云技术对应不同的持续交付和持续集成,构建过程、构建环境、构 建对象和容器技术的依赖等,都让部署过程变得复杂。部署过程中流量分桶、热更新、服务一致性保障 等问题,也面临复杂的环境。尤其在多人协作的场景中,如何良好进行发布的管控,成为亟待解决的软 件工程问题。云上的IDE可以几乎无痛的解决上述问题,通过在云上维护统一的持续交付和持续集成环 境、自动化管控部署过程、借助源码和编译构建卡口代码发布,所有部署过程都在一个受控和受保护的 云环境中进行,开发人员可以放心大胆的用代码构建整个世界。

展望

未来最让我期待的就是云技术和机器学习,机器学习有https://imgcook.com这个作品在前端研发提效这个方向 持续探索,为前端智能化充当排头兵,云技术在前端和Node FaaS技术体系下,需要怎样的突破创新?

首先,如何吸收借鉴传统服务开发的经验、分布式系统设计实践经验,将是首要问题。初生牛犊不怕⻁ 也意味着无知者无畏,即便有云技术良好的基础设施和基础能力,如何训练自己拥有良好的架构思想、 面向失败的设计习惯?只有不断学习吸收传统服务开发的经典架构思想和经典设计范式,并充分进行实 践和反思,将其融入到Node FaaS技术体系。

其次,学习速度和学习深度都是因人而异的,每个人都有不同的理解力、不同的技术背景,又分处在不 同的业务场景中,对Node FaaS技术体系的理解必定各有差异。如何在自己擅⻓的方向上、自己熟悉的 领域中持续积累,沉淀出Node FaaS的最佳实践,并使用VS Code插件或开源项目的方式分享出来,共 同借助社区的力量丰富和完善Node FaaS技术生态。

最后,云时代为前端技术人员织就了一张全新的互联网,以往在UI交互技术孤岛上的前端技术人员被联上了网,各种新技术都能够为前端所用,终于可以站在C/C++、Java、Python......等程序员面前自豪的说:你们能干的我们也能干,而且,干的更好!

关于本文 作者:@甄子 原文:https://www.yuque.com/docs/share/2a34855a-1525-4a3d-ad4a-28332619959f

为你推荐


【第1776期】2019年,是否可以抛弃 CSS 预处理器?


【第1773期】19 个来自 2019 React Conf 的总结


【第1768期】Node.js 在微医的应用场景及实践

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存