bzp2010 commented on code in PR #12906:
URL: https://github.com/apache/apisix/pull/12906#discussion_r2693237412
##########
apisix/discovery/eureka/init.lua:
##########
@@ -140,31 +109,75 @@ local function parse_instance(instance)
end
+-- build all eureka endpoints from config
+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 built_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(built_endpoints, { url = url, auth = basic_auth })
+ end
+ return built_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
+ -- try endpoints from random position, failover on error
+ local selected_endpoint
+ local selected_body
+ local num_endpoints = #endpoints
+ local start = math_random(num_endpoints)
+ for i = 0, num_endpoints - 1 do
+ local endpoint = endpoints[(start + i - 1) % num_endpoints + 1]
+ local r, e = request(endpoint.url, endpoint.auth, "GET", "apps")
+ if r and r.body and r.status == 200 then
+ selected_endpoint = endpoint
+ selected_body = r.body
+ break
+ end
Review Comment:
This modification essentially ensures that if a registry unexpectedly fails,
it will retry until a good registry is used. While this may introduce some
additional latency, is it necessary to document it?
--
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]