1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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()
|