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 2022/10/20 01:47:19 UTC

[apisix] branch master updated: refactor: adjusting the position of ai module (#8120)

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 23356d6c4 refactor: adjusting the position of ai module (#8120)
23356d6c4 is described below

commit 23356d6c4a58379f5cf33be92e0d88cc6399a853
Author: tzssangglass <tz...@gmail.com>
AuthorDate: Thu Oct 20 09:47:09 2022 +0800

    refactor: adjusting the position of ai module (#8120)
---
 apisix/core.lua                 |  1 +
 apisix/core/event.lua           | 41 +++++++++++++++++++++++++++++++++++++++++
 apisix/http/route.lua           |  4 ++--
 apisix/init.lua                 |  2 ++
 apisix/{core => plugins}/ai.lua | 38 +++++++++++++++++++++++++++-----------
 apisix/router.lua               |  2 --
 conf/config-default.yaml        |  1 +
 t/admin/plugins.t               |  1 +
 t/core/config.t                 |  2 +-
 t/{core => plugin}/ai.t         |  1 -
 10 files changed, 76 insertions(+), 17 deletions(-)

diff --git a/apisix/core.lua b/apisix/core.lua
index f421716e6..7e317f7e5 100644
--- a/apisix/core.lua
+++ b/apisix/core.lua
@@ -54,4 +54,5 @@ return {
     os          = require("apisix.core.os"),
     pubsub      = require("apisix.core.pubsub"),
     math        = require("apisix.core.math"),
+    event       = require("apisix.core.event"),
 }
diff --git a/apisix/core/event.lua b/apisix/core/event.lua
new file mode 100644
index 000000000..38459ff11
--- /dev/null
+++ b/apisix/core/event.lua
@@ -0,0 +1,41 @@
+--
+-- 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 CONST = {
+    BUILD_ROUTER = 1,
+}
+
+local _M = {
+    CONST = CONST,
+}
+
+local events = {}
+
+
+function _M.push(type, ...)
+    local handler = events[type]
+    if handler then
+        handler(...)
+    end
+end
+
+function _M.register(type, handler)
+    -- TODO: we can register more than one handler
+    events[type] = handler
+end
+
+return _M
diff --git a/apisix/http/route.lua b/apisix/http/route.lua
index 28e121708..6292b577a 100644
--- a/apisix/http/route.lua
+++ b/apisix/http/route.lua
@@ -21,7 +21,7 @@ local service_fetch = require("apisix.http.service").get
 local core = require("apisix.core")
 local expr = require("resty.expr.v1")
 local plugin_checker = require("apisix.plugin").plugin_checker
-local ai = require("apisix.core.ai")
+local event = require("apisix.core.event")
 local ipairs = ipairs
 local type = type
 local error = error
@@ -92,7 +92,7 @@ function _M.create_radixtree_uri_router(routes, uri_routes, with_parameter)
         end
     end
 
-    ai.routes_analyze(uri_routes)
+    event.push(event.CONST.BUILD_ROUTER, uri_routes)
     core.log.info("route items: ", core.json.delay_encode(uri_routes, true))
 
     if with_parameter then
diff --git a/apisix/init.lua b/apisix/init.lua
index 04920196d..2030e0241 100644
--- a/apisix/init.lua
+++ b/apisix/init.lua
@@ -152,6 +152,8 @@ function _M.http_init_worker()
 
     apisix_upstream.init_worker()
     require("apisix.plugins.ext-plugin.init").init_worker()
+    -- TODO: need to revisit code layering and avoid similar hacking
+    require("apisix.plugins.ai").init_worker()
 
     local_conf = core.config.local_conf()
 
diff --git a/apisix/core/ai.lua b/apisix/plugins/ai.lua
similarity index 82%
rename from apisix/core/ai.lua
rename to apisix/plugins/ai.lua
index 57a8a60e0..6b60aac29 100644
--- a/apisix/core/ai.lua
+++ b/apisix/plugins/ai.lua
@@ -16,6 +16,8 @@
 --
 local require         = require
 local core            = require("apisix.core")
+local router          = require("apisix.router")
+local event           = require("apisix.core.event")
 local ipairs          = ipairs
 local pcall           = pcall
 local loadstring      = loadstring
@@ -43,10 +45,20 @@ local route_lrucache = core.lrucache.new({
     count = 512
 })
 
-local _M = {}
+local schema = {}
+
+local plugin_name = "ai"
+
+local _M = {
+    version = 0.1,
+    priority = 25000,
+    name = plugin_name,
+    schema = schema,
+    scope = "global",
+}
 
 local orig_router_match
-local router
+
 
 local function match_route(ctx)
     orig_router_match(ctx)
@@ -57,7 +69,7 @@ end
 local function ai_match(ctx)
     local key = get_cache_key_func(ctx)
     core.log.info("route cache key: ", core.log.delay_exec(encode_base64, key))
-    local ver = router.user_routes.conf_version
+    local ver = router.router_http.user_routes.conf_version
     local route_cache = route_lrucache(key, ver,
                                        match_route, ctx)
     -- if the version has not changed, use the cached route
@@ -89,8 +101,8 @@ local function gen_get_cache_key_func(route_flags)
 end
 
 
-function  _M.routes_analyze(routes)
-    -- TODO: we need to add a option in config.yaml to enable this feature(default is true)
+local function routes_analyze(routes)
+    -- TODO: need to add a option in config.yaml to enable this feature(default is true)
     local route_flags = core.table.new(0, 2)
     for _, route in ipairs(routes) do
         if route.methods then
@@ -116,23 +128,27 @@ function  _M.routes_analyze(routes)
 
     if route_flags["vars"] or route_flags["filter_fun"]
          or route_flags["remote_addr"] then
-        router.match = orig_router_match
+        router.router_http.match = orig_router_match
     else
         core.log.info("use ai plane to match route")
-        router.match = ai_match
+        router.router_http.match = ai_match
 
         local ok, err = gen_get_cache_key_func(route_flags)
         if not ok then
             core.log.error("generate get_cache_key_func failed:", err)
-            router.match = orig_router_match
+            router.router_http.match = orig_router_match
         end
     end
 end
 
 
-function _M.init_worker(router_http)
-    router = router_http
-    orig_router_match = router.match
+function _M.init()
+    event.register(event.CONST.BUILD_ROUTER, routes_analyze)
+end
+
+
+function _M.init_worker()
+    orig_router_match = router.router_http.match
 end
 
 return _M
diff --git a/apisix/router.lua b/apisix/router.lua
index 4b6ed6c32..9bdafebbd 100644
--- a/apisix/router.lua
+++ b/apisix/router.lua
@@ -19,7 +19,6 @@ local http_route = require("apisix.http.route")
 local apisix_upstream = require("apisix.upstream")
 local core    = require("apisix.core")
 local plugin_checker = require("apisix.plugin").plugin_checker
-local ai_init = require("apisix.core.ai").init_worker
 local str_lower = string.lower
 local error   = error
 local ipairs  = ipairs
@@ -84,7 +83,6 @@ function _M.http_init_worker()
 
     local router_http = require("apisix.http.router." .. router_http_name)
     attach_http_router_common_methods(router_http)
-    ai_init(router_http)
     router_http.init_worker(filter)
     _M.router_http = router_http
 
diff --git a/conf/config-default.yaml b/conf/config-default.yaml
index 526c65866..bad0e41e4 100755
--- a/conf/config-default.yaml
+++ b/conf/config-default.yaml
@@ -389,6 +389,7 @@ graphql:
   #cmd: ["ls", "-l"]
 
 plugins:                          # plugin list (sorted by priority)
+  - ai                             # priority: 25000
   - real-ip                        # priority: 23000
   - client-control                 # priority: 22000
   - proxy-control                  # priority: 21990
diff --git a/t/admin/plugins.t b/t/admin/plugins.t
index b13919138..74827e437 100644
--- a/t/admin/plugins.t
+++ b/t/admin/plugins.t
@@ -61,6 +61,7 @@ __DATA__
     }
 
 --- response_body
+ai
 real-ip
 client-control
 proxy-control
diff --git a/t/core/config.t b/t/core/config.t
index 29d1cc52d..18191dae7 100644
--- a/t/core/config.t
+++ b/t/core/config.t
@@ -38,7 +38,7 @@ __DATA__
 GET /t
 --- response_body
 etcd host: http://127.0.0.1:2379
-first plugin: "real-ip"
+first plugin: "ai"
 
 
 
diff --git a/t/core/ai.t b/t/plugin/ai.t
similarity index 99%
rename from t/core/ai.t
rename to t/plugin/ai.t
index 14d4e7b10..3c0cd62d9 100644
--- a/t/core/ai.t
+++ b/t/plugin/ai.t
@@ -130,7 +130,6 @@ use ai plane to match route
                     if i == 1 then
                         -- arg_k = a, match route
                         res, err = httpc:request_uri(uri1)
-                        ngx.log(ngx.WARN, "res : ", require("inspect")(res))
                         assert(res.status == 200)
                     else
                         -- arg_k = v, not match route