refactor some lua code
This commit is contained in:
parent
ced6c5bd96
commit
cb4755835e
11 changed files with 83 additions and 47 deletions
|
@ -1,6 +1,7 @@
|
||||||
local balancer_resty = require("balancer.resty")
|
local balancer_resty = require("balancer.resty")
|
||||||
local resty_chash = require("resty.chash")
|
local resty_chash = require("resty.chash")
|
||||||
local util = require("util")
|
local util = require("util")
|
||||||
|
local split = require("util.split")
|
||||||
|
|
||||||
local _M = balancer_resty:new({ factory = resty_chash, name = "chash" })
|
local _M = balancer_resty:new({ factory = resty_chash, name = "chash" })
|
||||||
|
|
||||||
|
@ -15,7 +16,7 @@ end
|
||||||
function _M.balance(self)
|
function _M.balance(self)
|
||||||
local key = util.lua_ngx_var(self.hash_by)
|
local key = util.lua_ngx_var(self.hash_by)
|
||||||
local endpoint_string = self.instance:find(key)
|
local endpoint_string = self.instance:find(key)
|
||||||
return util.split_pair(endpoint_string, ":")
|
return split.split_pair(endpoint_string, ":")
|
||||||
end
|
end
|
||||||
|
|
||||||
return _M
|
return _M
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
local resty_lock = require("resty.lock")
|
local resty_lock = require("resty.lock")
|
||||||
local util = require("util")
|
local util = require("util")
|
||||||
|
local split = require("util.split")
|
||||||
|
|
||||||
local DECAY_TIME = 10 -- this value is in seconds
|
local DECAY_TIME = 10 -- this value is in seconds
|
||||||
local LOCK_KEY = ":ewma_key"
|
local LOCK_KEY = ":ewma_key"
|
||||||
|
@ -131,10 +132,10 @@ function _M.balance(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
function _M.after_balance(_)
|
function _M.after_balance(_)
|
||||||
local response_time = tonumber(util.get_first_value(ngx.var.upstream_response_time)) or 0
|
local response_time = tonumber(split.get_first_value(ngx.var.upstream_response_time)) or 0
|
||||||
local connect_time = tonumber(util.get_first_value(ngx.var.upstream_connect_time)) or 0
|
local connect_time = tonumber(split.get_first_value(ngx.var.upstream_connect_time)) or 0
|
||||||
local rtt = connect_time + response_time
|
local rtt = connect_time + response_time
|
||||||
local upstream = util.get_first_value(ngx.var.upstream_addr)
|
local upstream = split.get_first_value(ngx.var.upstream_addr)
|
||||||
|
|
||||||
if util.is_blank(upstream) then
|
if util.is_blank(upstream) then
|
||||||
return
|
return
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
local balancer_resty = require("balancer.resty")
|
local balancer_resty = require("balancer.resty")
|
||||||
local resty_roundrobin = require("resty.roundrobin")
|
local resty_roundrobin = require("resty.roundrobin")
|
||||||
local util = require("util")
|
local util = require("util")
|
||||||
|
local split = require("util.split")
|
||||||
|
|
||||||
local _M = balancer_resty:new({ factory = resty_roundrobin, name = "round_robin" })
|
local _M = balancer_resty:new({ factory = resty_roundrobin, name = "round_robin" })
|
||||||
|
|
||||||
|
@ -14,7 +15,7 @@ end
|
||||||
|
|
||||||
function _M.balance(self)
|
function _M.balance(self)
|
||||||
local endpoint_string = self.instance:find()
|
local endpoint_string = self.instance:find()
|
||||||
return util.split_pair(endpoint_string, ":")
|
return split.split_pair(endpoint_string, ":")
|
||||||
end
|
end
|
||||||
|
|
||||||
return _M
|
return _M
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
local balancer_resty = require("balancer.resty")
|
local balancer_resty = require("balancer.resty")
|
||||||
local resty_chash = require("resty.chash")
|
local resty_chash = require("resty.chash")
|
||||||
local util = require("util")
|
local util = require("util")
|
||||||
|
local split = require("util.split")
|
||||||
local ck = require("resty.cookie")
|
local ck = require("resty.cookie")
|
||||||
|
|
||||||
local _M = balancer_resty:new({ factory = resty_chash, name = "sticky" })
|
local _M = balancer_resty:new({ factory = resty_chash, name = "sticky" })
|
||||||
|
@ -74,7 +75,7 @@ end
|
||||||
|
|
||||||
function _M.balance(self)
|
function _M.balance(self)
|
||||||
local endpoint_string = sticky_endpoint_string(self)
|
local endpoint_string = sticky_endpoint_string(self)
|
||||||
return util.split_pair(endpoint_string, ":")
|
return split.split_pair(endpoint_string, ":")
|
||||||
end
|
end
|
||||||
|
|
||||||
return _M
|
return _M
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
local socket = ngx.socket.tcp
|
local socket = ngx.socket.tcp
|
||||||
local cjson = require('cjson')
|
local cjson = require('cjson')
|
||||||
local defer = require('defer')
|
local defer = require('util.defer')
|
||||||
local assert = assert
|
local assert = assert
|
||||||
|
|
||||||
local _M = {}
|
local _M = {}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package.path = "./rootfs/etc/nginx/lua/?.lua;./rootfs/etc/nginx/lua/test/mocks/?.lua;" .. package.path
|
package.path = "./rootfs/etc/nginx/lua/?.lua;./rootfs/etc/nginx/lua/test/mocks/?.lua;" .. package.path
|
||||||
_G._TEST = true
|
_G._TEST = true
|
||||||
local defer = require('defer')
|
local defer = require('util.defer')
|
||||||
|
|
||||||
local _ngx = {
|
local _ngx = {
|
||||||
shared = {},
|
shared = {},
|
|
@ -49,17 +49,6 @@ function _M.lua_ngx_var(ngx_var)
|
||||||
return ngx.var[var_name]
|
return ngx.var[var_name]
|
||||||
end
|
end
|
||||||
|
|
||||||
function _M.split_pair(pair, seperator)
|
|
||||||
local i = pair:find(seperator)
|
|
||||||
if i == nil then
|
|
||||||
return pair, nil
|
|
||||||
else
|
|
||||||
local name = pair:sub(1, i - 1)
|
|
||||||
local value = pair:sub(i + 1, -1)
|
|
||||||
return name, value
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- this implementation is taken from
|
-- this implementation is taken from
|
||||||
-- https://web.archive.org/web/20131225070434/http://snippets.luacode.org/snippets/Deep_Comparison_of_Two_Values_3
|
-- https://web.archive.org/web/20131225070434/http://snippets.luacode.org/snippets/Deep_Comparison_of_Two_Values_3
|
||||||
-- and modified for use in this project
|
-- and modified for use in this project
|
||||||
|
@ -88,30 +77,6 @@ function _M.is_blank(str)
|
||||||
return str == nil or string_len(str) == 0
|
return str == nil or string_len(str) == 0
|
||||||
end
|
end
|
||||||
|
|
||||||
-- http://nginx.org/en/docs/http/ngx_http_upstream_module.html#example
|
|
||||||
-- CAVEAT: nginx is giving out : instead of , so the docs are wrong
|
|
||||||
-- 127.0.0.1:26157 : 127.0.0.1:26157 , ngx.var.upstream_addr
|
|
||||||
-- 200 : 200 , ngx.var.upstream_status
|
|
||||||
-- 0.00 : 0.00, ngx.var.upstream_response_time
|
|
||||||
function _M.split_upstream_var(var)
|
|
||||||
if not var then
|
|
||||||
return nil, nil
|
|
||||||
end
|
|
||||||
local t = {}
|
|
||||||
for v in var:gmatch("[^%s|,]+") do
|
|
||||||
if v ~= ":" then
|
|
||||||
t[#t+1] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return t
|
|
||||||
end
|
|
||||||
|
|
||||||
function _M.get_first_value(var)
|
|
||||||
local t = _M.split_upstream_var(var) or {}
|
|
||||||
if #t == 0 then return nil end
|
|
||||||
return t[1]
|
|
||||||
end
|
|
||||||
|
|
||||||
-- this implementation is taken from:
|
-- this implementation is taken from:
|
||||||
-- https://github.com/luafun/luafun/blob/master/fun.lua#L33
|
-- https://github.com/luafun/luafun/blob/master/fun.lua#L33
|
||||||
-- SHA: 04c99f9c393e54a604adde4b25b794f48104e0d0
|
-- SHA: 04c99f9c393e54a604adde4b25b794f48104e0d0
|
||||||
|
|
70
rootfs/etc/nginx/lua/util/split.lua
Normal file
70
rootfs/etc/nginx/lua/util/split.lua
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
local _M = {}
|
||||||
|
|
||||||
|
-- splits strings into host and port
|
||||||
|
local function parse_addr(addr)
|
||||||
|
local _, _, host, port = addr:find("([^:]+):([^:]+)")
|
||||||
|
if host and port then
|
||||||
|
return {host=host, port=port}
|
||||||
|
else
|
||||||
|
return nil, "error in parsing upstream address!"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function _M.get_first_value(var)
|
||||||
|
local t = _M.split_upstream_var(var) or {}
|
||||||
|
if #t == 0 then return nil end
|
||||||
|
return t[1]
|
||||||
|
end
|
||||||
|
|
||||||
|
function _M.split_pair(pair, seperator)
|
||||||
|
local i = pair:find(seperator)
|
||||||
|
if i == nil then
|
||||||
|
return pair, nil
|
||||||
|
else
|
||||||
|
local name = pair:sub(1, i - 1)
|
||||||
|
local value = pair:sub(i + 1, -1)
|
||||||
|
return name, value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- http://nginx.org/en/docs/http/ngx_http_upstream_module.html#example
|
||||||
|
-- CAVEAT: nginx is giving out : instead of , so the docs are wrong
|
||||||
|
-- 127.0.0.1:26157 : 127.0.0.1:26157 , ngx.var.upstream_addr
|
||||||
|
-- 200 : 200 , ngx.var.upstream_status
|
||||||
|
-- 0.00 : 0.00, ngx.var.upstream_response_time
|
||||||
|
function _M.split_upstream_var(var)
|
||||||
|
if not var then
|
||||||
|
return nil, nil
|
||||||
|
end
|
||||||
|
local t = {}
|
||||||
|
for v in var:gmatch("[^%s|,]+") do
|
||||||
|
if v ~= ":" then
|
||||||
|
t[#t+1] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Splits an NGINX $upstream_addr and returns an array of tables with a `host` and `port` key-value pair.
|
||||||
|
function _M.split_upstream_addr(addrs_str)
|
||||||
|
if not addrs_str then
|
||||||
|
return nil, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local addrs = _M.split_upstream_var(addrs_str)
|
||||||
|
local host_and_ports = {}
|
||||||
|
|
||||||
|
for _, v in ipairs(addrs) do
|
||||||
|
local a, err = parse_addr(v)
|
||||||
|
if err then
|
||||||
|
return nil, err
|
||||||
|
end
|
||||||
|
host_and_ports[#host_and_ports+1] = a
|
||||||
|
end
|
||||||
|
if #host_and_ports == 0 then
|
||||||
|
return nil, "no upstream addresses to parse!"
|
||||||
|
end
|
||||||
|
return host_and_ports
|
||||||
|
end
|
||||||
|
|
||||||
|
return _M
|
|
@ -900,10 +900,7 @@ stream {
|
||||||
balancer.log()
|
balancer.log()
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
ok, res = pcall(monitor.call)
|
monitor.call()
|
||||||
if not ok then
|
|
||||||
ngx.log(ngx.ERR, "request_id failed: " .. tostring(res))
|
|
||||||
end
|
|
||||||
}
|
}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue