深入分析PayPal对Node.js的应用和开发案例
从历史上看,我们工程团队的代码已经被分割成浏览器层(使用HTML , CSS和JavaScript )和应用层(使用Java ) 。试想一下,一个HTML的开发人员要求一个Java开发人员将“A”和“B”页面连接在一起,但是这就是我们。该模型通过引入全栈工程师,落后那些能够创造一个好的用户界面,然后生成应用程序去支持它。称他们为独角兽,但是这就是我们想要的,在PayPal中,主要阻滞剂是我们在浏览器和服务器之间建立的人工边界。
Node.js 使用javascript,通过建立浏览器和服务端的应用程序帮助我们解决了这个问题。它统一了我们团队,让我们在技术堆栈上了解和应对我们用户的任何需求。
早期使用Node.js
和其他一样,我们把Node.js 作为一个原型的平台。同其他一样,它表现了很好的性能,我们决定在产品上使用它。
最开始的时候,我们使用express作为路由,nconf来作为配置,grunt来建立工作流。我们特别喜欢express框架的普及,却发现它并没有在多个开发团队很好地扩展。express是非强制性的,并允许您在任何方式合适地去设置一个服务器。它非常灵活,但不利于在大型团队中保持一致。随着时间的推移,我们看到的模式脱颖而出,更多的人拿起node.js的转身进入Kraken.js ,它不是一个框架本身,而是基于express的一个层,允许它扩展到更大的组织。我们希望我们的工程师专注于打造自己的应用程序,而不是仅仅着眼于建立自己的环境。
到现在为止,我们在内部使用kraken.js 已经有几个月了(不久,我们将会开源),我们的工程师团队期望将它变成一个实时的公司内部的node.js应用程序。
促使Node.js 到产品上
我们首先在产品上尝试node.js不是一个小的应用程序,它是我们的账目总览页面,这个页面具有很大的流量。我们打算去使用,但是我们也得降低风险,
于是我们同时建立了一个java应用程序。我们知道如何去部署和度量java应用程序,因此如果在node.js 程序出了任何问题,我们能够迅速的切换到java上来。它提供对一些数据的设置。
部署
我们在1月份就开始了,它花费了我们几个月的时间去研究node.js必要的基础东西。比如sessions, centralized logging, keystores。在这段时间内我们有5名工程师在使用java工作。在2个月的java开发后,2名工程师开始使用node.js 并行开发 app。在7月初的时候,他们相互沟通了一下,他们的应用程序具有相同功能。node.js的应用程序,是以一个更小的团队在2个月后开始,但是很快就追上了。有几个细节脱颖而出后,我们运行测试案例,两个应用程序通过相同的功能测试。node.js 是:
1)更少的人去建立,几乎是2倍甚至更快的速度
2)少了33% 的代码
3)建立40%甚至更少的文件
这个提供了一个令人鼓舞的消息表明javascript可以更快的工作。我们都同意并且做了一个决定:将java应用程序搁置了。但是问题是java工程师在项目上,开始的时候对转向node.js并且很高兴的在我们的工作流中提交代码,提高我们双倍的生产力不太自信。
性能
性能是一个高兴而有争议性的话题,在我们的案例中,我们一个团队有2套功能相同的应用程序:一个使用java 基于Spring而另一个基于kraken.js 使用 express, dust.js 和其他的开源代码。这个应用程序包含了3套路由,并且每一套路由2个或者5个请求,数据是通过Dust去渲染页面的。
在我们的测试路由中,我们收集的数据是吞吐量和响应时间
你能看到在我们的node.js 应用程序中:
1)与Java应用程序相比较,双倍的每秒请求。更有趣的是,Node.js应用程序是单核,而在Java中五核。我们希望进一步增加这个鸿沟。
2) 35%的跌幅,平均响应时间在同一页。这导致响应200ms的快一些用户肯定会注意到。
对于这个结果我申明一下:我们的框架使用2种不同的应用程序,它仅仅在不同的技术上的是一个对等测试。有可能你的区别更大。也就是说,我们非常激动的看到了node.js表现出的性能。
Kraken:改变PayPal开发文化的Node.js框架
PayPal(全球流行的网上支付服务)公司发布了一款Node.js Web开发框架——Kraken。
Kraken基于Express,Express是目前Node.js上最流行的MVC模式的Web开发框架,通过提供一系列强大特性帮助开发者快速创建各种Web应用。而Kraken在Express的基础上提供了更加稳健的功能合集,支持本地化、环境配置、更加注重应用程序安全等。
为什么会有 Kraken?
之前,PayPal 公司长期存在着“非我所创”的文化,这导致 PayPal 采用新技术的态度很消极,项目开发进度也极其缓慢。正是由于 PayPal 行动缓慢,其他支付服务商 Stripe 和 Square 趁机成长,逐渐撼动 PayPal 的市场地位。同时,PayPal 当时的开发技术也已经无法满足快速开发的需求,因为当时的开发基本全是 Java,不需要用 Java 来实现的也会用 Java 完成。
2012 年 4 月,David Marcuss 成为 PayPal 的总裁,并任命工程师团队在 6 周内完成支付系统的重写,这是一个为 PayPal 带来了 35 亿美元收入的系统。最终,工程师团队用了 8 周时间完成了该项任务,他们选择了 Node.js 对系统进行重新开发。当然,PayPal 的其他大量的子系统还需要整合到 Node.js 系统,所以起初 Node.js 仅作为一个快速开发原型架构。
后来,PayPal 越来越多的新开发项目都逐渐采用 Node.js 和其他开源软件来完成,这就促成了一个可以快速开发 Web 应用的 Kraken.js 项目的诞生。
下面我们对 Kraken 的框架结构和特点进行简单的总结分析,希望能够帮助大家更好地了解 Kraken。
Kraken 框架套件
Kraken 框架套件包括多个部分,Kraken.js 仅是该框架的主体部分。该框架还包括其他模块(可独立使用):
lusca:支持 Express 的应用程序安全模块
makara:支持 Dust.js 的国际化(i18n)模块
Adaro:支持 Express 的一款 Dust.js 视图渲染器
Kappa:NPM 代理插件
除了上述可以独立使用的模块之外,Kraken 套件还包括了一系列的依赖和实用工具:
Generator-kraken:Yeoman 生成器
Enrouten:用于 Express 的路由(route)配置中间件(初始化与配置模块)
Kraken-devtools:Kraken 应用程序开发所需的工具合集
Kraken的特点
通过前面的介绍,我们已经基本了解了 Kraken 究竟是怎么一回事儿,那 Kraken 到底具有哪些吸引开发者的特点呢?
1. 项目结构清晰
Kraken 将生成的项目的配置、内容和模板、路由逻辑(routing logic)放在了不同的位置,方便开发者对文件进行组织和管理。下面,我们详细了解下 Kraken 所创建项目的基本结构:
/config,存放应用程序和中间件配置
/controllers,控制器
/lib,存放开发者自定义的库文件和其他代码
/locales,特定语言内容
/models,模型
/public,公共的网络资源
/public/templates,服务器和浏览器端模板
/test,存放单元和功能测试用例等
index.js,应用程序入口文件
随着项目的不断成长,这种组织方式和策略对开发者来说会更加友好。
2. 良好平衡开发环境与生产环境
Kraken 的配置文件为 /config/app.json,它会在运行时加载文件中包含的键值对。全部的应用程序配置均存放在这一个文件中,大大方便了开发者。/config/middleware.json 则是自定义的中间件配置文件。
说起开发环境与生产环境,二者通常在端口号、主机名等方面的参数设置会有不同,Kraken 允许创建开发模式下使用的配置文件,如 /config/app.json 为生产环境下的配置,/config/app-development.json 则是开发环境下的配置,然后可以通过自定义环境变量(定义环境变量 NODE_ENV 为 production 或 development)来控制要加载哪个配置文件。如此一来,可以方便开发者在生产环境和开发环境进行快速切换!
3. 注重安全
通过Lusca模块来为安全保驾护航,并遵循OWASP安全原则,同时也默认为全部调用启用了几个请求/响应头文件:
跨站请求伪造(CSRF)标头
内容安全策略(CPS)标头
隐私优先项目平台(P3P)标头
X-FRAME-OPTIONS 防止点击劫持
4. 其他
同时,它还有下面几个特点:
路由(route)与逻辑(logic)分离:方便程序运行失败时快速锁定问题。
模板(template)共用:Kraken 选用 Dust 作为模板语言,同时在服务器端和客户端使用了同一个模板,如此一来,就可以做到代码复用。
支持本地化: Kraken 可以在运行时基于请求上下文来加载内容包(content bundle),所以在模板渲染之前就可以通过添加上下文来给用户提供相应的本地语言支持,大大增强了应用的友好性。
示例与文档
关于 Kraken,官方给出了下面两个示例,可以帮助大家学习和了解:
例一:本地化与国际化:给 Web 应用增加多语言支持,让各地用户能够用当地语言来使用 Web 应用
例二:部署中间件:创建一个网页计数器,为大家解释在应用生命周期中如何部署中间件
开源项目
Kraken 是一款开源项目(分发协议为Apache License v2.0),大家都可以对该项目进行 Fork 和提交修改。它也提供了一份简洁的使用文档。项目源码和文档均可在Github页面进行查看。
最后
任何一个项目的诞生都有其产生的背景,也必然有相应的需求驱动。正如 Kraken,正是由于 PayPal 为了满足其快速开发 Web 应用的强烈需求,才选择了 Node.js,才有了这个项目。
同时,我们也需要注意工程师团队中存在的“非我所创”文化,对于新技术要采取积极的态度,不能一成不变,否则将给企业发展带来阻碍。