这期内容当中小编将会给大家带来有关openResty中怎么实现Lua网关编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
使用openResty后,项目架构能够从网关层做出转型:
选择使用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的压测结果如下:
PHP的压测结果如下:
NodeJS的压测结果如下:
对三者进行简单压测后,可以得出以下结论:
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网关编程了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。