aboutsummaryrefslogtreecommitdiffstats
path: root/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua
diff options
context:
space:
mode:
Diffstat (limited to 'msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua')
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua187
1 files changed, 0 insertions, 187 deletions
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua
deleted file mode 100644
index 46d0b8a..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua
+++ /dev/null
@@ -1,187 +0,0 @@
---[[
-
- Copyright 2016 ZTE Corporation.
-
- Licensed 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
-]]
--- put red into the connection pool of size 100,
--- with 10 seconds max idle time
-local function close_redis(red)
- if not red then
- return
- end
- --release connection to the pool
- local pool_max_idle_time = 10000
- local pool_size = 100
- local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
- if not ok then
- ngx.log(ngx.ERR, "set keepalive error:", err)
- end
- return
-end
-
-local function query_ipurl_updatecache(red,key)
- local keyprefix = "msb:routing:custom:"..key
-
-
- local infokey=keyprefix..":info"
- -- first of all check whether the status is 1(enabled)
- local status = red:hget(infokey,"status")
- if not (status=="1") then
- ngx.log(ngx.WARN, key.."is disabled.status=", status)
- return nil
- end
-
- -- Try to get url for key
- local url, err = red:hget(infokey,"url")
- ngx.log(ngx.WARN, "==url:", url)
- if not url or url == ngx.null then
- return nil
- end
-
- -- Try to get ip:port for key
- local serverkey=keyprefix..":lb:server1"
- local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
- ngx.log(ngx.WARN, "==server:", server)
- if not server or server == ngx.null then
- return nil
- end
-
- -- get the local cache
- local cache = ngx.shared.ceryx
- local uri = ngx.var.uri
- -- Save found key to local cache for 5 seconds
- cache:set("custom:key:"..uri,key,5)
- cache:set("custom:server:"..uri,server,5)
- cache:set("custom:url:"..uri,url,5)
-
- ngx.var.key = key
- ngx.var.server = server
- ngx.var.url = url
- return true
-end
-
-local function query_allkeys_updatecache(red)
- -- Try to get all keys start with "msb:routing:custom:"
- local allkeys, err = red:keys("msb:routing:custom:*")
- if not allkeys or allkeys == ngx.null then
- ngx.log(ngx.ERR,err)
- return ""
- end
- local key_set={}
- for key, value in ipairs(allkeys) do
- name = string.gsub(string.gsub(string.gsub(value,"msb:routing:custom:",""),":info",""),":lb:server1","")
- key_set[name]=true
- end
- local key_table = {}
- local index = 1
- for key,_ in pairs(key_set) do
- key_table[index] = key
- index = index + 1
- end
- table.sort(key_table, function (a, b)
- return a > b
- end)
-
- local servicenames = ""
- local delimiter = "<>"
- for i=1,#key_table do
- servicenames=servicenames..key_table[i]..delimiter
- end
-
- -- get the local cache
- local cache = ngx.shared.ceryx
- -- Save all keys to local cache for 30 seconds(0.5 minutes)
- cache:set("customrouter:allkeys", servicenames, 30)
- return servicenames;
-end
-
-local function query_router_info()
- local uri = ngx.var.uri
- ngx.log(ngx.WARN, "==uri:", uri)
-
- -- Check if key exists in local cache
- local cache = ngx.shared.ceryx
- local key, flags = cache:get("custom:key:"..uri)
- local server, flags = cache:get("custom:server:"..uri)
- local url, flags = cache:get("custom:url:"..uri)
- if key and server and url then
- ngx.var.key = key
- ngx.var.server = server
- ngx.var.url = url
- ngx.log(ngx.WARN, "==using custom cache:", key.."&&"..server.."&&"..url)
- return
- end
-
- local redis = require "resty.redis"
- local red = redis:new()
- red:set_timeout(1000) -- 1000 ms
- local redis_host = "127.0.0.1"
- local redis_port = 6379
- local res, err = red:connect(redis_host, redis_port)
-
- -- Return if could not connect to Redis
- if not res then
- ngx.log(ngx.ERR, "connect to redis error:", err)
- return
- end
-
- -- Check if all servicenames exists in local cache
- local servicenames, flags = cache:get("customrouter:allkeys")
- if servicenames then
- ngx.log(ngx.WARN,"==get all keys from cache:",servicenames)
- else
- servicenames = query_allkeys_updatecache(red)
- end
-
- local delimiter = "<>"
- for key in string.gmatch(servicenames,"(.-)"..delimiter) do
- ngx.log(ngx.WARN, "==key_table key:", key)
- local from, to, err = ngx.re.find(uri, "^"..key.."(/(.*))?$", "jo")
- if from then
- ngx.log(ngx.WARN,"Matched! start-end:",from,"-",to)
- local result = query_ipurl_updatecache(red,key)
- if result then
- break
- end
- else
- ngx.log(ngx.WARN,"not Matched")
- if err then
- ngx.log(ngx.WARN,"ngx.re.find throw error: ",err)
- return
- end
- end
- end
-
- return close_redis(red)
-end
-
-local function rewrite_router_url()
- local server=ngx.var.server
- if server=="fallback" then
- ngx.status = ngx.HTTP_NOT_FOUND
- ngx.exit(ngx.status)
- end
- local url=ngx.var.url
- local key=ngx.var.key
- local rewriteduri = ngx.re.sub(ngx.var.uri, "^"..key.."(.*)", url.."$1", "o")
- ngx.log(ngx.WARN, "==rewrited uri:", rewriteduri)
- ngx.req.set_uri(rewriteduri)
-end
-
-query_router_info()
-rewrite_router_url() \ No newline at end of file