基于OpenResty 使用lua 实现在后端服务挂掉时 返回托底数据

最初是在开发者头条看到一篇文章:京东老司机:巧用Nginx+Lua解决数据托底大痛点

uri:http://dbaplus.cn/news-21-678-1.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

受到了很大启发,但是作者并没有开源其实现。所以我就决定学习下OpenResty+lua 自己实现试试看

主要的实现流程是:

在nginx.conf 配置2个location

将原本访问后端服务的location改成调用lua脚本完成任务,在lua脚本里面访问/backend/red-packet

配置里面有一些openresty的参数

worker_processes 1;
error_log logs/error.log;
events {
        worker_connections 1024;
}

http{
        lua_package_path '$prefix/lua/?.lua;/blah/?.lua;;'; #lua脚本位置
        lua_shared_dict bottom 20m;  #设置一个lua dict 用于在nginx所有worker共享
        lua_code_cache off;  #测试环境关闭lua脚本缓存

        server {
                listen 80;
         
         #对外的location,请求实际上通过request_proxy.lua处理
         location ^~ /red-packet/ { 
                 if ($request_method = 'OPTIONS') {
                         add_header Access-Control-Allow-Origin *;
                        add_header Access-Control-Allow-Headers Authorization,token,Accept,Content-Type,app_key,secret_key,timestamp,sessionId,version,X-Requested-With;
                        add_header 'Access-Control-Max-Age' 3600;
                        return 200;
                 }
                 content_by_lua_file lua/redpacket/request_proxy.lua;
                 header_filter_by_lua_block {
                      ngx.header["Content-Type"] = 'application/json'
                 }

          }

 
        location ^~ /backend/red-packet/ {    #这里是访问后端服务的location
                internal;  #只允许内部访问
                proxy_connect_timeout 3;  #超时时间设置为3秒
                proxy_pass http://192.168.198.164:6678/red-packet/;
          }
        }
}

配置完ng就是撸代码了,代码结构图

基于OpenResty 使用lua 实现在后端服务挂掉时 返回托底数据_第1张图片
image.png

request_proxy.lua 作为核心脚本主要做如下的事情:

基于OpenResty 使用lua 实现在后端服务挂掉时 返回托底数据_第2张图片
image.png

其实很简单。。
github:https://github.com/augustusChou/openresty-proxy-request

你可能感兴趣的:(基于OpenResty 使用lua 实现在后端服务挂掉时 返回托底数据)