@@ -39,6 +39,9 @@ local lrucache_server_picker = core.lrucache.new({
39
39
local lrucache_checker = core .lrucache .new ({
40
40
ttl = 300 , count = 256
41
41
})
42
+ local lrucache_addr = core .lrucache .new ({
43
+ ttl = 300 , count = 1024 * 4
44
+ })
42
45
43
46
44
47
local _M = {
@@ -143,25 +146,47 @@ local function create_server_picker(upstream, checker)
143
146
end
144
147
145
148
149
+ local function parse_addr (addr )
150
+ local host , port , err = core .utils .parse_addr (addr )
151
+ return {host = host , port = port }, err
152
+ end
153
+
154
+
146
155
local function pick_server (route , ctx )
147
156
core .log .info (" route: " , core .json .delay_encode (route , true ))
148
157
core .log .info (" ctx: " , core .json .delay_encode (ctx , true ))
149
- local healthcheck_parent = ctx .upstream_healthcheck_parent
150
158
local up_conf = ctx .upstream_conf
151
- local version = ctx .upstream_version
152
- local key = ctx .upstream_key
153
-
154
159
if up_conf .service_name then
155
160
if not discovery then
156
- return nil , nil , " discovery is uninitialized"
161
+ return nil , " discovery is uninitialized"
157
162
end
158
163
up_conf .nodes = discovery .nodes (up_conf .service_name )
159
164
end
160
165
161
- if not up_conf .nodes or # up_conf .nodes == 0 then
162
- return nil , nil , " no valid upstream node"
166
+ local nodes_count = up_conf .nodes and # up_conf .nodes or 0
167
+ if nodes_count == 0 then
168
+ return nil , " no valid upstream node"
169
+ end
170
+
171
+ if up_conf .timeout then
172
+ local timeout = up_conf .timeout
173
+ local ok , err = set_timeouts (timeout .connect , timeout .send ,
174
+ timeout .read )
175
+ if not ok then
176
+ core .log .error (" could not set upstream timeouts: " , err )
177
+ end
163
178
end
164
179
180
+ if nodes_count == 1 then
181
+ local node = up_conf .nodes [1 ]
182
+ ctx .balancer_ip = node .host
183
+ ctx .balancer_port = node .port
184
+ return node
185
+ end
186
+
187
+ local healthcheck_parent = ctx .upstream_healthcheck_parent
188
+ local version = ctx .upstream_version
189
+ local key = ctx .upstream_key
165
190
local checker = fetch_healthchecker (up_conf , healthcheck_parent , version )
166
191
167
192
ctx .balancer_try_count = (ctx .balancer_try_count or 0 ) + 1
@@ -197,28 +222,25 @@ local function pick_server(route, ctx)
197
222
local server_picker = lrucache_server_picker (key , version ,
198
223
create_server_picker , up_conf , checker )
199
224
if not server_picker then
200
- return nil , nil , " failed to fetch server picker"
225
+ return nil , " failed to fetch server picker"
201
226
end
202
227
203
228
local server , err = server_picker .get (ctx )
204
229
if not server then
205
230
err = err or " no valid upstream node"
206
- return nil , nil , " failed to find valid upstream server, " .. err
231
+ return nil , " failed to find valid upstream server, " .. err
207
232
end
208
233
209
- if up_conf .timeout then
210
- local timeout = up_conf .timeout
211
- local ok , err = set_timeouts (timeout .connect , timeout .send , timeout .read )
212
- if not ok then
213
- core .log .error (" could not set upstream timeouts: " , err )
214
- end
234
+ local res , err = lrucache_addr (server , nil , parse_addr , server )
235
+ ctx .balancer_ip = res .host
236
+ ctx .balancer_port = res .port
237
+ -- core.log.info("proxy to ", host, ":", port)
238
+ if err then
239
+ core .log .error (" failed to parse server addr: " , server , " err: " , err )
240
+ return core .response .exit (502 )
215
241
end
216
242
217
- local ip , port , err = core .utils .parse_addr (server )
218
- ctx .balancer_ip = ip
219
- ctx .balancer_port = port
220
- core .log .info (" proxy to " , ip , " :" , port )
221
- return ip , port , err
243
+ return res
222
244
end
223
245
224
246
@@ -227,16 +249,16 @@ _M.pick_server = pick_server
227
249
228
250
229
251
function _M .run (route , ctx )
230
- local ip , port , err = pick_server (route , ctx )
231
- if err then
252
+ local server , err = pick_server (route , ctx )
253
+ if not server then
232
254
core .log .error (" failed to pick server: " , err )
233
255
return core .response .exit (502 )
234
256
end
235
257
236
- local ok , err = balancer .set_current_peer (ip , port )
258
+ local ok , err = balancer .set_current_peer (server . host , server . port )
237
259
if not ok then
238
- core .log .error (" failed to set server peer [" , ip , " :" , port ,
239
- " ] err: " , err )
260
+ core .log .error (" failed to set server peer [" , server . host , " :" ,
261
+ server . port , " ] err: " , err )
240
262
return core .response .exit (502 )
241
263
end
242
264
0 commit comments