Baoyuantop commented on code in PR #12695:
URL: https://github.com/apache/apisix/pull/12695#discussion_r2485170037
##########
apisix/discovery/eureka/init.lua:
##########
@@ -185,17 +228,33 @@ local function fetch_full_registry(premature)
metadata = metadata,
})
if metadata then
- -- remove useless data
Review Comment:
Why remove this?
##########
apisix/discovery/eureka/init.lua:
##########
@@ -140,31 +142,72 @@ local function parse_instance(instance)
end
+local function build_endpoints()
+ local host_list = local_conf.discovery and local_conf.discovery.eureka and
local_conf.discovery.eureka.host
+ if not host_list or #host_list == 0 then
+ log.error("do not set eureka.host")
+ return nil
+ end
+
+ local endpoints = core.table.new(#host_list, 0)
+ for _, h in ipairs(host_list) do
+ local url = h
+ local basic_auth
+ local auth_idx = str_find(url, "@")
+ if auth_idx then
+ local protocol_idx = str_find(url, "://")
+ local protocol = string_sub(url, 1, protocol_idx + 2)
+ local user_and_password = string_sub(url, protocol_idx + 3,
auth_idx - 1)
+ local other = string_sub(url, auth_idx + 1)
+ url = protocol .. other
+ basic_auth = "Basic " .. ngx.encode_base64(user_and_password)
+ end
+ if local_conf.discovery.eureka.prefix then
+ url = url .. local_conf.discovery.eureka.prefix
+ end
+ if string_sub(url, #url) ~= "/" then
+ url = url .. "/"
+ end
+ core.table.insert(endpoints, { url = url, auth = basic_auth })
+ end
+ return endpoints
+end
+
+
local function fetch_full_registry(premature)
if premature then
return
end
- local request_uri, basic_auth = service_info()
- if not request_uri then
+ local endpoints = build_endpoints()
+ if not endpoints or #endpoints == 0 then
return
end
- local res, err = request(request_uri, basic_auth, "GET", "apps")
- if not res then
- log.error("failed to fetch registry", err)
- return
+ local res, err
+ local used_endpoint
+ local start = math_random(#endpoints)
+ for i = 0, #endpoints - 1 do
+ local ep = endpoints[((start + i) % #endpoints) + 1]
+ log.info("eureka uri:", ep.url, ".")
+ local r, e = request(ep.url, ep.auth, "GET", "apps")
+ if r and r.body and r.status == 200 then
+ res = r
+ used_endpoint = ep
+ break
+ end
+ log.warn("failed to fetch registry from ", ep.url, ": ", e or (r and
("status=" .. tostring(r.status)) or "unknown"))
end
- if not res.body or res.status ~= 200 then
- log.error("failed to fetch registry, status = ", res.status)
+ if not res then
+ log.error("failed to fetch registry from all eureka hosts")
return
end
local json_str = res.body
- local data, err = core.json.decode(json_str)
Review Comment:
Is this change necessary?
##########
apisix/discovery/eureka/init.lua:
##########
@@ -140,31 +142,72 @@ local function parse_instance(instance)
end
+local function build_endpoints()
+ local host_list = local_conf.discovery and local_conf.discovery.eureka and
local_conf.discovery.eureka.host
+ if not host_list or #host_list == 0 then
+ log.error("do not set eureka.host")
+ return nil
+ end
+
+ local endpoints = core.table.new(#host_list, 0)
+ for _, h in ipairs(host_list) do
+ local url = h
+ local basic_auth
+ local auth_idx = str_find(url, "@")
+ if auth_idx then
+ local protocol_idx = str_find(url, "://")
+ local protocol = string_sub(url, 1, protocol_idx + 2)
+ local user_and_password = string_sub(url, protocol_idx + 3,
auth_idx - 1)
+ local other = string_sub(url, auth_idx + 1)
+ url = protocol .. other
+ basic_auth = "Basic " .. ngx.encode_base64(user_and_password)
+ end
+ if local_conf.discovery.eureka.prefix then
+ url = url .. local_conf.discovery.eureka.prefix
+ end
+ if string_sub(url, #url) ~= "/" then
+ url = url .. "/"
+ end
+ core.table.insert(endpoints, { url = url, auth = basic_auth })
+ end
+ return endpoints
+end
+
+
local function fetch_full_registry(premature)
if premature then
return
end
- local request_uri, basic_auth = service_info()
- if not request_uri then
+ local endpoints = build_endpoints()
Review Comment:
I think it's better to execute `build_endpoints` directly during the
`init_worker` phase.
##########
apisix/discovery/eureka/init.lua:
##########
@@ -29,10 +29,12 @@ local ngx_timer_every = ngx.timer.every
local string_sub = string.sub
local str_find = core.string.find
local log = core.log
+local semaphore = require("ngx.semaphore")
local default_weight
local applications
-
+local init_sema
+local initial_fetched = false
Review Comment:
Could you explain some of the functions of this?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]