From b69d850757a7a8c4ff9a368df004a3cfaaf9f1e4 Mon Sep 17 00:00:00 2001 From: Zhaoxing Date: Thu, 8 Sep 2016 23:20:06 +0800 Subject: Issue-id: OCS-9 Change-Id: I73c18bdda656c43687810930338f9a949ed08848 Signed-off-by: Zhaoxing --- .../openresty/nginx/luaext/openouirouter.lua | 115 +++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua (limited to 'msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua') diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua new file mode 100644 index 0000000..736aacd --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua @@ -0,0 +1,115 @@ +--[[ + + Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved. + + 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 rewrite_iui_url() + local iuiserver=ngx.var.iuiserver + if iuiserver=="fallback" then + ngx.status = ngx.HTTP_NOT_FOUND + ngx.exit(ngx.status) + end + local iuiurl=ngx.var.iuiurl + local uri = ngx.re.sub(ngx.var.uri, "^/openoui/([^/]+)(.*)", iuiurl.."$2", "o") + ngx.req.set_uri(uri) +end + +local function query_iui_info() + local iuiserver = ngx.var.iuiserver + local iuiname = ngx.var.iuiname + + -- Check if key exists in local cache + local cache = ngx.shared.ceryx + local server, flags = cache:get("server:iui:"..iuiname) + local url, flags = cache:get("url:iui:"..iuiname) + if server and url then + ngx.var.iuiserver = server + ngx.var.iuiurl = url + ngx.log(ngx.WARN, "==using iui cache:", 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 + + -- Construct Redis key + local prefix = "msb" + local keyprefix = prefix..":routing:iui:"..iuiname + + 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, keyprefix.."is disabled.status=", status) + return close_redis(red) + end + + -- Try to get url for iuiname + local url, err = red:hget(infokey,"url") + ngx.log(ngx.WARN, "==url:", url) + if not url or url == ngx.null then + return close_redis(red) + end + + -- Try to get ip:port for iuiname + 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 close_redis(red) + end + + + -- Save found key to local cache for 5 seconds + cache:set("server:iui:"..iuiname, server, 5) + cache:set("url:iui:"..iuiname, url, 5) + + ngx.log(ngx.WARN, "==iui result:", server.."&&"..url) + ngx.var.iuiserver = server + ngx.var.iuiurl = url + + return close_redis(red) +end +query_iui_info() +rewrite_iui_url() \ No newline at end of file -- cgit 1.2.3-korg