概要
这几年很少写文章,一方面确实很忙,另一方面怕误人子弟,一家之言望指正。
今天分享一下云时代的前端技术展望,在开始之前,先聊聊云时代的背景。任何大规模技术变革都逃不 开一个驱动力:商业价值。今天世界经济不确定性陡增、主要互联网市场人口红利消失、流量被市场寡头控制......,整个互联网行业从没像今天这般短兵相接、剑拔弩张,这就要求互联网市场从业者更加注重商业价值。
云时代带来了: 极致效率、高可用、精细化成本控制,从而满足商业价值的要求。极致效率让招聘成本和研发成本大幅度降低,资本对互联网从业者提供的加速性能爆棚。高可用让运维成本大幅度降低,现在的互联网基础设施在云端为商业保驾护航,丝滑的阿里双十一验证了这一点。精细化成本控制让基础设施如: 服务器、带宽、存储空间......等,可随着业务发展按需投入,业务初期节约的资本可以投入到获取用户等更加迫切的事情中去。因此,云计算为互联网商业带来了前所未有的优秀环境。
作为所有技术栈里最爱折腾的前端,拿着亚⻢逊云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:
$ kubectl create namespace fission
$ kubectl -n fission apply -f \
https://github.com/fission/fission/releases/download/1.7.1/fission-all-1.7.1.yaml
Install Fission CLI:
MacOS
$ curl -Lo fission https://github.com/fission/fission/releases/download/1.7.1/fission-cli-osx \
&& chmod +x fission && sudo mv fission/usr/local/bin/
其他系统:https://docs.fission.io/docs/installation/#install-fission
查看安装状态:
zhenyankun.zyk@zhenyankunzykdeMacBook-Pro ~ kubectl --namespace fission get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
controller ClusterIP10.106.180.23<none>80/TCP 32m
executor ClusterIP10.102.255.150<none>80/TCP 32m
fission-1-7-1-prometheus-alertmanager ClusterIP10.111.38.166<none>80/TCP 32m
fission-1-7-1-prometheus-kube-state-metrics ClusterIPNone<none>80/TCP 32m
fission-1-7-1-prometheus-node-exporter ClusterIPNone<none>9100/TCP 32m
fission-1-7-1-prometheus-pushgateway ClusterIP10.107.84.192<none>9091/TCP 32m
fission-1-7-1-prometheus-server ClusterIP10.97.30.142<none>80/TCP 32m
influxdb ClusterIP10.102.33.131<none>8086/TCP 32m
nats-streaming ClusterIP10.105.145.227<none>4222/TCP 32m
router LoadBalancer10.97.124.224 localhost 80:30532/TCP 32m
storagesvc ClusterIP10.102.11.13<none>80/TCP 32m
这里用Fission来演示一下FaaS的魅力:
# Add the stock NodeJS env to your Fission deployment
$ fission env create --name nodejs --image fission/node-env
# A javascript one-liner that prints "hello world"
$ curl https:
//raw.githubusercontent.com/fission/fission/master/examples/nodejs/hello.js > hello.js
# Upload your function code to fission
$ fission
function
create --name hello --env nodejs --code hello.js
# Map GET /hello to your new function
$ fission route create --method GET --url /hello --
function
hello
# Run the function. This takes about 100msec the first time.
$ fission
function
test --name=hello
Hello
, world!
$ curl http:
//localhost:80/hello
hello, world!
可以看到,只要一个CLI即可解决所有问题,本地装个Docker和K8S立即能跑起来。推荐这个的原因是 方便的在本地搭建实验环境,真正动手学习K8S的容器编排、Docker的容器技术之强大,不用去 Amazon 花钱开Lambda服务就能体验FaaS的魅力。通过Fission实践可以掌握:
1.K8S加持的云原生开发方式 了解容器池化如何应对冷启动和瞬间高并发问题
2.如何进行服务编排
3.什么是LSTIO服务网格
4.如何借助Prometheus这种云工具来攫取指标观察数据
5.测试Javascript和其他语言在函数容器中的性能表现
6.......其他花式玩法等你探索
由此,即可顺利跨上云计算这匹宝⻢良驹,驰骋疆场应对⻜速变化的市场环境和新技术,精确无误的把 各种云能力用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......等程序员面前自豪的说:你们能干的我们也能干,而且,干的更好!
关注「Alibaba F2E」
把握阿里巴巴前端新动向