@Service public class InstanceRegistrationService implements ApplicationContextAware { private EurekaRegistration registration; private final ServiceRegistry serviceRegistry; private final EurekaInstanceConfigBean eurekaInstanceConfigBean; private final ApplicationInfoManager applicationInfoManager; private final EurekaClient eurekaClient; private final EurekaHealthCheckHandler eurekaHealthCheckHandler; private final DiscoveryClient discoveryClient; @Autowired public InstanceRegistrationService(ServiceRegistry serviceRegistry, @Autowired(required = false) EurekaRegistration registration, EurekaInstanceConfigBean eurekaInstanceConfigBean, ApplicationInfoManager applicationInfoManager, EurekaClient eurekaClient, EurekaHealthCheckHandler eurekaHealthCheckHandler, DiscoveryClient discoveryClient) { this.serviceRegistry = serviceRegistry; this.registration = registration; this.eurekaInstanceConfigBean = eurekaInstanceConfigBean; this.applicationInfoManager = applicationInfoManager; this.eurekaClient = eurekaClient; this.eurekaHealthCheckHandler = eurekaHealthCheckHandler; this.discoveryClient = discoveryClient; } InstanceInfo registerInstance(String status) { EurekaRegistration newRegistration = EurekaRegistration.builder(eurekaInstanceConfigBean) .with(applicationInfoManager) .with(eurekaClient) .with(eurekaHealthCheckHandler) .build(); serviceRegistry.register(newRegistration); serviceRegistry.setStatus(newRegistration, status); this.registration = newRegistration; return newRegistration.getApplicationInfoManager().getInfo(); } InstanceInfo deregisterInstance() throws InterruptedException { serviceRegistry.setStatus(registration, "OUT_OF_SERVICE"); // Give time for the OUT_OF_SERVICE status to propagate to all instances before shutdown Thread.sleep(60000L); serviceRegistry.deregister(registration); return registration.getApplicationInfoManager().getInfo(); } InstanceInfo setStatus(String status) { if (registration != null) { serviceRegistry.setStatus(registration, status); return registration.getApplicationInfoManager().getInfo(); } else { return null; } } }