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]

Reply via email to