在Smartisan T2 发布会上,锤子科技宣布把发布会的门票收入捐助给 OpenResty 软件基金会,用来推动该开源项目的发展,听到这个消息非常的开心。首先要感谢锤子科技给予国内开源项目的大力支持,这次捐助,不仅是 OpenResty 的一件大事,也是国内开源社区的发展的一个重要里程碑。
关于 OpenResty,最初我们的想法很简单,希望通过《OpenResty最佳实践》开源书籍这样的方式将我们在使用 OpenResty 过程中的一些经验分享给大家,并在 stuQ 上面录制本书的视频教程,后来为了降低 OpenResty 的使用门槛发起了汉化 OpenResty 官方文档的项目,并以社区的名义举办了全球第一届 OpenResty 技术大会,这一届大会将国内 OpenResty 的使用者和开发者聚集到一起,形成了活跃的社区氛围。
2015 年是 OpenResty 最重要的一年,关于 OpenResty 我们还有很多的想法和计划,谢谢锤子科技的支持和鼓励,我们相信美好的事情会再次发生。
OpenResty 是中国人章亦春发起的一个开源项目,它的核心是基于 NGINX 的一个 C 模块,该模块将 Lua 语言嵌入到 NGINX 服务器中,并对外提供一套完整 Lua Web 应用开发 API,透明地支持非阻塞 I/O,提供了“轻量级线程”、定时器等等高级抽象,同时围绕这个模块构建了一套完备的测试框架、调试技术以及由 Lua 实现的周边功能库;这个项目的意义在于极大的降低了高性能服务端的开发难度和开发周期,在快节奏的互联网时代这一点极为重要。
OpenResty 的起步和发展经历了一个漫长的时期,从 09 年基于 NGINX 用 C 语言重新改写的版本,到 11 年开始有很多公司开始小范围内尝试使用,再到今天,OpenResty 知名的 CDN 行业,各大电商,手游领域都有应用,我们对 OpenResty 源码发布包和 Windows 二进制发布包的下载做了一个统计,这些流量分别来自 135 个国家的 3072 个城市,特别是今年下半年以来,每个月都有 5 万次以上的对发布包的下载请求。其中有近一半的用户来自中国。
OpenResty 最早是雅虎中国的一个公司项目,起步于 2007 年 10 月。当时兴起了 OpenAPI 的热潮,于是公司领导也想做一个类似的东西,可以支持各种 Web Service 的需求。在部门领导的支持下,最早的 OpenResty 实现从一开始就开源了。最初的定位是服务于公司外的开发者,像其他的 OpenAPI 那样,但后来越来越多地是为雅虎中国的搜索产品提供内部服务。这是第一代的 OpenResty,当时的想法是,提供一套抽象的 Web Service,能够让用户利用这些 Web Service 构造出新的符合他们具体业务需求的 Web Service 出来,所以有些“meta web servie”的意味,包括数据模型、查询、安全策略都可以通过这种 Meta Web Service 来表达和配置。同时这种 Web Service 也有意保持 REST 风格。
与这种概念相对应的是纯 AJAX 的 web 应用,即 Web 应用几乎都使用客户端 JavaScript 来编写,然后完全由 Web Service 让 Web 应用“活”起来。用户把 HTML、JavaScript、CSS、图片等静态资源下载到网络浏览器中,然后客户端 JavaScript 代码就开始运行,跨域请求雅虎提供的经过站长定制过的 Web Service,最后应用就可以运行起来。
不过随着后来的发展,公司外的用户毕竟还是少数,于是应用的重点是为公司内部的其他团队提供 Web Service,比如雅虎中国的全能搜索产品,及其外围的一些产品。从那以后,开发的重点便放在了性能优化上面。章亦春在加入淘宝数据平台与产品部的量子恒道统计团队之后,决定对 OpenResty 进行重新设计和彻底重写,并把应用重点放在提供高性能的 Web Service 平台,以很好地支持像量子恒道统计这样复杂和繁忙的 Web 应用上面,所以量子统计 3.0 开始也几乎完全是 Web Service 驱动的纯 AJAX 应用。
第一代 OpenResty 是基于 Perl、Haskell 和一点点 C 实现的。在王晓哲的提议下,第二代 OpenResty 选择使用 C 语言基于 NGINX 进行开发,同时选择 Lua 作为最主要的用户语言。
OpenResty 与其他常规开发语言或框架截然不通,可以说是另辟蹊径的把两个极其优秀的组件 NGINX 和 Lua 进行糅合,充分利用各自的优势相互弥补。不仅保留了 NGINX 的高性能 web 服务特征,Lua 更是在近乎不损失性能的前提下可以快速、简单的进行业务功能开发,同时享有代码动态装载和卸载的特性。在运行速度、可伸缩性、灵活度以及开发效率之间寻找一个平衡点。
目前 OpenResty 的主要应用场景有:HTTP Proxy、API Server、Web Application。
当然,我们也看到一些大的生产用户的另类用法,比如基于 OpenResty 来实现比较完整的分布式存储的后端。
每个做技术的人,或多或少都会用到一些开源技术,顺其自然也就会参与到各种技术社区的活动中,或是问题讨论、或是技术交流又或是“PHP是世界上最好的语言”这样的激辩。每个社区都带有自己的基因有自己的特点。这些多少与开源软件的作者有一定的关系。因为 OpenResty 的作者章亦春(人称春哥)是一个热爱编码对自己要求特别高,对代码质量追求近乎于完美、为人谦和、热心,甚至是儒雅的一个人,目前 90% 以上的 OpenResty 相关问题基本都会指向OpenResty Google 邮件组,在那里你会看到不管是大牛还是小白的问题都会得到一个 agentzh 的账号认真细致的解答。随着这些年 OpenResty 社区的积累,慢慢涌入的同学们也秉承春哥这种作风,大家互助共进。
OpenResty 社区一直秉持兼容并包的思想,基于 NGINX 在整个 Web Stack 中所处的特殊位置,用户可以很方便的将 OpenResty 与现有的技术进行融合,比如 PHP、Java、Python、Ruby、Go、Nodejs 等。OpenResty 在网关这个层面,所以可以同时和其他后端应用并存,方便工程师将其他技术方案实现的系统有选择地迁移到 OpenResty。 当然,出于对极致性能的追求,OpenResty 社区还是更倾向于比较纯净的方案。
另外很重要的一点,就是开源工作者很看重的:有趣。我们假设开源是一个编译器,它有优化选项,-Ofun,我们是针对乐趣进行优化。这一点看上去是和实用主义原则冲突,其实不然。因为对于一个工程师来说,最有意思的莫过于自己的技术,自己搭建的系统,自己设计的方案,能够在线上跑的非常好,能够服务越来越多的用户,这是非常大的一个乐趣。对开源工作者来讲,他也希望自己的代码能够跑在尽可能多的公司的服务器上,能够收到尽可能多的用户的感谢信。在一天干活最痛苦的时候,突然收到一封来自世界另一个角落的用户的感谢信,字里行间洋溢着一种感激,一种欣喜,那你这一天立马就会变得非常美好。所以,要让乐趣变成我们工作的主旋律,而不要让工作变成一种负担。
国外成功的开源项目比较多,或许跟许多发达国家的程序员们的精神状态有关系。比如我们发现一些国外的黑客非常心思单纯、热情似火。他们在精神上的束缚非常少,做起事来多是不拘一格。有的人即便长期没有工作单纯靠抵押和捐赠过活,也会不遗余力地投身于开源项目。而国内许多程序员的精神负担一般比较重,经济上的压力也比较大,自然难有“玩开源”的心思。
不过,国内也是有一些程序员拥有国外优秀黑客的素质的,而且他们通过网络和全球的黑客紧密联系在一起,所以我们完全可以期待他们未来有振奋人心的产出。在互联网时代的今天,或许按国界的划分来讨论这样的问题会变得越来越不合时宜。
未来我们会尝试在 OpenResty 的基础之上提供更接近各种典型的互联网业务的抽象,包括领域内小语言和相关的编译器、运行时的支持。在这种模型下,OpenResty 就是一个虚拟机,而 Lua 语言是这个虚拟机上的“机器语言”。我们希望开发者能在更高的抽象层面上思考和表达业务问题,而不必纠缠于实现细节,同时能通过各种上层小语言的优化编译器,享受到接近手写 Lua 代码的运行时效率,无论是空间还是时间。我们在过去几年中已经在这个方向上做过一些有趣的成功尝试,包括在雅虎中国基于第一代 OpenResty 做的 Meta Web Service 平台,以及淘宝量子恒道统计所使用的数据 API 平台,在优美、简洁和高性能之间取得了多赢。我们希望能通过自己的实践,让业界越来越多地关注“编译型” Web 框架所使用的优美抽象和优化编译技术,而不仅仅是传统的“解释型” Web 框架所使用的不断地叠加运行时封装,无论是类还是函数封装的方式。
在 NGINX 官方服务器前不久引入全新的 stream 子系统之后,我们也希望 OpenResty 能支持使用 Lua 和同一套 Lua API 来实现任意 TCP 协议的服务器,而不仅仅是 HTTP 服务器。类似地,我们也将支持用同样的方式来构造高性能的 UDP 服务器。这些变化将会极大地拓展 OpenResty 的应用范围。届时我们应该会看到更多有意思的应用。
我们很期待看到有越来越多优秀的青年乃至少年加入到我们社区,加入到我们的开发团队。再没有什么比新鲜血液更能激发一个开源项目的活力了。或许未来我们能以 OpenResty 软件基金会为依托,开展类似 Google Summer of Code 这样的活动,同时赞助和支持有兴趣的学生和“开源导师”在学校放假期间为 OpenResty 社区贡献代码、文档和教程。
当然,我们也希望能够以 OpenResty 软件基金会的名义,积极地奖励和赞助那些有想法的资深工程师,帮助实现 OpenResty 核心及周边那些富有挑战的项目,或者指导新加入的开发者(包括在校学生)完成较为简单的项目,充分发挥自己的专业技能和理论知识。
具体的一些工作如下,包括软件本身以及社区方面:
1、自身功能和周边生态的搭建
2、扩大影响力和促进交流
3、OpenResty 软件基金会