您好,登录后才能下订单哦!
这期内容当中小编将会给大家带来有关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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。