个性

  • 应用连接池

我的项目源码

https://github.com/helloJiu/o...

代码

-- http客户端-- https://github.com/ledgetech/lua-resty-httplocal http = require("resty/http")local config = {    max_idle_time = 30000,    pool_size = 1000,    timeout = 5000,    backlog = 1000}local _M = {}function _M.new()    local instance = {        timeout = config.timeout or 5000,        max_idle_time = config.max_idle_time or 60000,        pool_size = config.pool_size or 1000,        backlog = config.backlog or 1000,    }    setmetatable(instance, { __index = _M })    return instanceendfunction _M:exec(options, func)    local httpc = http:new()    -- Sets the socket timeout (in ms) for subsequent operations.     httpc:set_timeout(self.timeout)    -- https://github.com/openresty/lua-nginx-module#tcpsockconnect    -- pool_size 指定连接池的大小。    -- 如果省略且未 backlog提供任何选项,则不会创立任何池。如果省略但backlog已提供,    -- 则将应用等于lua_socket_pool_size 指令的值的默认大小创立池。    -- 连接池可包容可供pool_size后续调用connect重用的流动连贯,    -- 但请留神,池外关上的连贯总数没有下限。如果您须要限度关上的连贯总数,    -- 请指定backlog选项。当连接池超过其大小限度时,    -- 池中最近起码应用(放弃流动)的连贯将被敞开,认为以后连贯腾出空间。请留神,    -- cosocket 连接池是每个 Nginx 工作过程而不是每个 Nginx 服务器实例,    -- 因而此处指定的大小限度也实用于每个 Nginx 工作过程。    -- 另请留神,连接池的大小一旦创立就无奈更改。此选项首次在v0.10.14发行版中引入。    options.pool_size = self.pool_size    -- backlog 如果指定,此模块将限度此池的关上连贯总数。    -- pool_size任何时候都不能为此池关上更多的连贯。    -- 如果连接池已满,后续连贯操作将排入与此选项值相等的队列(积压队列)。    -- 如果排队的连贯操作数等于backlog,后续连贯操作将失败并返回nil谬误字符串"too many waiting connect operations"。    -- 一旦池中的连接数小于 ,排队的连贯操作将复原pool_size。    -- 排队的连贯操作将在排队超过 时停止connect_timeout,由 settimeouts管制,并返回nil谬误字符串。    -- "timeout". 此选项首次在v0.10.14发行版中引入。    options.backlog = self.backlog    options.ssl_verify = false    local ok, err = httpc:connect(options)    if not ok then        ngx.log(ngx.ERR, "http connect, err:", err)        return nil, err    end    -- 执行业务逻辑    local res, err = func(httpc)    if not res then         ngx.log(ngx.ERR, "http request, err:", err)        return nil, err    end    -- 读取响应体    local res_body = ""    if res.status == 200 and res.has_body then        local reader = res.body_reader        local buffer_size = 4096        repeat            local buffer, err = reader(buffer_size)            if err then                 ngx.log(ngx.ERR, "reader err", err)                break            end            if buffer then                res_body = res_body .. buffer            end        until not buffer    end    -- 将连贯放回连接池    local ok = httpc:set_keepalive(self.max_idle_time, self.pool_size)    if not ok then        httpc:close()    end    -- 返回响应体  响应  以及err    return res_body, res, errendreturn _M

理论应用

local http = require("http")local path = string.format("/cgi-bin/qrcode/create?access_token=%s", "accessToken")local httpi = http.new()local options = {    scheme = "https",    host = "api.weixin.qq.com",    port = "443",}local scene_str = "abc"local body = {    expire_seconds = 3600*24,    action_name = "QR_SCENE",    action_info = {        scene = {            scene_str = scene_str        }    }}local resBody, res, err = httpi:exec(options, function(httpc)    return httpc:request({        method = "POST",        path = path,        body = json.encode(body),        headers = {["Content-Type"] = "application/json",},    })end)if not res then    ngx.log(ngx.ERR, "=============>send message request failed: ", err)    return nilendlog.notice(resBody)