APISIX源码解析-执行阶段【init_worker】
ngx_lua 模块执行顺序与阶段
init_worker()
1、初始化woker.event
local ok, err = we.configure({shm = "worker-events", interval = 0.1})
2、初始化注册中心
local discovery = require("apisix.discovery.init").discovery
if discovery and discovery.init_worker then
discovery.init_worker()
end
注册中心支持:consul、dns、eureka、nacos
example:
#discovery: # service discovery center
# dns:
# resolver:
# - "127.0.0.1:8600" # use the real address of your dns server
# eureka:
# host: # it's possible to define multiple eureka hosts addresses of the same eureka cluster.
# - "http://127.0.0.1:8761"
# prefix: "/eureka/"
# fetch_interval: 30 # default 30s
# weight: 100 # default weight for node
# timeout:
# connect: 2000 # default 2000ms
# send: 2000 # default 2000ms
# read: 5000 # default 5000ms
3、初始化balancer
require("apisix.balancer").init_worker()
# 这边没有实现任何方法
function _M.init_worker()
end
4、初始化admin route
router = route.new(uri_route)
local uri_route = {
{
paths = [[/apisix/admin/*]],
methods = {"GET", "PUT", "POST", "DELETE", "PATCH"},
handler = run,
},
{
paths = [[/apisix/admin/stream_routes/*]],
methods = {"GET", "PUT", "POST", "DELETE", "PATCH"},
handler = run_stream,
},
{
paths = [[/apisix/admin/plugins/list]],
methods = {"GET"},
handler = get_plugins_list,
},
{
paths = reload_event,
methods = {"PUT"},
handler = post_reload_plugins,
},
}
## 同时会同步一次插件到etcd中
sync_local_conf_to_etcd(true)
5、初始化后台定时器timer
local timer, err = core.timer.new("background", background_timer, opts)
6、初始化plugin
将config-default.yaml 和 config.yaml 文件中配置的插件放到 local_plugins 和 local_plugins_hash中,同时local_plugins_hash按优先级排序
local ok, err = load(http_plugin_names)
local function load(plugin_names)
local processed = {}
for _, name in ipairs(plugin_names) do
if processed[name] == nil then
processed[name] = true
end
end
core.log.warn("new plugins: ", core.json.delay_encode(processed))
#### 先删除
for name in pairs(local_plugins_hash) do
unload_plugin(name)
end
core.table.clear(local_plugins)
core.table.clear(local_plugins_hash)
### 再加载
for name in pairs(processed) do
load_plugin(name, local_plugins)
end
-- sort by plugin's priority
if #local_plugins > 1 then
sort_tab(local_plugins, sort_plugin)
end
### 再优先级排序 加入 local_plugins_hash
for i, plugin in ipairs(local_plugins) do
local_plugins_hash[plugin.name] = plugin
if local_conf and local_conf.apisix
and local_conf.apisix.enable_debug then
core.log.warn("loaded plugin and sort by priority:",
" ", plugin.priority,
" name: ", plugin.name)
end
end
_M.load_times = _M.load_times + 1
core.log.info("load plugin times: ", _M.load_times)
return true
end
7、初始化router
7.1 默认使用radixtree_uri
7.2 如果路由器不提供其自定义实现,择附加通用方法
-- attach common methods if the router doesn't provide its custom implementation
local function attach_http_router_common_methods(http_router)
if http_router.routes == nil then
http_router.routes = function ()
if not http_router.user_routes then
return nil, nil
end
local user_routes = http_router.user_routes
return user_routes.values, user_routes.conf_version
end
end
if http_router.init_worker == nil then
http_router.init_worker = function (filter)
http_router.user_routes = http_route.init_worker(filter)
end
end
end
7.2 初始化router_http、router_ssl
同时etcd创建 /routes、/ssl、/global_rules
7.3 初始化services
7.4 初始化plugin_configs
etcd创建/plugin_configs,即
_M.plugin_config = {
type = "object",
properties = {
id = id_schema,
desc = desc_def,
plugins = plugins_schema,
labels = labels_def,
create_time = timestamp_def,
update_time = timestamp_def
},
required = {"id", "plugins"},
}