温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

openResty中怎么实现Lua网关编程

发布时间:2021-08-03 14:46:10 来源:亿速云 阅读:334 作者:Leah 栏目:编程语言

这期内容当中小编将会给大家带来有关openResty中怎么实现Lua网关编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

openResty中怎么实现Lua网关编程

使用openResty后,项目架构能够从网关层做出转型: openResty中怎么实现Lua网关编程

选择使用OpenResty,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。为Nginx做了加成,从而减少了内部链路传输次数。

为了体验Lua的优势,我们做了一个实验:实验流程非常简单,通过ab的压测来查看高并发地操作数据库环境下,各技术体系(Lua、PHP、NodeJS)的响应情况: 先简单看看Lua的脚本:

local ngx=require 'ngx';
local mysql=require 'resty.mysql';
local db,err=mysql:new();
if not db then
        ngx.say('failed to create mysql component:',err);
        return
end
db:set_timeout(1000);
local ok,err,errorcode,sqlstate=db:connect{
        host = '127.0.0.1',
        port = 3306,
        database = 'db_test',
        user = 'root',
        password = '123456',
        charset = 'utf8',
        max_packet_size = 2048 * 2048
};
if not ok then
        ngx.say('failed to connect database : ',err,', error code is : ',errorcode);
        return
end
local sql="insert into db_log(user_name,create_time,content) values('lua',0,'lua')";
local res,err,errorcode,sqlstate= db:query(sql);
if not res then
        ngx.say('failed to query sql : ',err,', error code is : ',errorcode);
else
        ngx.say('it is finish');
end
local ok,err=db:close();
--db:set_keepalive(10000,50)
if not ok then
        ngx.say('failed to pool alive: ',err);
        return
end
ngx.say('finish');

PHP的代码:

<?php
$mysql_server_name = '127.0.0.1'; //改成自己的mysql数据库服务器
$mysql_username = 'root'; //改成自己的mysql数据库用户名
$mysql_password = '123456'; //改成自己的mysql数据库密码
$mysql_database = 'db_test'; //改成自己的mysql数据库名
$conn=mysqli_connect($mysql_server_name,$mysql_username,$mysql_password,$mysql_database); //连接数据库
if (mysqli_connect_errno($conn)) {
    die("连接 MySQL 失败: " . mysqli_connect_error());
}
mysqli_query($conn,"set names utf8"); //数据库编码格式
//查询代码
$sql = 'insert into db_log(user_name,create_time,content)values("php",0,"php")';
$query = mysqli_query($conn,$sql);
mysqli_close($conn);
echo 'finish';

NodeJS代码:

const http =require('http');
const  url=require('url');
http.createServer((req,res)=>{
        if(url.parse(req.url).path!='/test'){
                res.writeHead(200,{'Content-Type':'text/plain'});
                res.end('');
                return;
        }
        let mysql  = require('mysql');
        let connection = mysql.createConnection({
                host     : '127.0.0.1',
                user     : 'root',
                password : '123456',
                port: '3306',
                database: 'db_test'
        });
        connection.connect();
        let  sql = 'insert into db_log(user_name,create_time,content) values("node",0,"node")';
        connection.query(sql,function (err, result) {
                if(err){
                        console.log('[SELECT ERROR] - ',err.message);
                        return;
                }
        });
        connection.end();
        let status=200;
        res.writeHead(status,{'Content-Type':'text/plain'});
        res.end('finish');
}).listen(8087);
console.log('server is running.');

完成以上代码并且部署到一台2核4G的服务器后,我利用AB分别对三者进行了压测,得出以下结果: Lua的压测结果如下: openResty中怎么实现Lua网关编程

PHP的压测结果如下: openResty中怎么实现Lua网关编程

NodeJS的压测结果如下: openResty中怎么实现Lua网关编程

对三者进行简单压测后,可以得出以下结论:

1)高并发环境下,LUA,整体响应时间都要皆优于其它语言(1万次请求下,Lua整体响应4.9秒,PHP7.4最差为22秒);

2)经过多次压测,最后从数据库日志记录查看,PHP、NodeJS 都仅在90%左右的成功率;LUA的成功率一直维持在100%。

当然不是说由于Lua性能所以就选择openResty,最关键点还是在于通过Nginx+Lua的网关编程,可以在不大破坏到已有现成架构的基础上,对高并发、高负载能力处理的补充。

就拿笔者一直的项目架构都是ThinkPHP+MySql 来说吧。在之前笔者一直徘徊纠结在某些流行技术的选型上(业界常说NodeJS、golang云云的,都比PHP性能占要),限于团队不大、硬件资源有限,实验落地后造成最终结果:要么技术栈融合后效果不优、维护困难,要么就所有技术栈推倒重来。

使用openResty 的Lua作为网关的服务,这样的结合是无缝的,就拿LUA+PHP实现一个简单鉴权的逻辑例子来说吧:

server {
       listen 8089;
       server_name _;
       default_type 'text/plain';
       location / {
                index index.php admin admin.php
                rewrite_by_lua_block {
			            local ngx =require 'ngx';
						if (  not string.find(ngx.var.http_user_agent,'Mac OS')  ) then
							--执行ngx.exec 后,将不再执行nginx 后面的try_files
							return ngx.exec('/@auth_failed');
						end
			    }
                try_files $uri @rewrite;
       }
       location @rewrite {
                rewrite ^/index.php(.*)$ /index.php?s=$1 last;
                rewrite . /index.php?s=$uri last;
        }
	location @auth_failed {
		internal;
        	default_type 'text/plain';
		echo 'auth failed.';
    }
}

上述就是小编为大家分享的openResty中怎么实现Lua网关编程了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI