Spring cloud eureka client to multiple eureka servers

I just reviewed the source code for Eureka 1.1.147. It works differently that i expected but at least I know now.

You can put multiple service urls in the set

serviceUrl:
      defaultZone: http://localhost:8762/eureka/, http://localhost:8761/eureka/

But the register action only uses the first one to register. There remaining are used only if attempting to contact the first fails.

from (DiscoveryClient.java)

   /**
     * Register with the eureka service by making the appropriate REST call.
     */
    void register() {
        logger.info(PREFIX + appPathIdentifier + ": registering service...");
        ClientResponse response = null;
        try {
            response = makeRemoteCall(Action.Register);
            isRegisteredWithDiscovery = true;
            logger.info(PREFIX + appPathIdentifier + " - registration status: "
                    + (response != null ? response.getStatus() : "not sent"));
        } catch (Throwable e) {
            logger.error(PREFIX + appPathIdentifier + " - registration failed"
                    + e.getMessage(), e);
        } finally {
            if (response != null) {
                response.close();
            }
        }
    }

which calls

private ClientResponse makeRemoteCall(Action action) throws Throwable {
    return makeRemoteCall(action, 0);
}

It only calls the backup when an exception is thrown in the above makeRemoteCall(action, 0) call

   } catch (Throwable t) {
            closeResponse(response);
            String msg = "Can't get a response from " + serviceUrl + urlPath;
            if (eurekaServiceUrls.get().size() > (++serviceUrlIndex)) {
                logger.warn(msg, t);
                logger.warn("Trying backup: " + eurekaServiceUrls.get().get(serviceUrlIndex));
                SERVER_RETRY_COUNTER.increment();
                return makeRemoteCall(action, serviceUrlIndex);
            } else {
                ALL_SERVER_FAILURE_COUNT.increment();
                logger.error(
                        msg
                                + "\nCan't contact any eureka nodes - possibly a security group issue?",
                        t);
                throw t;
            }

So you can't really register to two eureka servers simultaneously from this code. Unless I missed something.

Tags:

Spring Cloud