女主宣言

lua 是一个巴西人设计的小巧的脚本语言,它的设计目的是为了能够嵌入到应用程序中,从而为应用程序提供灵活的扩展和定制功能。今天我们邀请到 360 高级开发工程师李钢带我们快速入门 lue。本文最先发布于 opsdev,转载已获取作者授权。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

前言

作为web开发工程师,我们平时主要使用的开发语言是php。这个语言提供了对html模版的强大的处理能力,也提供了十分丰富的函数库及扩展,非常的适合web开发使用。那么lua是如何进入到我们的视线中的呢?在这里我先说下我在开发一个web产品时,会优先考虑的几个问题:

  1. 如何保证服务的稳定性,即如何防止白屏、50x错误的发生。

  2. 如何提高页面的响应速度,即让用户感觉页面打开足够快。

  3. 那么在用php解决这几个问题时,是否够用呢?

答案在我看来是否定的,为什么这么说呢?请听我分别道来:

1

php在处理服务稳定性时的不足

先简单说下由php导致的服务异常原因:

  1. php语法错误、运行时的异常都会导致500错误,这在用户端浏览器就会显示出白屏。

  2. 在使用nginx + php-cgi这种组合提供动态web服务时,当后台cgi进程挂掉或数量不够用时,即会产生502错误;当php执行时遭遇阻塞(如连db时,db压力过大),而在nginx中配置的超时时间到达后,通常会产生504错误。

这几种异常本身都是由于php导致的,当然不能靠php去解决。

webserver如nginx提供了如error_page这种用于处理当服务产生异常时的后续处理机制,为了不让用户看到白屏或错误页面,我们可以定时对正常服务时的页面做一个快照,当遇到服务异常时,就给用户这个历史快照看。

但这样做也有个局限性:当你提供服务的页面很多时,又或是需要根据请求的参数做一些逻辑上的处理时,显然就很难做到了。

你也许会说,我可以写nginx配置,让它分析请求参数,再做相应的逻辑处理。但是这样做的话,想想看你的nginx配置会有多么的复杂,多么的难以维护,而且就算你这样做,也不能解决所有的问题。比如说我有个接口要输出json字符串,或是其它别的格式,你总不能说我再去写个nginx扩展让它支持json吧。

所以,在提高服务的稳定性方面,我们的需求是:

  1. 能用到webserver提供的错误处理机制。

  2. 能方便的处理请求参数,做需要的逻辑处理。

2

php在提高用户响应速度方面的不足

php是一个阻塞式顺序执行的脚本语言,虽然支持多进程执行,但这种模式并不适合使用在并发量很高的web服务中。

想像如果一个请求的处理过程中,你需要调用到多处外部资源或服务(db、rest接口),那么你的处理速度就要依赖于这些外部服务,而且是一个一个顺序处理的,它们越多,处理就越慢。

php的multi_curl可以用来并发请求这些外部的rest服务,但这样做的话,依旧需要等全部的请求都处理完成,才能返回给用户。换句话说,如果某个外部服务很慢,那么用户看到页面打开依旧会很慢。

也可以选择把页面分块,让慢的部分用js异步请求加载。但这样做的话,会增加服务器的访问量,每增加一块,访问量会增大一倍。

所以,在提高页面的响应速度方面,我们的需求是:

  1. 耗时慢的服务能够做到异步加载,服务端每完成一部分的计算,就让页面展示这部分。

  2. 不能过大的增加服务器的压力。

3

nginx-lua模块

最终,我们找到了nginx-lua?模块。这个模块会在每个nginx的worker_process中启动一个lua解释器,在nginx处理http请求的11个阶段中,你可以在其中的多个阶段用lua代码处理请求。

这二者的结合,给我们的web开发带来了新的思路。下面我就来说下导航目前是如何使用它来解决问题的。

4

解决服务稳定性

这里的思路很简单,我们会在error_page指令被执行后,用lua代码来接受参数,处理逻辑部分,最终会返回前端和用php处理看起来一致的内容。部分代码如下:

nginx_conf:


这里大家看到,当请求出现50x错误时,会跳到location jump_to_error_page_api中,在这里面,content_by_lua_file指令会在content处理阶段启动指定好的lua脚本(这里是error_page_api.lua)来处理请求。我们再看下lua脚本中都做了什么:

lua example:


这里大家可以看到,我们可以在lua脚本中接受请求参数,做和php一样的逻辑,最终输出前端需要的正确的内容。

目前这套机制我们已经用在我们这边的一个重要用户页面上,目前都没有收到用户反馈说页面打不开,出现错误页这种,效果很是明显。

5

提高用户页面的响应速度

上面提到的解决响应速度的几个需求,我们的思路是引入bigpipe的处理机制。关于bigpipe本文不做讲解,大家可以自行google。这个项目目前尚处于实验阶段,但我们已经实现了一个简单的demo:

nginx_conf:


这里指定请求index.php会用bigpipe_index.lua处理。

lua example:


这里在处理请求时,大致逻辑如下:

  1. 首先会先吐出首屏html部分及部分html框架代码。

  2. 接下来会启动3个lua协程,在nginx-lua这个模块的调度下以异步非阻塞的模式并发的来处理3个外部请求。

  3. 这3个外部请求各自的延时不同,但是任何一部分处理完成,都会直接返回给前端用于展示。

通过这种方式,用户的页面响应速度得到了明显的提高,体验更好。

6

结束语

正如lua官方给出的定义所说,lua很小巧,非常的适合嵌入已有的应用程序中,从而补足现有系统的一些缺憾,并扩展出新的功能。对nginx-lua模块的使用,笔者也还在研究中,但我相信更好的使用它,能为我们现有的web开发打开一扇新的窗户,理解更深层次的知识。

参考资料:

[1] https://www.lua.org/

[2] https://github.com/openresty/lua-nginx-module

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享


我们能用 lua 做什么相关推荐

  1. c++ lua 可以做什么_Redis令牌桶算法(全网最全,后续可以接入lua做原子性操作)...

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...

  2. lua打开浏览器并加载网页_使用Lua做Web开发

    Lua应用程序与框架 WSAPI 从Lua Web应用程序抽象Web主机服务器的API Xavante 提供WSAPI接口的Lua Web服务器 Orbit Orbit是Lua的MVC Web框架,完 ...

  3. iphone上用lua做了个doodlejump的菜单界面

    --[[南阳草庐软件科技有限公司hi.baidu.com/xingyan126 ]] waxClass{"AppDelegate", protocols = {"UIAp ...

  4. 对应猎豹网校的lua 视频教程 做的学习记录 前三课简单介绍1-3

    假设有一个1.lua 位置在 c:\Users\Administrator\Documents\lua\1.luafunction fact(n)if n==0 thenreturn 1elseret ...

  5. 关于LUA+Unity开发_toLua篇【二】

    2019独角兽企业重金招聘Python工程师标准>>> 这篇来说说github上的的toLua框架 LuaFramework.两个版本分别对应UGUI和NGUI.这个框架是基于新一代 ...

  6. Lua Behavior Tree For Unity3D(Lua描述行为树For Unity3D)

    文章目录点击展开[+] 行为树(BTTree)笔记 为什么是Lua版本的行为树 目前国内的手机游戏都标配热更新功能,而游戏AI自然也是MMO游戏的一个标配,比如说挂机的AI,宠物的AI等等. 说起如何 ...

  7. redis lua

    redis 支持复杂数据类型  : key-value, string, list, set, hash table, sorted set, 其他有用特性:            TRANSACTI ...

  8. 网关层面为何要用Lua

    <Lua程序设计> JS是解释型语言,每次执行都会将其解释一遍.nodejs可以做到半编译,第一次解释,第二次就从缓存中取. Openresty开发的kong网关.java开发的网关性能肯 ...

  9. cocos2dx java 调用lua_Cocos2d-x Lua实现从Android回调到Lua的方法

    最近在研究怎么把积分墙嵌入到Cocos2d-x Lua的里,折腾了几天,总算调通了,主要要解决的问题是,调用积分墙之后,当积分发生改变的时候,有一个回调方法,回调会返回用户还剩下多少积分,当Andro ...

最新文章

  1. 简单配置Mdeamon邮件服务程序。
  2. 文件内容批量修改工具
  3. [转]iPhone本地化总结
  4. 合工大计算机学院吴辽源,计算机学院智能计算系统系召开人才培养大讨论专题会议...
  5. 检查最后出现子字符串的位置!
  6. 连续型随机变量量函数的期望
  7. 老华为交换机S3500配置SSH
  8. 2018ICPC焦作站网络赛 Transport Ship 多重背包
  9. 蓝桥杯 画积木 /洛谷 P1990 墙壁覆盖
  10. CSDN博客放阿里妈妈广告代码的方法
  11. PDF怎么免费转换成Excel?
  12. 数据库资源博客---小麦苗BEST
  13. 51单片机(四)—— 51单片机仿真芯片的使用
  14. 使用七牛云上传图片时出现Network error during preQuery和运行时出现okhttp的问题
  15. 价格歧视:降价促销的底层逻辑
  16. 增强低频和高频 matlab,实验名称高斯低频滤波及高频增强滤波.doc
  17. 安装yolov5时,遇到的问题
  18. 英文名字大全(女篇)
  19. 服务器生成镜像文件,云服务器 生成镜像
  20. 如果用计算机计算带有大括弧的数学题,小学一年级数学上册图画大括号应用题doc...

热门文章

  1. 电脑最忌的18个小动作
  2. debug没反应 eclipse_解决eclipse无法运行或调试的办法
  3. python爬取某人所有微博_Python爬取博客的所有文章并存为带目录的word文档(实例67)
  4. Docker的一些理解(二)
  5. 计算机网络基础笔记 运输层协议UDP/TCP
  6. Apache和PHP结合、Apache默认虚拟主机
  7. 生成树协议(STP)原理与配置PVST+实现负载均衡
  8. ARM linux的启动部分源代码简略分析【转】
  9. 数据决策成共识 大数据产业期待点“数”成金
  10. DOM(二)使用DOM