Skip to content

Commit

Permalink
优化
Browse files Browse the repository at this point in the history
  • Loading branch information
fengfei committed Mar 31, 2018
1 parent bf291ec commit 066ca17
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 79 deletions.
1 change: 1 addition & 0 deletions nginx.conf
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ http {
keepalive_timeout 65;
client_max_body_size 1024m;
lua_shared_dict cache 10m;
lua_shared_dict domain_cache 10m;
lua_shared_dict session 1m;

#换成你的实际路径,这里将源码中src目录加入到 lua_package_path
Expand Down
57 changes: 32 additions & 25 deletions src/access.lua
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
local _M = {}

function test_output(content, status)
ngx.header.content_type = 'application/json;charset=UTF-8';
ngx.say(content)
ngx.status = status
ngx.exit(status)
end
local cjson = require "cjson"
local domain_cache = ngx.shared.domain_cache
local cache = ngx.shared.cache

function split(str, delimiter)
if str == nil or str == '' or delimiter == nil then
Expand All @@ -19,28 +15,45 @@ function split(str, delimiter)
return result
end

-- 重写URL
function rewrite(request_uri, reg, original_uri)
i, j = string.find(request_uri, reg)
if i ~= nil then
local real_uri, index = string.gsub(request_uri, reg, original_uri, 1)
local real_uri, _ = string.gsub(request_uri, reg, original_uri, 1)
return real_uri
end
return nil
end

-- 负载均衡,选择服务器
function select_server(api_info)
local servers = api_info["servers"]
local server_count = table.getn(servers)

if server_count == 0 then
return nil
end

-- 简单轮询策略
local request_index_cache_key = ngx.var.host .. "_request_index_" .. api_info["request_uri"]
local request_index, _ = cache:incr(request_index_cache_key, 1)
if request_index == nil then
request_index = cache:incr(request_index_cache_key, 1, 0, 60) -- 设置一段时间过期
end

return servers[request_index % server_count + 1]; --Lua 的 table 索引默认从 1 开始
end

function _M.dispatch()
local cjson = require "cjson"
local cache = ngx.shared.cache
local config_str = cache:get(ngx.var.host);
local config_str = domain_cache:get(ngx.var.host);
if config_str == nil then
config_str = cache:get("localhost");
config_str = domain_cache:get("localhost");
if config_str == nil then
ngx.exit(404)
end
end

local config = cjson.decode(config_str)

local real_uri
local api_info
local api_uri_array = config["api_uri_array"]
Expand All @@ -50,7 +63,8 @@ function _M.dispatch()
uri = uri .. "?" .. ngx.var.args
end

for k, uri_regx in pairs(api_uri_array) do
-- 匹配请求映射获得配置(api_info)
for _, uri_regx in pairs(api_uri_array) do
local api_info_t = api_uri_map[uri_regx];
real_uri = rewrite(uri, api_info_t["request_uri"], api_info_t["original_uri"]);
if (real_uri ~= nil) then
Expand All @@ -63,21 +77,14 @@ function _M.dispatch()
ngx.exit(404)
end

local servers = api_info["servers"]
local server_count = table.getn(servers)
-- TODO:限流,IP黑名单...

if server_count == 0 then
-- 负载均衡,选择服务器开始
local server = select_server(api_info);
if server == nil then
ngx.exit(503)
end

local request_index_cache_key = ngx.var.host .. "_request_index_" .. api_info["request_uri"]
local request_index = cache:get(request_index_cache_key)
if request_index == nil then
request_index = 1
end
cache:set(request_index_cache_key, request_index + 1)
local server = servers[request_index % server_count + 1];

if api_info["host"] == "localhost" then
api_info["host"] = ngx.var.host
end
Expand Down
26 changes: 13 additions & 13 deletions src/balancer.lua
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
local _M = {}

function _M.balancing()
local balancer = require "ngx.balancer"
local host = ngx.var.backend_host
local port = ngx.var.backend_port
local ok, err = balancer.set_current_peer(host, port)
if not ok then
ngx.log(ngx.ERR, "failed to set the current peer: ", err)
return ngx.exit(500)
end
ok, err = balancer.set_more_tries(3)
if not ok then
ngx.log(ngx.ERR, "failed to set more tries: ", err)
return ngx.exit(500)
end
local balancer = require "ngx.balancer"
local host = ngx.var.backend_host
local port = ngx.var.backend_port
local ok, err = balancer.set_current_peer(host, port)
if not ok then
ngx.log(ngx.ERR, "failed to set the current peer: ", err)
return ngx.exit(500)
end
ok, err = balancer.set_more_tries(3)
if not ok then
ngx.log(ngx.ERR, "failed to set more tries: ", err)
return ngx.exit(500)
end
end

return _M
14 changes: 7 additions & 7 deletions src/model/api.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,44 @@ local api_model = {}
-- 由于系统都是内部使用,对SQL注入问题没有特殊处理
function api_model.getApis()
local db = mysql.getDb()
local apis, err, errno, sqlstate = db:query("select * from agw_api", 10)
local apis, err, _, _ = db:query("select * from agw_api", 10)
db:set_keepalive(10000, 10)
return apis, err
end

function api_model.add(service_id, request_uri, original_uri, description)
local db = mysql.getDb()
description = ndk.set_var.set_quote_sql_str(description)
local res, err, errno, sqlstate = db:query("INSERT INTO agw_api (service_id,request_uri,original_uri,description)values(\'"..service_id.."\',\'"..request_uri.."\',\'"..original_uri.."\',"..description..")", 10)
local res, err, _, _ = db:query("INSERT INTO agw_api (service_id,request_uri,original_uri,description)values(\'" .. service_id .. "\',\'" .. request_uri .. "\',\'" .. original_uri .. "\'," .. description .. ")", 10)
db:set_keepalive(10000, 10)
return res, err
end

function api_model.delete(aid)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("DELETE FROM agw_api WHERE id="..aid, 10)
local res, err, _, _ = db:query("DELETE FROM agw_api WHERE id=" .. aid, 10)
db:set_keepalive(10000, 10)
return res, err
end

function api_model.deleteByServiceId(sid)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("DELETE FROM agw_api WHERE service_id="..sid, 10)
local res, err, _, _ = db:query("DELETE FROM agw_api WHERE service_id=" .. sid, 10)
db:set_keepalive(10000, 10)
return res, err
end

function api_model.update(id, request_uri, original_uri, description)
local db = mysql.getDb()
description = ndk.set_var.set_quote_sql_str(description)
local res, err, errno, sqlstate = db:query("UPDATE agw_api SET request_uri=\'"..request_uri.."\',original_uri=\'"..original_uri.."\',description="..description.." WHERE id="..id, 10)
local res, err, _, _ = db:query("UPDATE agw_api SET request_uri=\'" .. request_uri .. "\',original_uri=\'" .. original_uri .. "\',description=" .. description .. " WHERE id=" .. id, 10)
db:set_keepalive(10000, 10)
return res, err
end

function api_model.getApi(id)
local db = mysql.getDb()
local apis, err, errno, sqlstate = db:query("SELECT * FROM agw_api WHERE id="..id, 10)
local apis, err, _, _ = db:query("SELECT * FROM agw_api WHERE id=" .. id, 10)
api = nil
if table.getn(apis) > 0 then
api = apis[1]
Expand All @@ -54,7 +54,7 @@ end

function api_model.getServiceApis(sid)
local db = mysql.getDb()
local services, err, errno, sqlstate = db:query("SELECT * FROM agw_api WHERE service_id="..sid, 10)
local services, err, _, _ = db:query("SELECT * FROM agw_api WHERE service_id=" .. sid, 10)
db:set_keepalive(10000, 10)
return services, err
end
Expand Down
10 changes: 5 additions & 5 deletions src/model/domain.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,35 @@ local domain_model = {}

function domain_model.addDomain(name)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("INSERT INTO agw_domain (name)values(\'"..name.."\')", 10)
local res, err, _, _ = db:query("INSERT INTO agw_domain (name)values(\'" .. name .. "\')", 10)
db:set_keepalive(10000, 100)
return res, err
end

function domain_model.delete(id)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("DELETE FROM agw_domain WHERE id="..id, 10)
local res, err, _, _ = db:query("DELETE FROM agw_domain WHERE id=" .. id, 10)
db:set_keepalive(10000, 100)
return res, err
end

function domain_model.update(id, name)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("UPDATE agw_domain SET name=\'"..name.."\' WHERE id="..id, 10)
local res, err, _, _ = db:query("UPDATE agw_domain SET name=\'" .. name .. "\' WHERE id=" .. id, 10)
db:set_keepalive(10000, 100)
return res, err
end

function domain_model.getDomain(id)
local db = mysql.getDb()
local service, err, errno, sqlstate = db:query("SELECT * FROM agw_domain WHERE id="..id, 10)
local service, err, _, _ = db:query("SELECT * FROM agw_domain WHERE id=" .. id, 10)
db:set_keepalive(10000, 100)
return service, err
end

function domain_model.getDomains()
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("SELECT * FROM agw_domain ORDER BY id ASC", 10)
local res, err, _, _ = db:query("SELECT * FROM agw_domain ORDER BY id ASC", 10)
db:set_keepalive(10000, 100)
return res, err
end
Expand Down
12 changes: 6 additions & 6 deletions src/model/module.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,36 @@ local service_model = {}
function service_model.add(domain_id, name, host, description)
description = ndk.set_var.set_quote_sql_str(description)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("INSERT INTO agw_service (domain_id, name,host,description)values(\'"..domain_id.."\',\'"..name.."\',\'"..host.."\',"..description..")", 10)
local res, err, _, _ = db:query("INSERT INTO agw_service (domain_id, name,host,description)values(\'" .. domain_id .. "\',\'" .. name .. "\',\'" .. host .. "\'," .. description .. ")", 10)
db:set_keepalive(10000, 100)
return res, err
end

function service_model.deleteByDomainId(did)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("DELETE FROM agw_service WHERE domain_id="..did, 10)
local res, err, _, _ = db:query("DELETE FROM agw_service WHERE domain_id=" .. did, 10)
db:set_keepalive(10000, 100)
return res, err
end

function service_model.delete(id)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("DELETE FROM agw_service WHERE id="..id, 10)
local res, err, _, _ = db:query("DELETE FROM agw_service WHERE id=" .. id, 10)
db:set_keepalive(10000, 100)
return res, err
end

function service_model.update(id, name, host, description)
description = ndk.set_var.set_quote_sql_str(description)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("UPDATE agw_service SET name=\'"..name.."\',host=\'"..host.."\',description="..description.." WHERE id="..id, 10)
local res, err, _, _ = db:query("UPDATE agw_service SET name=\'" .. name .. "\',host=\'" .. host .. "\',description=" .. description .. " WHERE id=" .. id, 10)
db:set_keepalive(10000, 100)
return res, err
end

function service_model.getService(id)
local db = mysql.getDb()
local services, err, errno, sqlstate = db:query("SELECT * FROM agw_service WHERE id="..id, 10)
local services, err, _, _ = db:query("SELECT * FROM agw_service WHERE id=" .. id, 10)
service = nil
if table.getn(services) > 0 then
service = services[1]
Expand All @@ -46,7 +46,7 @@ end

function service_model.getServices(domain_id)
local db = mysql.getDb()
local services, err, errno, sqlstate = db:query("SELECT * FROM agw_service WHERE domain_id="..domain_id, 10)
local services, err, _, _ = db:query("SELECT * FROM agw_service WHERE domain_id=" .. domain_id, 10)
db:set_keepalive(10000, 100)
return services, err
end
Expand Down
22 changes: 11 additions & 11 deletions src/model/server.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,36 @@ local server_model = {}
function server_model.add(service_id, ip, port, weight, description, protocol)
description = ndk.set_var.set_quote_sql_str(description)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("INSERT INTO agw_server(service_id,ip,port,weight,description,protocol)values(\'"..service_id.."\',\'"..ip.."\',\'"..port.."\',\'"..weight.."\',"..description..",\'"..protocol.."\')", 10)
local res, err, _, _ = db:query("INSERT INTO agw_server(service_id,ip,port,weight,description,protocol)values(\'" .. service_id .. "\',\'" .. ip .. "\',\'" .. port .. "\',\'" .. weight .. "\'," .. description .. ",\'" .. protocol .. "\')", 10)
db:set_keepalive(10000, 100)
return res, err
end

function server_model.delete(server_id)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("DELETE FROM agw_server WHERE id="..server_id, 10)
local res, err, _, _ = db:query("DELETE FROM agw_server WHERE id=" .. server_id, 10)
db:set_keepalive(10000, 100)
return res, err
end

function server_model.deleteByServiceId(sid)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("DELETE FROM agw_server WHERE service_id="..sid, 10)
local res, err, _, _ = db:query("DELETE FROM agw_server WHERE service_id=" .. sid, 10)
db:set_keepalive(10000, 100)
return res, err
end

function server_model.update(server_id, ip, port, weight, description, protocol)
description = ndk.set_var.set_quote_sql_str(description)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("UPDATE agw_server SET ip=\'"..ip.."\',port="..port..",protocol=\'"..protocol.."\',weight=\'"..weight.."\',description="..description.." WHERE id="..server_id, 10)
local res, err, _, _ = db:query("UPDATE agw_server SET ip=\'" .. ip .. "\',port=" .. port .. ",protocol=\'" .. protocol .. "\',weight=\'" .. weight .. "\',description=" .. description .. " WHERE id=" .. server_id, 10)
db:set_keepalive(10000, 100)
return res, err
end

function server_model.getServers(state)
local db = mysql.getDb()
local servers, err, errno, sqlstate = db:query("SELECT * FROM agw_server WHERE status="..state, 10)
local servers, _, _, _ = db:query("SELECT * FROM agw_server WHERE status=" .. state, 10)
db:set_keepalive(10000, 100)
if not servers then
return
Expand All @@ -43,20 +43,20 @@ end

function server_model.getServiceServers(service_id)
local db = mysql.getDb()
local servers, err, errno, sqlstate = db:query("SELECT * FROM agw_server WHERE service_id="..service_id, 10)
local servers, err, errno, sqlstate = db:query("SELECT * FROM agw_server WHERE service_id=" .. service_id, 10)
return servers, err
end

function server_model.getServiceServersWithState(service_id, state)
local db = mysql.getDb()
local servers, err, errno, sqlstate = db:query("SELECT * FROM agw_server WHERE service_id="..service_id.." AND status="..state, 10)
local servers, err, _, _ = db:query("SELECT * FROM agw_server WHERE service_id=" .. service_id .. " AND status=" .. state, 10)
db:set_keepalive(10000, 100)
return servers, err
end

function server_model.getServer(id)
local db = mysql.getDb()
local servers, err, errno, sqlstate = db:query("SELECT * FROM agw_server WHERE id="..id, 10)
local servers, err, _, _ = db:query("SELECT * FROM agw_server WHERE id=" .. id, 10)
db:set_keepalive(10000, 100)
server = nil
if table.getn(servers) > 0 then
Expand All @@ -69,7 +69,7 @@ end

function server_model.getServersByMid(mid)
local db = mysql.getDb()
local servers, err, errno, sqlstate = db:query("SELECT * FROM agw_server WHERE mid="..mid, 10)
local servers, _, _, _ = db:query("SELECT * FROM agw_server WHERE mid=" .. mid, 10)
db:set_keepalive(10000, 100)
if not servers then
return
Expand All @@ -79,7 +79,7 @@ end

function server_model.getAllServers()
local db = mysql.getDb()
local servers, err, errno, sqlstate = db:query("SELECT * FROM agw_server", 10)
local servers, _, _, _ = db:query("SELECT * FROM agw_server", 10)
db:set_keepalive(10000, 100)
if not servers then
return
Expand All @@ -89,7 +89,7 @@ end

function server_model.updateState(sid, state)
local db = mysql.getDb()
local res, err, errno, sqlstate = db:query("UPDATE agw_server SET status="..state.." WHERE id="..sid, 10)
local res, err, _, _ = db:query("UPDATE agw_server SET status=" .. state .. " WHERE id=" .. sid, 10)
db:set_keepalive(10000, 100)
if not res then
ngx.log(ngx.ERR, "update server state err:", err);
Expand Down
Loading

0 comments on commit 066ca17

Please sign in to comment.