OpenResty lua实现的 Snowflake openresty 原理_Lua

 

前言:

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

OpenResty整合了Nginx和lua的框架帮我们实现了可以用lua的规范开发,实现各种业务,并且帮我们弄清楚各个模块的编译顺序

一.OpenResty运行原理

Nginx 采用的是 master-worker 模型,一个 master 进程管理多个 worker 进程,基本的事件处理都是放在 woker 中,master 负责一些全局初始化,以及对 worker 的管理。在OpenResty中,每个 woker 使用一个 LuaVM,当请求被分配到 woker 时,将在这个 LuaVM 里创建一个 coroutine(协程)。协程之间数据隔离,每个协程具有独立的全局变量_G。

协程和多线程下的线程类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协程程序共享全局变量等信息。线程和协程的主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多个线程,而协程是通过代码来完成协程的切换,任何时刻只有一个协程程序在运行。并且这个在运行的协程只有明确被要求挂起时才会被挂起。

OpenResty lua实现的 Snowflake openresty 原理_服务器_02

二.OpenResty的优势

首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。

借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。

而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构。

三.Nginx和lua的简介

1. Nginx:

(1) Nginx的优点

  • 轻量级同样起web 服务比apache占用更少内存及资源 
  • 抗并发nginx 处理请求异步非阻塞而apache 则阻塞型高并发下nginx 能保持低资源低消耗高性能 
  • 高度模块化设计编写模块相对简单 
  • 社区活跃各种高性能模块出品迅速啊

(2) Nginx为什么性能高,占用内存少

  • 首先,nginx采用的是多多进程模式,好处是什么呢?首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低风险。
  • Nginx是采用异步非阻塞的方式去处理请求的,什么是异步非阻塞呢?其实就是当一个线程调用出现等待的io之类的情况时,而不是阻塞在这里,而是去处理别的事情,等io准备好了,然后再去执行。

2. lua:

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

(2) Lua的特点:

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

实验: 

安装编译openresty:

下载openresty包

lftp 172.25.254.250
-->cd pub/docs/lamp/
-->get openresty-1.19.9.1.tar.gz
-->exit
tar zxf openresty-1.19.9.1.tar.gz

OpenResty lua实现的 Snowflake openresty 原理_nginx_03

 源码编译:

cd openresty-1.19.9.1/
ls
./configure --with-http_ssl_module
make && make install

OpenResty lua实现的 Snowflake openresty 原理_Nginx_04

OpenResty lua实现的 Snowflake openresty 原理_nginx_05

 添加修改配置文件:

/usr/local/openresty/nginx/conf

cd /usr/local/openresty/
ls
cd nginx/conf/
pwd--->【/usr/local/openresty/nginx/conf】  查看绝对路径
ls
vim nginx.conf
   3行:worker_processes  auto;
   13行:worker_connections  65535;
   18行添加upstream memcache {
          server 127.0.0.1:11211;
          keepalive 512;
          }

OpenResty lua实现的 Snowflake openresty 原理_运维_06

OpenResty lua实现的 Snowflake openresty 原理_nginx_07

 打开9000和11211端口:

netstat -antlp   #查看服务中打开的端口
systemctl start memcached.service    打开11211端口
systemctl start php-fpm    #打开9000端口
netstat -antlp       #查看11211和9000端口是否打开

OpenResty lua实现的 Snowflake openresty 原理_Lua_08

OpenResty lua实现的 Snowflake openresty 原理_nginx_09

vim nginx.conf
  69行左右添加:
  location /memc {
        internal;        
        memc_connect_timeout 100ms;
        memc_send_timeout 100ms;
        memc_read_timeout 100ms;
        set $memc_key $query_string;    
        set $memc_exptime 300;
        memc_pass memcache;
        }
  82行到88行取消注释;
  82行后添加:
            set $key $uri$args;
            srcache_fetch GET /memc $key;
            srcache_store PUT /memc $key;
   再注释掉89行
   90行改为:include    fastcgi.conf;

OpenResty lua实现的 Snowflake openresty 原理_运维_10

OpenResty lua实现的 Snowflake openresty 原理_Nginx_11

 开启nginx

which nginx 
   【/usr/local/bin/nginx】
nginx #打开nginx
ps ax     #查看进程

OpenResty lua实现的 Snowflake openresty 原理_运维_12

真机中:

用ab命令进行测试:(可以看到转速现在是每秒1540)

ab -c10 -n5000 http://172.25.11.1/example.php  
 #真机中查看每秒的转速

OpenResty lua实现的 Snowflake openresty 原理_服务器_13

OpenResty lua实现的 Snowflake openresty 原理_运维_14

 server1中:

构建高效透明缓存机制

nginx -s stop  #关闭nginx
/usr/local/openresty/nginx/sbin/nginx -t
/usr/local/openresty/nginx/sbin/nginx 
ps ax
cd .. 【/usr/local/nginx】
cd html/
cp /usr/local/nginx/html/example.php . 
 #把example.php复制到当前(/usr/local/nginx/html)
ls   #查看目录里的文件

OpenResty lua实现的 Snowflake openresty 原理_nginx_15

OpenResty lua实现的 Snowflake openresty 原理_服务器_16

 真机中:

用ab命令进行测试:(可以看到转速现在是每秒6391,是刚才的好几倍)

ab -c10 -n5000 http://172.25.11.1/example.php   #真机中查看每秒的转速是刚才的好几倍

OpenResty lua实现的 Snowflake openresty 原理_Nginx_17

 

OpenResty lua实现的 Snowflake openresty 原理_nginx_18