apisix源码分析-admin api 的注册和路由(4)

apisix源码分析-admin api 的注册和路由(4)

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
-- 将本地插件配置同步到 etcd
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(...)
... -- 对 put 写入 etcd 的数据校验
-- 使用 schema_def.lua 里对应的校验数据进行校验
-- 返回 etcd key
end

_M.put(...) -- etcd set
_M.get(...) -- etcd get
_M.post(...) -- etcd push
_M.delete(...) -- etcd delete
return _M

在前面的 resource[method] 通过 method= put | get | post | delete 就可以执行到对应的函数.

apisix源码分析-admin api 的注册和路由(4)

https://beixiu.net/apisix-source-4/

作者

张巍

发布于

2023-08-19

更新于

2023-08-19

许可协议

评论