- 《架构师》2016年1月
- InfoQ中文站
- 1011字
- 2020-06-26 06:06:35
锤子手机发布会提到的OpenResty是什么?
编者按
在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项目,对于赞助公司也是保障,并且所有费用的使用都是透明公开,并且被依法审计的。