如何在SAE上架设RPC服务与openresty redis lua的Lua服务通信

您所在的位置: &
如何用正确姿势来学习获得锤子科技捐赠对象的OpenResty(1)
如何用正确姿势来学习获得锤子科技捐赠对象的OpenResty(1)
高可用架构微信公众号
编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文根据奇虎 360 安全架构师温铭的分享记录。
我个人之前主要是用 Python 来完成开发工作,包括云查杀和反钓鱼系统,都是 Python 完成的。在 2011 年左右接触到 nginx 的 C Module 开发,被异步的高性能颠覆了三观,只是门槛太高,一直想找一个像 Python 一样简单,像nginx C Module一样高效的技术。
所以在 2012 年,得知 OpenResty 这个项目的时候,我就在企业安全一个新项目里面,使用它作为服务端的主要技术。
在今年上半年开始在 Github 上面,把积累的经验写成一本电子书《OpenResty最佳实践》,并在刚过去的 11 月 14 号,以社区名义组织了 OpenResty 的第一次技术大会。
1. OpenResty 是什么,适合什么场景下使用
和大部分知名开源软件诞生在欧美国家不同,OpenResty 自身和依赖的主要组件都是金砖国家的开发者发明的,这点还挺有意思。
Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中,实现了 OpenResty 这个高性能服务端解决方案。
通过 OpenResty,你可以把 nginx 的各种功能进行自由拼接, 更重要的是,开发门槛并不高,这一切都是用强大轻巧的 Lua 语言来操控。
它主要的使用场景主要是:
在 Lua 中揉和和处理各种不同的 nginx 上游输出(Proxy,Postgres,Redis,Memcached 等)
在请求真正到达上游服务之前,Lua 可以随心所欲的做复杂的访问控制和安全检测
随心所欲的操控响应头里面的信息
从外部存储服务(比如 Redis,Memcached,MySQL,Postgres)中获取后端信息,并用这些信息来实时选择哪一个后端来完成业务访问
在内容 handler 中随意编写复杂的 Web 应用,使用 同步但依然非阻塞 的方式,访问后端数据库和其他存储
在 rewrite 阶段,通过 Lua 完成非常复杂的 URL dispatch
用 Lua 可以为 nginx 子请求和任意 location,实现高级缓存机制
组织 OpenResty 技术大会之前,我一直认为自己是一个孤独的 OpenResty 使用者,觉得自己在使用一个冷门的技术。
虽然大家都听说过 OpenResty 或者 ngx_lua,但感觉用在生产环境中使用的却少之又少,除了几个 CDN 公司外,好像没有听说过哪家知名互联网公司在使用。而 CDN 行业之所以使用,很多是受到 cloudflare 技术栈的影响,OpenResty 的作者也在国外这家 CDN 公司。
但办完这个大会,我发现使用者真的挺多,奇虎360的所有服务端团队都在使用,京东、百度、魅族、知乎、优酷、新浪这些互联网公司都在使用。有用来写 WAF、有做 CDN 调度、有做广告系统、消息推送系统,还有像我们部门一样,用作 API server 的。有些还用在非常关键的业务上,比如开涛在高可用架构分享的京东商品详情页,是我知道的 ngx_lua 最大规模的应用。
2. 奇虎企业安全服务端技术选型的标准
先说下 3 年多前做架构选型的时候,我为什么会选择 OpenResty?
其实架构如何设计并不重要,因为每家公司,每个团队,他们的公司文化和技术背景各不相同,生搬硬套会适得其反。重要的是当初为什么这么选择,中途为什么调整。
我们的产品要求单机上面,服务端提供高性能的 API 接口, QPS 至少过万,未来需要支撑到 10 万。我们并没有急于去使用 PHP 、 Python 或者其他的语言来实现功能,而是先勾勒出一个理想化的技术模型。
这个模型应该具备:
非阻塞的访问网络IO。在连接 MySQL 、Redis 和发起 HTTP 请求时,工作进程不能傻傻的等待网络IO的返回,而是需要支持事件驱动,用协程的方式让 CPU 资源更有效的去处理其他请求。很多语言并不具备这样的能力和周边库。
有完备的缓存机制。不仅需要支持 Redis 、Memcached 等外部缓存,也应该在自己的进程内有缓存系统。我们希望大部分的请求都能在一个进程中得到数据并返回,这样是最高效的方法,一旦有了网络IO和进程间的交互,性能就会受到很大影响。
同步的写代码逻辑,不要让开发者感知到回调和异步。这个也很重要,程序员也是人,代码应该更符合人的思维习惯,显式的回调和异步关键字,会打断思路,也给调试带来困难。
最好是站在巨人肩上,基于成熟的技术上搭建。采用一门全新诞生的语言和技术,需要经历语言自身发展期频繁调整的阵痛,还可能站错队。
不仅支持 Linux 平台,还需要支持 Windows 平台,这个是我们产品很特别的需求,很多中小企业用户还是习惯 Windows 的操作,不具备 Linux 的维护能力。
基于以上几点的考虑,考察了当时的一些方案,选择了 OpenResty 。
首先,它最大的特点就是用同步的代码逻辑实现非阻塞的调用,其次它有单进程内的 LRU cache 和进程间的 share DICT cache,而且它是揉合 nginx 和 LuaJIT 而产生的。而且 nginx 有 Windows 版本,虽然有非常多的限制,但这些限制都是可以解决的, nginx 官方 Windows 版本中不支持的特性,我们开源出来的版本都解决了。
第一次看到这样的方案,我觉得它肯定会颠覆高性能服务端的开发。为什么呢?在我之前的公司里,每天会有近百亿次的查询请求,而服务器只用了十台。
我们采用了 nginx C 模块 + 内置在 nginx 中的 K-V 数据库(自己开发的),来实现所有的业务逻辑,达到这个目标。听上去很简单,但是过程非常艰辛,两三个十几年工作经验的大牛做了一年多才稳定下来。绝大部分开发能力不足,只能望尘莫及。而且后续的调试和维护,也会花费不少精力。
但是 OpenResty 的出现改变了这一切, OpenResty 非常的 pythonic ,适合人类的正常思维。新手经过一两个月的学习,做出来的 API, 就可以达到 nginx C 模块的性能,而且代码量大大减少,也方便调试。
3. 以奇虎和新浪为例,如何在项目中引入新技术
技术选型只是第一步,如何才能在一个产品或者项目中引入 OpenResty 这个新的技术呢?我拿奇虎企业安全和新浪移动这两家公司真实发生的案例给大家看看。我和新浪移动的周晶,都是在一个有成熟产品的部门,用一两个人的力量,把一个新技术,替换掉了原有的技术架构。但由于企业产品和个人产品的不同,方法有很大的不一样。
先说我所在奇虎企业安全。我在 2012 年初加入这个部门,当时产品主打免费,目标用户是小企业。所以架构设计上面,只考虑了几十点、几百点的终端请求,使用了非常强绑定的 Windows 平台技术,而且倾向于不用开源软件,自己新做一个更适合自己的框架。包括自己用 C++ 开发的 Web server,自己写的 PHP 路由和框架,数据存储在 sqlite 里面。
我帮忙修改了两个月 PHP 的 bug,看明白了技术架构的思路之后,就去新开的一个产品线了。这是一个实验性的产品,主要面对央企和专用网,一个网络中有上百万的终端。
刚开始没有什么人关注,我就直接采用了 Linux + OpenResty + Redis + Postgres 的开源组件,性能测试甩之前的N条街。后面这个实验性的产品,和之前的产品,合并为一个产品,技术上面就割裂为两套架构。老功能用老架构,新功能用新架构。
随着越来越多大用户的增加,原有的技术架构开始捉襟见肘,技术债务越积压越多。随着用户的抱怨,sqlite 被抛弃,全面换成 Postgres。但对于自己开发的框架还是有些敝帚自珍。
期间通过对比测试、OpenResty 培训还有多次用户性能问题排查,让开发同学们都知道这门技术的优势。快被加班压垮的开发同学,逐渐开始选择使用 OpenResty 而不是自研的框架,来进行新功能的开发,以及旧功能的迁移,来避免加班。
在产品重构的时候,之前自研的服务端框架被完全抛弃,服务端开发的同学从 8 、9 个人减少到 3 个人。在新技术的引入过程中,我们没有采用强制的举措,因为企业产品需要稳定,用户处部署的版本更新很慢。
而新浪移动周晶的实践,对大家更有参考意义。新浪移动最开始是基于 Apache,用 PHP 来处理用户请求。Apache 是同步多进程模型,在并发请求不多的情况下没有问题。
但是总是会有突发新闻,比如马航失联、文章出轨等,突发的高流量把后台压垮了几次。而且可以预见世界杯的流量也会很大,所以周晶花几个月时间,用 nginx 替换了 Apache,使用 nginx 的 fast_cgi_cache,QPS 提升了一个数量级。
新浪移动后台的接口都是使用 PHP 来实现的,在高并发下有些力不从心。而 nginx 简单的缓存虽然能满足性能,但不能满足业务精细化和数据一致性的要求,需要找 PHP 之外的解决方案,前提是让 PHP 的开发能够舒适的使用。 node.js 的回调地狱、Go 的调试不方便,都是一个阻碍。
他们最后选择了 OpenResty,而且基于 OpenResty 开源了一个 Web 框架 Vanilla(香草),模仿了 Yaf 的使用习惯,让 PHP 的开发更容易接受和上手。 Vanilla 已经在新浪移动开始使用,一些核心业务,比如高清图和体育直播,正在向这个框架迁移中。
4. 入门痛点,以及学习的正确方法
我和周晶的入门,都是自己摸着石头过河。当时除了 Python 社区「大妈」的那篇使用文章外,找不到其他的资料。
奇虎和新浪都用 OpenResty 成功替换了之前的技术,但问题还是挺明显,就是大家都认为自己是孤独的使用者,同事中基本没有人认同。在关键和支撑业务上,使用 OpenResty 有些不放心,都会在边缘业务上先做尝试和验证。
虽然 OpenResty 的性能做的很棒,比肩或者超过其他所有的高性能解决方案,但是担心没有学习资料、担心招不到人、担心没人交流,可能还担心作者章亦春哪天撂挑子不干了,这个项目就黄了。
高可用架构群里的各位都是架构师,是技术决策者,在引入一门新技术的时候,肯定会考虑到这些风险。比如小米科技马利超在高可用架构的分享,他们在抢购系统中曾经使用过 ngx_lua,虽然性能满足需求,但是团队里面熟悉的人少,最后还是改成了 Go 语言实现。
如何解决这些担忧? 社区是有过思考和讨论的,我们放在分享最后讲。先从一个尝试使用这门技术的开发者的角度看,OpenResty 不少基础工作没有完善,友好程度不够:
只能从源码安装,没有 apt-get、brew 等软件仓库安装方法;安装第三方库没有 PIP、NPM 之类的包管理工具,需要去先谷歌,然后拷贝代码文件到指定的目录下,才能 require 使用。
代码编写需要修改 nginx.conf 和对应的 lua 代码,即使是 hello world 也是如此。当然你可以把代码写在 nginx 的配置文件里面,但是生产环境肯定是要分离的。这种编写代码的方式,不像是一个编程语言,和常规的编程方式不同。
有独特的执行阶段概念,因为 OpenResty 是基于 nginx 的,所以也继承它的这种概念。你的代码逻辑,可能需要放在不同的阶段里面运行,才能获取你想要的预期。而这些阶段间信息如何传递,以及哪些 API 不能在某些阶段使用,就会经常拦住新手。
遇到问题只有邮件列表这一种方式来沟通,而邮件列表是被墙的。文档也只有英文版本,导致很多新手的问题无法被解决。
没有系统学习 OpenResty 的手段,大都是业务需要实现什么功能,就去文档和 API 里面去找。至于方式对不对,能不能优化,就不知道了。
而 Lua 语言自身也有一些特别的地方:
下标从 1 开始,这个是和其他编程语言很大的不同。
不区分 array 和 dict ,会导致处理 json 的时候,无法区分 array 和 object。
默认全局变量,需要在所有变量前加 local,忘记的话,可能导致各种难查的 bug。
自带的字符串正则匹配规则和通常的 PCRE 不同,使用的话,学习成本较高。
Lua 标准库和周边库,都是阻塞的,需要自己甄别哪些可以和 OpenResty 搭配使用。新手很容易使用了阻塞的库,而导致性能急剧下降。
有没有好的入门方法?
我们团队正在做这方面的努力,尽量在现有的基础上,降低学习的门槛。 对于新手,可以看 StuQ 上面 OpenResty 的系列视频教程 (http://www.stuq.org/course/detail/1015),我们计划有 4 季,分别是入门、进阶、实战和源码分析。现在第一季已经上线,第二季正在后期制作。看完前两季,基本上就可以在项目里面用了。
对于已经使用了 OpenResty 的开发者,我们把这两三年遇到的坑,都记录在 GitHub 的《OpenResty最佳实践》上面(/moonbingbing/openresty-best-practices),大家可以当做 cookbook 来使用。
内容导航&第 1 页: &第 2 页:
关于&&&&的更多文章
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP
所以姑娘,让我们做一枚花见花开的程序媛。
讲师: 37人学习过讲师: 8人学习过讲师: 30人学习过
如何看将流行的JavaScript MVC框架Ember.js? 这款Java
一周一周的过的很快,2013年已经进入了倒计时。开发频
在脚本语言领域,Lua是最快、最高效的脚本语言之一,
在这本书中,C 语言专家 Peter Prinz和Tony Crawford为你提供大量的编程参考信息。全书叙述清晰,语句简洁,分析深刻。本书主题
51CTO旗下网站Sponsered by
跨平台的库选择
大家看过上面三个 json 的例子就发现,都是围绕 cjson 库的。原因也比较简单,就是 cjson 是默认绑定到 openresty 上的。所以在 linux 环境下我们也默认的使用了他。在 360 天擎项目中, linux 用户只是很少量的一部分。大部分用户更多的是 windows 操作系统,但 cjson 目前还没有 windows 版本。所以对于 windows 用户,我们只能选择 dkjson (编解码效率没有 cjson 快,优势是纯 lua ,完美跨任何平台)。
并且我们的代码肯定不会因为 win 、 linux 的并存而写两套程序。那么我们就必须要把 json 处理部分封装一下,隐藏系统差异造成的差异化处理。
local _M = { _VERSION = '1.0' }
-- require("ffi").os 获取系统类型
local json = require(require("ffi").os == "Windows" and "dkjson" or "cjson")
function _M.json_decode( str )
return json.decode(str)
function _M.json_encode( data )
return json.encode(data)
在我们的应用中,对于操作系统版本差异、操作系统位数差异、同时支持不通数据库使用等,几乎都是使用这个方法完成的,十分值得推荐。
额外说个点, github 上有个项目 ,从官方资料上介绍 decode 的速度更快,我们也做了小范围应用。所以上面的 decode json 对象来源,就可以改成这个库。世界总是有新鲜玩意,多了解多发发现,然后再充实自己吧。后使用快捷导航没有帐号?
如何用正确姿势来学习获得OpenResty
摘要: 高可用架构分享及传播在架构领域具有典型意义的文章,本文根据奇虎360安全架构师温铭的分享记录。我个人之前主要是用Python来完成开发工作,包括云查杀和反钓鱼系统,都是Python完成的。在2011 ... ...
  编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文根据奇虎360安全架构师温铭的分享记录。
  我个人之前主要是用Python来完成开发工作,包括云查杀和反钓鱼系统,都是Python完成的。在2011年左右接触到nginx的CModule开发,被异步的高性能颠覆了三观,只是门槛太高,一直想找一个像Python一样简单,像nginxCModule一样高效的技术。
  所以在2012年,得知OpenResty这个项目的时候,我就在企业安全一个新项目里面,使用它作为服务端的主要技术。
  在今年上半年开始在Github上面,把积累的经验写成一本电子书《OpenResty最佳实践》,并在刚过去的11月14号,以社区名义组织了OpenResty的第一次技术大会。
  1.OpenResty是什么,适合什么场景下使用
  和大部分知名开源软件诞生在欧美国家不同,OpenResty自身和依赖的主要组件都是金砖国家的开发者发明的,这点还挺有意思。
  Nginx是俄罗斯人发明的,Lua是巴西几个教授发明的,中国人章亦春把LuaJITVM嵌入到Nginx中,实现了OpenResty这个高性能服务端解决方案。
  通过OpenResty,你可以把nginx的各种功能进行自由拼接,更重要的是,开发门槛并不高,这一切都是用强大轻巧的Lua语言来操控。
  它主要的使用场景主要是:
  在Lua中揉和和处理各种不同的nginx上游输出(Proxy,Postgres,Redis,Memcached等)在请求真正到达上游服务之前,Lua可以随心所欲的做复杂的访问控制和安全检测随心所欲的操控响应头里面的信息从外部存储服务(比如Redis,Memcached,MySQL,Postgres)中获取后端信息,并用这些信息来实时选择哪一个后端来完成业务访问在内容handler中随意编写复杂的Web应用,使用同步但依然非阻塞的方式,访问后端数据库和其他存储在rewrite阶段,通过Lua完成非常复杂的URLdispatch用Lua可以为nginx子请求和任意location,实现高级缓存机制
  组织OpenResty技术大会之前,我一直认为自己是一个孤独的OpenResty使用者,觉得自己在使用一个冷门的技术。
  虽然大家都听说过OpenResty或者ngx_lua,但感觉用在生产环境中使用的却少之又少,除了几个CDN公司外,好像没有听说过哪家知名公司在使用。而CDN行业之所以使用,很多是受到cloudflare技术栈的影响,OpenResty的作者也在国外这家CDN公司。
  但办完这个大会,我发现使用者真的挺多,奇虎360的所有服务端团队都在使用,京东、百度、魅族、知乎、优酷、新浪这些互联网公司都在使用。有用来写WAF、有做CDN调度、有做广告系统、消息推送系统,还有像我们部门一样,用作server的。有些还用在非常关键的业务上,比如开涛在高可用架构分享的京东商品详情页,是我知道的ngx_lua最大规模的应用。
  2.奇虎企业安全服务端技术选型的标准
  先说下3年多前做架构选型的时候,我为什么会选择OpenResty?
  其实架构如何设计并不重要,因为每家公司,每个团队,他们的公司文化和技术背景各不相同,生搬硬套会适得其反。重要的是当初为什么这么选择,中途为什么调整。
  我们的产品要求单机上面,服务端提供高性能的API接口,QPS至少过万,未来需要支撑到10万。我们并没有急于去使用PHP、Python或者其他的语言来实现功能,而是先勾勒出一个理想化的技术模型。
  这个模型应该具备:
  非阻塞的访问网络IO。在连接MySQL、Redis和发起HTTP请求时,工作进程不能傻傻的等待网络IO的返回,而是需要支持事件驱动,用协程的方式让CPU资源更有效的去处理其他请求。很多语言并不具备这样的能力和周边库。
  有完备的缓存机制。不仅需要支持Redis、Memcached等外部缓存,也应该在自己的进程内有缓存系统。我们希望大部分的请求都能在一个进程中得到数据并返回,这样是最高效的方法,一旦有了网络IO和进程间的交互,性能就会受到很大影响。
  同步的写代码逻辑,不要让开发者感知到回调和异步。这个也很重要,程序员也是人,代码应该更符合人的思维习惯,显式的回调和异步关键字,会打断思路,也给调试带来困难。
  最好是站在巨人肩上,基于成熟的技术上搭建。采用一门全新诞生的语言和技术,需要经历语言自身发展期频繁调整的阵痛,还可能站错队。
  不仅支持Linux平台,还需要支持Windows平台,这个是我们产品很特别的需求,很多中小企业用户还是习惯Windows的操作,不具备Linux的维护能力。
  基于以上几点的考虑,考察了当时的一些方案,选择了OpenResty。
  首先,它最大的特点就是用同步的代码逻辑实现非阻塞的调用,其次它有单进程内的LRUcache和进程间的shareDICTcache,而且它是揉合nginx和LuaJIT而产生的。而且nginx有Windows版本,虽然有非常多的限制,但这些限制都是可以解决的,nginx官方Windows版本中不支持的特性,我们开源出来的版本都解决了。
  第一次看到这样的方案,我觉得它肯定会颠覆高性能服务端的开发。为什么呢?在我之前的公司里,每天会有近百亿次的查询请求,而服务器只用了十台。
  我们采用了nginxC模块+内置在nginx中的K-V数据库(自己开发的),来实现所有的业务逻辑,达到这个目标。听上去很简单,但是过程非常艰辛,两三个十几年工作经验的大牛做了一年多才稳定下来。绝大部分开发能力不足,只能望尘莫及。而且后续的调试和维护,也会花费不少精力。
  但是OpenResty的出现改变了这一切,OpenResty非常的pythonic,适合人类的正常思维。新手经过一两个月的学习,做出来的API,就可以达到nginxC模块的性能,而且代码量大大减少,也方便调试。
  3.以奇虎和新浪为例,如何在项目中引入新技术
  技术选型只是第一步,如何才能在一个产品或者项目中引入OpenResty这个新的技术呢?我拿奇虎企业安全和新浪移动这两家公司真实发生的案例给大家看看。我和新浪移动的周晶,都是在一个有成熟产品的部门,用一两个人的力量,把一个新技术,替换掉了原有的技术架构。但由于企业产品和个人产品的不同,方法有很大的不一样。
  先说我所在奇虎企业安全。我在2012年初加入这个部门,当时产品主打免费,目标用户是小企业。所以架构设计上面,只考虑了几十点、几百点的终端请求,使用了非常强绑定的Windows平台技术,而且倾向于不用开源软件,自己新做一个更适合自己的框架。包括自己用C++开发的Webserver,自己写的PHP路由和框架,数据存储在sqlite里面。
  我帮忙修改了两个月PHP的bug,看明白了技术架构的思路之后,就去新开的一个产品线了。这是一个实验性的产品,主要面对央企和专用网,一个网络中有上百万的终端。
  刚开始没有什么人关注,我就直接采用了Linux+OpenResty+Redis+Postgres的开源组件,性能测试甩之前的N条街。后面这个实验性的产品,和之前的产品,合并为一个产品,技术上面就割裂为两套架构。老功能用老架构,新功能用新架构。
  随着越来越多大用户的增加,原有的技术架构开始捉襟见肘,技术债务越积压越多。随着用户的抱怨,sqlite被抛弃,全面换成Postgres。但对于自己开发的框架还是有些敝帚自珍。
  期间通过对比测试、OpenResty培训还有多次用户性能问题排查,让开发同学们都知道这门技术的优势。快被加班压垮的开发同学,逐渐开始选择使用OpenResty而不是自研的框架,来进行新功能的开发,以及旧功能的迁移,来避免加班。
  在产品重构的时候,之前自研的服务端框架被完全抛弃,服务端开发的同学从8、9个人减少到3个人。在新技术的引入过程中,我们没有采用强制的举措,因为企业产品需要稳定,用户处部署的版本更新很慢。
  而新浪移动周晶的实践,对大家更有参考意义。新浪移动最开始是基于Apache,用PHP来处理用户请求。Apache是同步多进程模型,在并发请求不多的情况下没有问题。
  但是总是会有突发新闻,比如马航失联、文章出轨等,突发的高流量把后台压垮了几次。而且可以预见世界杯的流量也会很大,所以周晶花几个月时间,用nginx替换了Apache,使用nginx的fast_cgi_cache,QPS提升了一个数量级。
  新浪移动后台的接口都是使用PHP来实现的,在高并发下有些力不从心。而nginx简单的缓存虽然能满足性能,但不能满足业务精细化和数据一致性的要求,需要找PHP之外的解决方案,前提是让PHP的开发能够舒适的使用。node.js的回调地狱、Go的调试不方便,都是一个阻碍。
  他们最后选择了OpenResty,而且基于OpenResty开源了一个Web框架Vanilla(香草),模仿了Yaf的使用习惯,让PHP的开发更容易接受和上手。Vanilla已经在新浪移动开始使用,一些核心业务,比如高清图和体育直播,正在向这个框架迁移中。
  4.入门痛点,以及学习的正确方法
  我和周晶的入门,都是自己摸着石头过河。当时除了Python社区「大妈」的那篇使用文章外,找不到其他的资料。
  奇虎和新浪都用OpenResty成功替换了之前的技术,但问题还是挺明显,就是大家都认为自己是孤独的使用者,同事中基本没有人认同。在关键和支撑业务上,使用OpenResty有些不放心,都会在边缘业务上先做尝试和验证。
  虽然OpenResty的性能做的很棒,比肩或者超过其他所有的高性能解决方案,但是担心没有学习资料、担心招不到人、担心没人交流,可能还担心作者章亦春哪天撂挑子不干了,这个项目就黄了。
  高可用架构群里的各位都是架构师,是技术决策者,在引入一门新技术的时候,肯定会考虑到这些风险。比如小米科技马利超在高可用架构的分享,他们在抢购系统中曾经使用过ngx_lua,虽然性能满足需求,但是团队里面熟悉的人少,最后还是改成了Go语言实现。
  如何解决这些担忧?社区是有过思考和讨论的,我们放在分享最后讲。先从一个尝试使用这门技术的开发者的角度看,OpenResty不少基础工作没有完善,友好程度不够:
  只能从源码安装,没有apt-get、brew等软件仓库安装方法;安装第三方库没有PIP、NPM之类的包管理工具,需要去先谷歌,然后拷贝代码文件到指定的目录下,才能require使用。
  代码编写需要修改nginx.conf和对应的lua代码,即使是helloworld也是如此。当然你可以把代码写在nginx的配置文件里面,但是生产环境肯定是要分离的。这种编写代码的方式,不像是一个编程语言,和常规的编程方式不同。
  有独特的执行阶段概念,因为OpenResty是基于nginx的,所以也继承它的这种概念。你的代码逻辑,可能需要放在不同的阶段里面运行,才能获取你想要的预期。而这些阶段间信息如何传递,以及哪些API不能在某些阶段使用,就会经常拦住新手。
  遇到问题只有邮件列表这一种方式来沟通,而邮件列表是被墙的。文档也只有英文版本,导致很多新手的问题无法被解决。
  没有系统学习OpenResty的手段,大都是业务需要实现什么功能,就去文档和API里面去找。至于方式对不对,能不能优化,就不知道了。
  而Lua语言自身也有一些特别的地方:
  下标从1开始,这个是和其他编程语言很大的不同。
  不区分array和dict,会导致处理json的时候,无法区分array和object。
  默认全局变量,需要在所有变量前加local,忘记的话,可能导致各种难查的bug。
  自带的字符串正则匹配规则和通常的PCRE不同,使用的话,学习成本较高。
  Lua标准库和周边库,都是阻塞的,需要自己甄别哪些可以和OpenResty搭配使用。新手很容易使用了阻塞的库,而导致性能急剧下降。
  有没有好的入门方法?
  对于已经使用了OpenResty的开发者,我们把这两三年遇到的坑,都记录在GitHub的《OpenResty最佳实践》上面(),大家可以当做cookbook来使用。
  5.nginScript这样的尝试会替代OpenResty吗?
  nginScript是今年nginx大会上,Nginx官方推出的一个新的配置语言。它是模仿了OpenResty的做法,把JavaScriptVM嵌入到nginx中,提供简单的nginx配置功能。
  我们看下它的helloworld:
  再对比下OpenResty的helloworld:
  看上去差不多,只是OpenResty简洁一些。根据nginx官方的说明,nginScript只是想提供一种更方便配置nginx的方法,并不想取代ngx_lua。
  考虑到JavaScript本身的流行和开发社区的强大,如果未来两三年它从一个简单的nginx配置语言,逐渐演变成类似ngx_lua这样功能非常完备的开发语言,甚至替代OpenResty也是有可能的。
  当然,这个前提是OpenResty停滞不前。现在OpenResty已经有的功能,和计划开发的功能,倾向于覆盖nginxPlus的功能。所以nginx和OpenResty之间,有一个良性的竞争关系,这是大家都乐意看到的。
  6.未来重点解决的问题和新增特性
  短期内的目标,是想降低入门的难度:
  提供官方二进制发布包。类似于的安装方法,一行命令,下载一个sh脚本,增加一个源地址,不用手工解决依赖,不用源码编译,直接就可以试用。
  而且会发布Windows的二进制包,方便这个平台的开发者本机做一些测试。
  增加包管理。命令行工具叫iresty,可以从iresty.org上面搜索、安装需要的luaresty库,避免找错库或者放错目录。
  写一本书《OpenResty编程》,这本书会成为官方的入门书籍,框架和关键内容由作者春哥直接操刀,我和社区的其他同学帮助一起完成。
  做完上面3点,OpenResty的入门难度会降低到和其他编程语言一样。
  在功能上面,会增加很多激动人心的新特性:
  支持TCP和UDP。Nginx最新的stream子系统已经支持了TCP,OpenResty的ngx_stream_lua模块正在开发中,会拥有和现有的nginxhttpmodlue相同的luaAPI,所以很多应用和库,可以不加修改的运行在一个新的子系统上面。
  更好的支持推送场景。增加sharedlist共享内存的队列,可以用于worker间的通讯;增加semaphore特性,用于ngx_lua轻量级线程间的通讯。酷狗音乐的推送服务就是基于这些实现的,这些改动点会在这个月并入master。可以邀请酷狗音乐的同学,来给大家详细分享下里面的细节。
  建立一个开源的WAF平台。现在阿里云和cloudflare的WAF做的都很棒,经受住了很多实际的考验。但是都没有开源,我们希望最好的WAF是开源的,而且是基于OpenResty的。
  在OpenResty中增加内存数据库。可以有持久化,或者就是全内存的,支持SQL的查询。这个也是出于极致性能的考虑,有时候我们还是需要使用SQL来做一些复杂的查询,但有不想使用那么重的关系型数据库,而且数据是可以丢失的。那么这个就可以排上用场。
  实现PHP、Python等方言,让PHP、Python等程序员可以用自己喜欢的语言写OpenResty的代码,底层转换为LuaJIT的字节码。
  春哥在OpenResty技术大会上面说了非常多的新特性,包括streamingRegEx正则引擎等等,非常高端,我挑了几个我觉得有意思的做介绍。
  7.开源社区建设
  OpenResty诞生于2011年,大多数时间都是春哥主力在维护这个项目,当然也有很多开发者提交feature和bugfix,但基本上算单打独斗。
  社区有github和邮件列表,大部分还是提问的。春哥每天会花费很多的时间,来详细的回答各种基础问题。
  今年新增了QQ群和微信群,QQ群的质量很高,每天都会有很多提问,非技术问题是被禁止的。而且还有了自己的技术大会,能给大家面对面交流的机会。
  我们翻译了ngx_lua的英文文档,能让大家更方便的查找资料;我们搭建了一个不用翻墙就能访问的论坛:,用作提问和知识积累的地方。后面会把谷歌邮件列表的内容同步过来。
  只有上面这些是不够的,在OpenResty技术大会的第二天,我们召集了一个很小规模的闭门会议,决定成立OpenResty咨询委员会。
  这个委员会,是以个人名字参加的,成员来自奇虎360、新浪、又拍云、酷狗音乐等公司和社区的开发者,希望把国内社区的核心使用者和开发者团结在一起,促进OpenResty的发展。
  同时,OpenResty软件基金会也开始筹备工作,我们希望走规范的非盈利组织的模式,来保证OpenResty长期稳定发展。给开发者和使用者信心,敢于在关键业务上面使用OpenResty。
  1、请问OpenResty的定位是什么,从分享来看似乎全栈了?
  定位主要是高性能,所有的新功能和优化,都是针对性能的。但是也有人拿来做页面,比如京东;也有人拿来替代PHP做Webserver,比如新浪。我觉得它越来越像一个独立的开发语言。
  2、请问Lua是不是可以实现动态配置location?比如动态切流量?
  balancer_by_lua可能是你需要的,你可以用Lua来定义自己的负载均衡器,可以在每个请求的级别上去定义,当前访问的后端的节点地址、端口,还可以定制很细力度的访问失败之后的重试策略。
  3、OpenResty是可以拿到nginx请求里面的所有信息?那是不是可以做一些更复杂的转发操作?能介绍一下OpenResty在cdn里面的应用场景吗?
  可以看下的分享,又拍的张聪非常详细的介绍了OpenResty在又拍CDN的使用。
  4、OpenResty是否修改了nginx的源码,还是和nginx完全可剥离开的?Nginx版本升级,OpenResty也跟着升级吗?例如nginx修复漏洞bug等情况。
  OpenResty不修改nginx的源码,可以跟随nginx无痛升级。如果你觉得OpenResty升级慢了,你可以只拿ngx_lua出来,当做nginx的一个模块来编译。实际上,OpenResty在测试过程中,发现了很多nginx自身的bug。
  5、软WAFnginx+Lua是主流和未来方向么?
  我觉得WAF应该基于nginx,不管是性能还是流行程度。而OpenResty具有更灵活操控nginx的能力,所以我觉得OpenResty在WAF领域非常合适。cloudflare的WAF就是基于OpenResty。
  6、看样子未来可能有各种ngx_xx,最有可能的是js,不知道这方面有什么前沿的动向?
  我们组在尝试把PHP嵌入到nginx中,当然性能肯定不如LuaJIT,但是会方便很多PHP同学,有进展的话,我们会开源出来:)
  7、OpenResty目前看似乎是一个proxy的配置框架(糅合了nginx+Lua),但以后的发展是什么样子?会不会以后更进一步,比如做一个APIgateway之类的。
  OpenResty其实是希望大家忽略nginx的存在,直接使用ngx_lua提供的API实现自己的业务逻辑。更像一门独立的开发语言,只不过底层使用nginx的网络库而已。你可以按照你的想法搭建任何好玩的服务端应用出来。
  (刘世杰/高可用架构)
今年来,手机地图市场的竞争变得愈发激烈,纵观几年以来,手机地图经历了免费模式带来
李世石21日表示,虽然需要慎重地考虑,但是通过上次与阿尔法的对弈,在一定程度上掌握
而过去两年,是保税电商(保税跨境贸易电子商务)快速发展的两年,这其中诞生了蜜芽宝
作为十多年前就在用友网络(原为用友软件)从事医药行业信息化系统的高级咨询专家,本
根据《华尔街日报》援引摩根斯坦利的估算,这一目标和现实还有着挺大的差距。去年,亚
Uber在过去几年当中曾经遭遇严重的安全漏洞。比如在2014年泄露5万名司机的个人信息,
架构因人而异,不同的架构师大多会有不同的看法;架构也因项目而异,不同的项目需求不
其实VR并不是一个新的概念,在过去的几十年里人们都在研究这件事。凯文凯利在八零年代
谷歌母公司Alphabet董事长埃里克·施密特(EricSchmidt)在主题演讲中表示,机器学习
私人股票交易平台NasdaqPrivateMarket调查了126名参会者,其中32%的人是公司创始人或
电话:010-
地址:北京市海淀区北清路68号
移动客户端下载
微信公众号:yonyouudn
扫描右侧二维码关注我们
专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041
京公网网备安4
Powered by Discuz!}

我要回帖

更多关于 lua resty redis 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信