You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by sp...@apache.org on 2020/10/10 15:43:07 UTC
[apisix] branch master updated: change: refactor router (#2367)
This is an automated email from the ASF dual-hosted git repository.
spacewander pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git
The following commit(s) were added to refs/heads/master by this push:
new ac38c29 change: refactor router (#2367)
ac38c29 is described below
commit ac38c299b4162c6a68a12925d2f3707effc006be
Author: 罗泽轩 <sp...@gmail.com>
AuthorDate: Sat Oct 10 23:43:00 2020 +0800
change: refactor router (#2367)
1. rename http/router/radixtree_sni -> ssl/router/radixtree_sni
2. extract API router out from the host/uri router so that we can hide the
implementation details and reduce duplicate code.
---
apisix/api_router.lua | 76 +++++++++++++++++++++++++++
apisix/http/router/radixtree_host_uri.lua | 21 +-------
apisix/http/router/radixtree_uri.lua | 19 +------
apisix/init.lua | 12 +++--
apisix/plugin.lua | 39 --------------
apisix/router.lua | 4 +-
apisix/{http => ssl}/router/radixtree_sni.lua | 0
7 files changed, 89 insertions(+), 82 deletions(-)
diff --git a/apisix/api_router.lua b/apisix/api_router.lua
new file mode 100644
index 0000000..b18e823
--- /dev/null
+++ b/apisix/api_router.lua
@@ -0,0 +1,76 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one or more
+-- contributor license agreements. See the NOTICE file distributed with
+-- this work for additional information regarding copyright ownership.
+-- The ASF licenses this file to You under the Apache License, Version 2.0
+-- (the "License"); you may not use this file except in compliance with
+-- the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+local require = require
+local router = require("resty.radixtree")
+local plugin = require("apisix.plugin")
+local core = require("apisix.core")
+local ipairs = ipairs
+
+
+local _M = {}
+local match_opts = {}
+
+
+local fetch_api_router
+do
+ local routes = {}
+function fetch_api_router()
+ core.table.clear(routes)
+
+ for _, plugin in ipairs(plugin.plugins) do
+ local api_fun = plugin.api
+ if api_fun then
+ local api_routes = api_fun()
+ core.log.debug("fetched api routes: ",
+ core.json.delay_encode(api_routes, true))
+ for _, route in ipairs(api_routes) do
+ core.table.insert(routes, {
+ methods = route.methods,
+ paths = route.uri,
+ handler = function (...)
+ local code, body = route.handler(...)
+ if code or body then
+ core.response.exit(code, body)
+ end
+ end
+ })
+ end
+ end
+ end
+
+ return router.new(routes)
+end
+
+end -- do
+
+
+function _M.match(api_ctx)
+ local api_router = core.lrucache.global("api_router", plugin.load_times, fetch_api_router)
+ if not api_router then
+ core.log.error("failed to fetch valid api router")
+ return false
+ end
+
+ core.table.clear(match_opts)
+ match_opts.method = api_ctx.var.request_method
+
+ local ok = api_router:dispatch(api_ctx.var.uri, match_opts, api_ctx)
+ return ok
+end
+
+
+return _M
diff --git a/apisix/http/router/radixtree_host_uri.lua b/apisix/http/router/radixtree_host_uri.lua
index 8b2841c..ab3ad15 100644
--- a/apisix/http/router/radixtree_host_uri.lua
+++ b/apisix/http/router/radixtree_host_uri.lua
@@ -17,7 +17,6 @@
local require = require
local router = require("resty.radixtree")
local core = require("apisix.core")
-local plugin = require("apisix.plugin")
local ipairs = ipairs
local type = type
local error = error
@@ -113,19 +112,6 @@ local function create_radixtree_router(routes)
end
-- create router: only_uri_router
- local api_routes = plugin.api_routes()
- core.log.info("api_routes", core.json.delay_encode(api_routes, true))
-
- for _, route in ipairs(api_routes) do
- if type(route) == "table" then
- core.table.insert(only_uri_routes, {
- paths = route.uris or route.uri,
- handler = route.handler,
- method = route.methods,
- })
- end
- end
-
only_uri_router = router.new(only_uri_routes)
return true
end
@@ -153,12 +139,7 @@ function _M.match(api_ctx)
end
local ok = only_uri_router:dispatch(api_ctx.var.uri, match_opts, api_ctx)
- if ok then
- return true
- end
-
- core.log.info("not find any matched route")
- return true
+ return ok
end
diff --git a/apisix/http/router/radixtree_uri.lua b/apisix/http/router/radixtree_uri.lua
index dfcd654..fe6dfbd 100644
--- a/apisix/http/router/radixtree_uri.lua
+++ b/apisix/http/router/radixtree_uri.lua
@@ -17,7 +17,6 @@
local require = require
local router = require("resty.radixtree")
local core = require("apisix.core")
-local plugin = require("apisix.plugin")
local ipairs = ipairs
local type = type
local error = error
@@ -34,19 +33,8 @@ local _M = {version = 0.2}
local function create_radixtree_router(routes)
routes = routes or {}
- local api_routes = plugin.api_routes()
core.table.clear(uri_routes)
- for _, route in ipairs(api_routes) do
- if type(route) == "table" then
- core.table.insert(uri_routes, {
- paths = route.uris or route.uri,
- methods = route.methods,
- handler = route.handler,
- })
- end
- end
-
for _, route in ipairs(routes) do
if type(route) == "table" then
local filter_fun, err
@@ -108,12 +96,7 @@ function _M.match(api_ctx)
match_opts.vars = api_ctx.var
local ok = uri_router:dispatch(api_ctx.var.uri, match_opts, api_ctx)
- if not ok then
- core.log.info("not find any matched route")
- return true
- end
-
- return true
+ return ok
end
diff --git a/apisix/init.lua b/apisix/init.lua
index 5d773ab..3beec45 100644
--- a/apisix/init.lua
+++ b/apisix/init.lua
@@ -366,17 +366,21 @@ function _M.http_access_phase()
end
end
- router.router_http.match(api_ctx)
-
- core.log.info("matched route: ",
- core.json.delay_encode(api_ctx.matched_route, true))
+ local user_defined_route_matched = router.router_http.match(api_ctx)
+ if not user_defined_route_matched then
+ router.api.match(api_ctx)
+ end
local route = api_ctx.matched_route
if not route then
+ core.log.info("not find any matched route")
return core.response.exit(404,
{error_msg = "404 Route Not Found"})
end
+ core.log.info("matched route: ",
+ core.json.delay_encode(api_ctx.matched_route, true))
+
if route.value.service_protocol == "grpc" then
return ngx.exec("@grpc_pass")
end
diff --git a/apisix/plugin.lua b/apisix/plugin.lua
index 8c49883..f992dc3 100644
--- a/apisix/plugin.lua
+++ b/apisix/plugin.lua
@@ -197,45 +197,6 @@ function _M.load()
end
-local fetch_api_routes
-do
- local routes = {}
-function fetch_api_routes()
- core.table.clear(routes)
-
- for _, plugin in ipairs(_M.plugins) do
- local api_fun = plugin.api
- if api_fun then
- local api_routes = api_fun()
- core.log.debug("fetched api routes: ",
- core.json.delay_encode(api_routes, true))
- for _, route in ipairs(api_routes) do
- core.table.insert(routes, {
- methods = route.methods,
- uri = route.uri,
- handler = function (...)
- local code, body = route.handler(...)
- if code or body then
- core.response.exit(code, body)
- end
- end
- })
- end
- end
- end
-
- return routes
-end
-
-end -- do
-
-
-function _M.api_routes()
- return core.lrucache.global("plugin_routes", _M.load_times,
- fetch_api_routes)
-end
-
-
function _M.filter(user_route, plugins)
local user_plugin_conf = user_route.value.plugins
if user_plugin_conf == nil or
diff --git a/apisix/router.lua b/apisix/router.lua
index b94be0c..87c4662 100644
--- a/apisix/router.lua
+++ b/apisix/router.lua
@@ -80,10 +80,12 @@ function _M.http_init_worker()
router_http.init_worker(filter)
_M.router_http = router_http
- local router_ssl = require("apisix.http.router." .. router_ssl_name)
+ local router_ssl = require("apisix.ssl.router." .. router_ssl_name)
router_ssl.init_worker()
_M.router_ssl = router_ssl
+ _M.api = require("apisix.api_router")
+
local global_rules, err = core.config.new("/global_rules", {
automatic = true,
item_schema = core.schema.global_rule
diff --git a/apisix/http/router/radixtree_sni.lua b/apisix/ssl/router/radixtree_sni.lua
similarity index 100%
rename from apisix/http/router/radixtree_sni.lua
rename to apisix/ssl/router/radixtree_sni.lua