feature: supported to use lrucache for plugin developer.

This commit is contained in:
Yuansheng Wang 2019-05-21 10:01:40 +08:00 committed by YuanSheng Wang
parent 20e240bb96
commit 4570ba59c0
6 changed files with 75 additions and 52 deletions

View File

@ -51,6 +51,6 @@ return {
},
resp = require("apisix.core.resp"),
typeof = require("apisix.core.typeof"),
global_lru = require("apisix.core.global_lrucache"),
lrucache = require("apisix.core.lrucache"),
ctx = require("apisix.core.ctx"),
}

View File

@ -1,6 +1,5 @@
-- Copyright (C) Yuansheng Wang
local ngx_req = ngx.req
local ngx_var = ngx.var
local new_tab = require("table.new")
@ -8,6 +7,12 @@ local new_tab = require("table.new")
local _M = {version = 0.1}
local var_methods = {
-- todo: support more type
method = ngx.req.get_method
}
function _M.get(api_ctx, name)
local vars = api_ctx.vars
if not vars then
@ -20,8 +25,10 @@ function _M.get(api_ctx, name)
return val
end
if name == "method" then
val = ngx_req.get_method()
-- todo: added more data type
local method = var_methods[name]
if method then
val = method()
else
val = ngx_var[name]
end

View File

@ -1,33 +0,0 @@
-- Copyright (C) Yuansheng Wang
local lru_new = require("resty.lrucache").new
local lru_items = lru_new(200) -- todo: support to config in yaml.
local _M = {version = 0.1}
function _M.fetch(name, count, version)
local cache = lru_items:get(name)
if cache and cache.version == version then
return cache
end
cache = lru_new(count)
cache.version = version
lru_items:set(name, cache)
return cache
end
function _M.set(self, name, lru)
return lru_items:set(name, lru)
end
function _M.delete(name)
return lru_items:delete(name)
end
return _M

View File

@ -0,0 +1,44 @@
local lru_new = require("resty.lrucache").new
local global_lrus = lru_new(256) -- todo: support to config in yaml.
local _M = {version = 0.1}
local function _global_lrus(name, count)
local lru = global_lrus:get(name)
if lru then
return lru
end
lru = lru_new(count)
global_lrus:set(name, lru)
return lru
end
_M.global = _global_lrus
local function _plugin_key(plugin_name, key, version, callback_fun, ...)
local lru_plugin_conf = _global_lrus("/plugin/" .. plugin_name, 32)
-- todo: support `stale` object
local obj = lru_plugin_conf:get(key)
if not obj or obj.version ~= version then
obj = callback_fun(...)
obj.version = version
lru_plugin_conf:set(key, obj)
end
return obj
end
_M.plugin = _plugin_key
function _M.plugin_ctx(plugin_name, api_ctx, callback_fun, ...)
local key = api_ctx.conf_type .. "#" .. api_ctx.conf_id
return _plugin_key(plugin_name, key, api_ctx.conf_version,
callback_fun, ...)
end
return _M

View File

@ -32,14 +32,14 @@ end
function _M.rewrite(conf, api_ctx)
core.log.warn("plugin rewrite phase, conf: ", core.json.encode(conf),
" ctx: ", core.json.encode(api_ctx, true))
core.log.warn("plugin rewrite phase, conf: ", core.json.encode(conf))
-- core.log.warn(" ctx: ", core.json.encode(api_ctx, true))
end
function _M.access(conf, api_ctx)
core.log.warn("plugin access phase, conf: ", core.json.encode(conf),
" ctx: ", core.json.encode(api_ctx, true))
core.log.warn("plugin access phase, conf: ", core.json.encode(conf))
-- core.log.warn(" ctx: ", core.json.encode(api_ctx, true))
-- ngx.say("hit example plugin")
end

View File

@ -1,13 +1,12 @@
local limit_req = require("resty.limit.req")
local core = require("apisix.core")
-- todo: support to config it in yaml
local cache = core.global_lru.fetch("/plugin/limit-req", 200)
local plugin_name = "limit-req"
local _M = {
version = 0.1,
priority = 1001, -- TODO: add a type field, may be a good idea
name = "limit-req",
name = plugin_name,
}
@ -15,19 +14,25 @@ function _M.check_args(conf)
return true
end
local function create_limit_obj(conf)
core.log.info("create new plugin ins")
return limit_req.new("plugin-limit-req",
conf.rate, conf.burst)
end
function _M.access(conf, api_ctx)
local key = api_ctx.conf_type .. "#" .. api_ctx.conf_id
-- core.log.warn("key: ", key, " conf: ", core.json.encode(conf))
-- todo: support to config it in yaml
local limit_ins = core.lrucache.plugin_ctx(plugin_name, api_ctx,
create_limit_obj, conf)
local limit_ins = cache:get(key)
if not limit_ins or limit_ins.version ~= api_ctx.conf_version then
limit_ins = limit_req.new("plugin-limit-req", conf.rate, conf.burst)
cache:set(key, limit_ins)
local key = core.ctx.get(api_ctx, conf.key)
if not key or key == "" then
key = ""
core.log.warn("fetched empty string value to limit the request maybe ",
"wrong, please pay attention to this.")
end
key = core.ctx.get(api_ctx, conf.key)
local delay, err = limit_ins:incoming(key, true)
if not delay then
if err == "rejected" then