admin api
admin 注册
1 2 3 4 5 6 7 8 9 10 11 12
| location /apisix/admin { set $upstream_scheme 'http'; set $upstream_host $http_host; set $upstream_uri '';
allow 0.0.0.0/0; deny all;
content_by_lua_block { apisix.http_admin() } }
|
在 admin/init.lua 中,通过 init_worker
初始化 admin route ,并将本地插件配置同步到etcd中,并注册了插件重启事件,当触发"/apisix/admin/plugins/reload"
触发同步本地插件列表到 etcd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| router = route.new(uri_route) events = require("resty.worker.events")
events.register(reload_plugins, reload_event, "PUT") if ngx_worker_id() == 0 then local ok, err = ngx_timer_at(0, function(premature) if premature then return end sync_local_conf_to_etcd(true) end)
if not ok then error("failed to sync local configure to etcd: " .. err) end end
|
admin 路由
router = route.new(uri_route) 是一个 redixtree 对象。用来做 admin api 的路由匹配 ,可以通过uri_route 参数看到对不同接口的实现。
run 作为 admin api 的主要实现,通过 uri 和m来执行 resource 中的调用。
有如下两种类型的 api ,分别对应到系统组件,比如 routes ,servers,ssl 等。
/apisix/admin/schema//
这里的 seg_res 是对应的组件名,seg_id 是组件中对应配置的id
和插件路径
/apisix/admin/schema/plugins//
这里的seg_res 对应的是插件名,seg_id 对应的是插件配置的id
通过 seg_res 获取对应的执行对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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 resource = resources[seg_res]
|
通过 method 来执行resource 对应的请求函数
1 2
| local code, data = resource[method](seg_id, req_body, seg_sub_path, uri_args)
|
从 resources
的定义可以看出,admin 的路由 用来实现 api 的操作, 涉及到 routes
services
upstreams
consumers
schema
ssl
plugins
proto
global_rules
stream_routes
plugin_metadata
plugin_configs
。
api 的作用就是用来对 etcd 进行 crud 的操作。 对每个组件的 api ,实现大概如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| local _M = { version = 0.1, }
local function check_conf(...) ... end
_M.put(...) _M.get(...) _M.post(...) _M.delete(...) return _M
|
在前面的 resource[method]
通过 method= put | get | post | delete
就可以执行到对应的函数.