apisix-admin如何支持http到etcd
动态模板
ngx_tpl.lua
content_by_lua_block {
apisix.http_admin()
}
apisix/init.lua
function _M.http_admin() if not router then router = admin_init.get() end -- add cors rsp header cors_admin() -- add content type to rsp header add_content_type() -- core.log.info("uri: ", get_var("uri"), " method: ", get_method()) local ok = router:dispatch(get_var("uri"), {method = get_method()}) if not ok then ngx_exit(404) end end
apisix/admin/init.lua 路由字典
local resources = { routes = require("apisix.admin.routes"), services = require("apisix.admin.services"), upstreams = require("apisix.admin.upstreams"), consumers = require("apisix.admin.consumers"), schema = require("apisix.admin.schema"), ssl = require("apisix.admin.ssl"), plugins = require("apisix.admin.plugins"), proto = require("apisix.admin.proto"), global_rules = require("apisix.admin.global_rules"), stream_routes = require("apisix.admin.stream_routes"), plugin_metadata = require("apisix.admin.plugin_metadata"), plugin_configs = require("apisix.admin.plugin_config"), }
根据路由表定位
local function run() local api_ctx = {} core.ctx.set_vars_meta(api_ctx) local ok, err = check_token(api_ctx) if not ok then core.log.warn("failed to check token: ", err) core.response.exit(401) end local uri_segs = core.utils.split_uri(ngx.var.uri) core.log.info("uri: ", core.json.delay_encode(uri_segs)) -- /apisix/admin/schema/route local seg_res, seg_id = uri_segs[4], uri_segs[5] local seg_sub_path = core.table.concat(uri_segs, "/", 6) if seg_res == "schema" and seg_id == "plugins" then -- /apisix/admin/schema/plugins/limit-count seg_res, seg_id = uri_segs[5], uri_segs[6] seg_sub_path = core.table.concat(uri_segs, "/", 7) end local resource = resources[seg_res] if not resource then core.response.exit(404) end local method = str_lower(get_method()) if not resource[method] then core.response.exit(404) end local req_body, err = core.request.get_body(MAX_REQ_BODY) if err then core.log.error("failed to read request body: ", err) core.response.exit(400, {error_msg = "invalid request body: " .. err}) end if req_body then local data, err = core.json.decode(req_body) if not data then core.log.error("invalid request body: ", req_body, " err: ", err) core.response.exit(400, {error_msg = "invalid request body: " .. err, req_body = req_body}) end req_body = data end local uri_args = ngx.req.get_uri_args() or {} if uri_args.ttl then if not tonumber(uri_args.ttl) then core.response.exit(400, {error_msg = "invalid argument ttl: " .. "should be a number"}) end end local code, data = resource[method](seg_id, req_body, seg_sub_path, uri_args) if code then data = strip_etcd_resp(data) core.response.exit(code, data) end end
对应到apisix/admin/routes.lua方法中处理,跟对应的etcd通信,做增删查改
function _M.put(id, conf, sub_path, args) local id, err = check_conf(id, conf, true) if not id then return 400, err end local key = "/routes/" .. id local ok, err = utils.inject_conf_with_prev_conf("route", key, conf) if not ok then return 500, {error_msg = err} end local res, err = core.etcd.set(key, conf, args.ttl) if not res then core.log.error("failed to put route[", key, "] to etcd: ", err) return 500, {error_msg = err} end return res.status, res.body end function _M.get(id) local key = "/routes" if id then key = key .. "/" .. id end local res, err = core.etcd.get(key, not id) if not res then core.log.error("failed to get route[", key, "] from etcd: ", err) return 500, {error_msg = err} end utils.fix_count(res.body, id) return res.status, res.body end