OpenResty基本介绍

        Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开发者对其望而生畏。

        为了开发人员方便,所以我们需要一种整合了Nginx和lua的框架,那就是OpenResty,它帮我们实现了可以用lua的规范开发,实现各种业务。  

        OpenResty是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。

        而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。

        随着架构的升级,我们会慢慢的把一些不太复杂的业务可以移到nginx层,从而提高我们的吞吐量,解决一些性能上的瓶颈。例如在nginx这一层做简单的限流、黑白名单,缓存之类的业务复杂性不是太强的工作,从而增加我们的吞吐率,也可以在nginx这一层过滤掉一些垃圾流量,从而让tomcat层只需要更加专注于业务。

        目前在淘宝,京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构。

我们再来了解一下Nginx和lua:

Nginx:

众所周知nginx性能很高,而高性能与其架构是分不开的。我们简单介绍一下nginx的架构。

  • nginx采用的是多进程模式,nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程。而主要的网络事件,则是放在worker进程中处理。(worker进程的个数可以自己设置,一般设置为机器cpu核心数)对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题排查时,也更方便。即使某个worker进程异常,也仅会导致此worker上的请求失效而不会影响所有请求。
  • Nginx是采用异步非阻塞的方式去处理请求的,异步非阻塞其实就是当调用出现等待的IO之类的情况时,不会阻塞在这里,而是去处理别的事情,等IO准备好了,再回来执行。

 Lua:

 Lua 是一个小巧的脚本语言。由巴西人开发。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能

  • Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。
  • Lua由标准C编写而成,支持面向过程编程和函数式编程,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。