编者按
在 12 月 29 日晚上的锤子科技冬季新品发布会上,罗永浩宣布把此次发布会的门票收入全部捐赠给正在筹备当中的 OpenResty 软件基金会。随后,有关 OpenResty 的讨论,在整个技术圈子开始发酵。我随即联系了 OpenResty 的温铭,因为之前有和他聊过基金会的运作方式以及 OpenResty 的发展,所以没有寒暄,开门见山,问他有没有时间写篇关于 OpenResty 的文章。
温铭很给力地秒回,说没问题。于是我草拟了一个提纲,给他发了过去。他很快向我发送了一个石墨的链接,我打开一看,很是震撼,他已经根据提纲,把内容分发给了几个社区的同学,大家很快就开始撰写。大概在晚上 11 点半,我看到稿子基本快搞定,他们已经有专门的同学在 Review。看了他们整个的协作流程,我非常兴奋,春哥(OpenResty 创始人)和温铭已经把开源的协作理念带到了文章的写作中,这也让我对这个社区顿生敬意。
早上起来,看到温铭的微信,他说初稿已经完成,我打开一看,洋洋洒洒几千字,几个人共同撰写的文章,但看起来却像是一气呵成。祝贺 OpenResty 在 2015 年的最后一周能有这么重要一个里程碑,正如温铭所说,2015 年是 OpenResty 发展的重要一年,确实。也非常感谢锤子科技给予国内开源项目的大力支持,期待越来越多的企业能参与进来,帮助国产的开源项目更快地发展。
写在前面的话
在刚刚结束的 Smartisan T2 发布会上,锤子科技宣布把发布会的门票收入捐助给 OpenResty 软件基金会,用来推动该开源项目的发展,听到这个消息非常的开心。首先要感谢锤子科技给予国内开源项目的大力支持,这次捐助,不仅是 OpenResty 的一件大事,也是国内开源社区的发展的一个重要里程碑。
关于 OpenResty,最初我们的想法很简单,希望通过《OpenResty 最佳实践》开源书籍这样的方式将我们在使用 OpenResty 过程中的一些经验分享给大家,并在 stuQ 上面录制本书的视频教程,后来为了降低 OpenResty 的使用门槛发起了汉化 OpenResty 官方文档的项目,并以社区的名义举办了全球第一届 OpenResty 技术大会,这一届大会将国内 OpenResty 的使用者和开发者聚集到一起,形成了活跃的社区氛围。
2015 年是 OpenResty 最重要的一年,关于 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 的发展
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 的架构以及应用场景
OpenResty 与其他常规开发语言或框架截然不通,可以说是另辟蹊径的把两个极其优秀的组件 NGINX 和 Lua 进行糅合,充分利用各自的优势相互弥补。不仅保留了 NGINX 的高性能 web 服务特征,Lua 更是在近乎不损失性能的前提下可以快速、简单的进行业务功能开发,同时享有代码动态装载和卸载的特性。在运行速度、可伸缩性、灵活度以及开发效率之间寻找一个平衡点。
目前 OpenResty 的主要应用场景有:HTTP Proxy、API Server、Web Application。
-
HTTP Proxy:这个在 CDN 行业用的比较多的,请求改写与路由调度、缓存控制、Web 应用防火墙(WAF) 等。
-
API Server:各种智能设备 APP、广告拉取等请求比较密集,并发、QPS 比较高的环境。
-
Web Application: OpenResty 创建初衷就是为了做这个,新浪移动已经在所有产品线使用 OpenResty,核心业务也在不断从 PHP 迁移到 Lua,京东已经开始使用这套方案解决高并发环境下的页面应用。
当然,我们也看到一些大的生产用户的另类用法,比如基于 OpenResty 来实现比较完整的分布式存储的后端。
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、自身功能和周边生态的搭建
-
网站服务器和域名、官网的改版
-
LuaJIT 核心和官方测试集的维护,性能优化,和新功能开发
-
OpenResty 核心功能点的开发
-
lua-resty-* 周边库的开源和开发激励
-
iresty.org 包管理网站设计、服务器资源
-
更完善的文档,以及 demo
-
文档翻译和维护
2、扩大影响力和促进交流
-
国内外线下 meetup,多城市
-
成功使用公司列表和采访
-
大学的技术启蒙、在线教育视频
-
编写和出版官方学习书籍
3、OpenResty 软件基金会
- 做开源社区,我们是希望走国外成熟的软件基金会的模式,成立一个合法的非盈利性组织,用各个公司的赞助来维持乃至扩展开发工作,这样可以吸引更多的开发者加入,同时也给予用户信心。另外,我们成立组织和制定社区计划来长期维护 OpenResty 项目,对于赞助公司也是保障,并且所有费用的使用都是透明公开,并且被依法审计的。
感谢郭蕾对本文的策划和审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。
评论