zoukankan      html  css  js  c++  java
  • OpenResty完全开发指南:构建百万级别并发的Web应用 综合实例

     --功能描述

    -- 实现基本的时间服务,具体功能是
    --1:只支持GET和POST方法
    --2:只支持HTTP 1.1/2协议
    --3:只允许某些用户访问
    --4:GET方法获取当前时间,以HTTP时间格式输出
    --5:POST方法在请求体力传入时间戳,服务器转换为http时间格式
    --6:可以使用URI参数 “need_encode=1”输出会做base64编码

     --设计

    -- 依据openresty的阶段式处理逻辑,可以把整个应用划分为四个部分,每个部分都有一个独立的lua文件
    --1:rewrite_by_lua:正确性检查
    --2:accessby_lua:使用白名单做访问控制
    --3:content_by_lua:产生响应内容
    --4:body_filter_by_lua:加工数据,base64编码
    

     --正确性检查

    rewrite_demo1.lua文件
    --1:rewrite_by_lua:正确性检查
    local method=ngx.req.get_method() -- 获取请求方法
    if method ~= "GET" and method ~= "POST" then
        ngx.header['Allow'] = 'GET,POST' --方法错误返回Allow头字段
        ngx.exit(405)                    -- 返回状态码405 结束请求
    end
    
    local ver = ngx.req.http_version() --获取协议版本号
    if ver  < 1.1 then
        ngx.log(ngx.WARN,"VERSION IS LOWER THEN 1.1" .. ver)
        ngx.exit(400)
    end
    ngx.ctx.encode = ngx.var.arg_need_encode -- 取URI参数里need_ecncode字段
    ngx.header.content_length = nil          -- 删除长度头,谜面客户端接受错误

     --白名单控制

    access_demo1.lua
    local white_list={... } -- 若干白名单ip地址
    local ip = ngx.var.remote_addr --获取客户端地址
    
    if not white_list[ip] then
        ngx.log(ngx.WARN, ip,"access was refaused")
        ngx.exit(403)
    end

     -- 业务逻辑

    content_demo1.lua
    local action_get=function()
        ngx.req.discard_body() -- 显示丢弃请求体
    
        local tmpstamp = ngx.time() -- 获取当前时间戳
        ngx.say(ngx.http_time(tmpstamp)) --转换为http格式
    end
    
    local action_post = function()
        ngx.req.read_body() -- 要求非阻塞读取请求体
        local data = ngx.req.get_body_data() -- 获取请求体数据
        local num = tonumber(data) -- 转换数字
    
        if not num then
            ngx.log(ngx.ERR, num, "is ")
            ngx.exit(400)
        end
        ngx.say(ngx.http_time(num))
    end
    
    local actions={ --一个表映射方法与处理函数
        GET = action_get,
        post= action_post
    }
    
    local fun = ngx.req.get_method() -- 获取请求方法
    actions[fun]()

     --数据加工

    if ngx.status ~= ngx.HTTP_OK then--错误信息不会编码
        return
    end
    
    if ngx.ctx.encode then
        ngx.arg[1] = ngx.encode_base64(ngx.arg[1]) -- 改写响应体数据, 对数据做base64编码
    end

     -- 部署应用

    location = /demo1 {
        rewrite_by_lua_file             /usr/openResty/src/rewrite_demo1.lua;
        access_by_lua_file             /usr/openResty/src/access_demo1.lua;
        content_by_lua_file             /usr/openResty/src/content_demo1.lua;
        body_filter_by_lua_file             /usr/openResty/src/body_filter_demo1.lua;
    }

     --测试

    --测试
    --curl ' 127.0.0.1/example '                            #发送GET 请求
    --curl ' 127.0.0.1/example ' d ' 1516765407 '             #发送POST 请求
    --curl ' 127.0.0.1/example '-X DELETE                     #发送DE LETE 请求,返回405
    --curl ' 127.0.0.1/example?need_encode=l '                  #要求Base64 编码


    作者:first_semon
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题,欢迎交流
  • 相关阅读:
    Android 中常用代码片段
    查看oracle中的中文所占字节数
    order by 中 使用decode
    Oracle select 中case 的使用以及使用decode替换case
    pyqt5 'QWidget' object has no attribute 'setCentralWidget'(转)
    程序员之路:python3+PyQt5+pycharm桌面GUI开发(转)
    QT5入门之23 -QT串口编程(转)
    xpath-helper: 谷歌浏览器安装xpath helper 插件
    mysql给root开启远程访问权限
    Vmware无法获取快照信息 锁定文件失败
  • 原文地址:https://www.cnblogs.com/first-semon/p/12970669.html
Copyright © 2011-2022 走看看