Merge branch '1.2.x'

This commit is contained in:
Marcin Grzejszczak
2017-12-22 12:41:03 +01:00
5 changed files with 85 additions and 440 deletions

View File

@@ -1,25 +0,0 @@
package org.springframework.cloud.contract.stubrunner.spring.cloud.eureka;
import com.netflix.appinfo.InstanceInfo;
public class ApplicationStatus {
private Application application;
private InstanceInfo.InstanceStatus status;
public ApplicationStatus(Application application,
InstanceInfo.InstanceStatus status) {
this.application = application;
this.status = status;
}
public ApplicationStatus() {
}
public Application getApplication() {
return this.application;
}
public InstanceInfo.InstanceStatus getStatus() {
return this.status;
}
}

View File

@@ -1,335 +0,0 @@
package org.springframework.cloud.contract.stubrunner.spring.cloud.eureka;
import java.lang.invoke.MethodHandles;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.cloud.netflix.eureka.CloudEurekaClient;
import org.springframework.cloud.netflix.eureka.EurekaClientConfigBean;
import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean;
import org.springframework.cloud.netflix.eureka.InstanceInfoFactory;
import org.springframework.http.HttpStatus;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClientConfig;
import com.netflix.discovery.shared.Applications;
import com.netflix.discovery.shared.resolver.ClosableResolver;
import com.netflix.discovery.shared.resolver.EurekaEndpoint;
import com.netflix.discovery.shared.resolver.aws.ApplicationsResolver;
import com.netflix.discovery.shared.resolver.aws.AwsEndpoint;
import com.netflix.discovery.shared.transport.EurekaHttpClient;
import com.netflix.discovery.shared.transport.EurekaHttpClientFactory;
import com.netflix.discovery.shared.transport.EurekaHttpClients;
import com.netflix.discovery.shared.transport.EurekaHttpResponse;
import com.netflix.discovery.shared.transport.EurekaTransportConfig;
import com.netflix.discovery.shared.transport.TransportClientFactory;
import com.netflix.discovery.shared.transport.decorator.MetricsCollectingEurekaHttpClient;
import com.netflix.discovery.shared.transport.jersey.JerseyEurekaHttpClientFactory;
import com.sun.jersey.api.client.filter.ClientFilter;
import static java.util.concurrent.TimeUnit.SECONDS;
/**
* Taken from https://github.com/spencergibb/spring-cloud-netflix-eureka-lite
*
* @author Spencer Gibb
*
* @since 1.0.0
*/
public class Eureka {
private static final Log log = LogFactory.getLog(MethodHandles.lookup().lookupClass());
private final InetUtils inetUtils;
final CloudEurekaClient eurekaClient;
final EurekaClientConfigBean clientConfig;
final EurekaTransport transport;
public Eureka(InetUtils inetUtils, EurekaClientConfigBean eurekaClientConfigBean, CloudEurekaClient eurekaClient) {
this.inetUtils = inetUtils;
this.eurekaClient = eurekaClient;
this.clientConfig = new EurekaClientConfigBean();
this.clientConfig.setRegisterWithEureka(false); // turn off registering with eureka, let apps send heartbeats.
this.clientConfig.setServiceUrl(eurekaClientConfigBean.getServiceUrl());
this.transport = createTransport();
}
public Registration register(Application application) {
long start = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(String.format("Starting registration of %s", application));
}
InstanceInfo instanceInfo = getInstanceInfo(application);
Registration registration = new Registration(instanceInfo, application);
long duration = (System.currentTimeMillis() - start) ;
if (log.isDebugEnabled()) {
log.debug(String.format("Created registration for %s in %s ms", application, duration));
}
register(registration);
return registration;
}
public InstanceInfo getInstanceInfo(Application application, long lastUpdatedTimestamp, long lastDirtyTimestamp) {
InstanceInfo instanceInfo = getInstanceInfo(application);
instanceInfo = new InstanceInfo.Builder(instanceInfo)
.setLastDirtyTimestamp(lastDirtyTimestamp)
.setLastUpdatedTimestamp(lastUpdatedTimestamp)
.build();
return instanceInfo;
}
public InstanceInfo getInstanceInfo(Application application) {
EurekaInstanceConfigBean instanceConfig = new EurekaInstanceConfigBean(this.inetUtils);
instanceConfig.setInstanceEnabledOnit(true);
instanceConfig.setAppname(application.getName());
instanceConfig.setVirtualHostName(application.getName());
instanceConfig.setInstanceId(application.getInstance_id());
instanceConfig.setHostname(application.getHostname());
instanceConfig.setNonSecurePort(application.getPort());
return new InstanceInfoFactory().create(instanceConfig);
}
public EurekaTransport createTransport() {
TransportClientFactory transportClientFactory = newTransportClientFactory(this.clientConfig, Collections.<ClientFilter>emptyList());
EurekaTransportConfig transportConfig = this.clientConfig.getTransportConfig();
ClosableResolver<AwsEndpoint> bootstrapResolver = EurekaHttpClients.newBootstrapResolver(
this.clientConfig,
transportConfig,
transportClientFactory,
null,
new ApplicationsResolver.ApplicationsSource() {
@Override
public Applications getApplications(int stalenessThreshold, TimeUnit timeUnit) {
long thresholdInMs = TimeUnit.MILLISECONDS.convert(stalenessThreshold, timeUnit);
long delay = Eureka.this.eurekaClient.getLastSuccessfulRegistryFetchTimePeriod();
if (delay > thresholdInMs) {
log.info(String.format("Local registry is too stale for local lookup. Threshold:%s, actual:%s",
thresholdInMs, delay));
return null;
} else {
return Eureka.this.eurekaClient.getApplications();
}
}
}
);
EurekaHttpClientFactory httpClientFactory;
try {
httpClientFactory = EurekaHttpClients.registrationClientFactory(
bootstrapResolver,
transportClientFactory,
transportConfig
);
} catch (Exception e) {
log.warn("Experimental transport initialization failure", e);
throw new RuntimeException(e);
}
return new EurekaTransport(httpClientFactory, httpClientFactory.newClient(), transportClientFactory, bootstrapResolver);
}
public static TransportClientFactory newTransportClientFactory(
final EurekaClientConfig clientConfig,
final Collection<ClientFilter> additionalFilters) {
final TransportClientFactory jerseyFactory = JerseyEurekaHttpClientFactory.create(
clientConfig, additionalFilters, null, null);
final TransportClientFactory metricsFactory = MetricsCollectingEurekaHttpClient.createFactory(jerseyFactory);
return new TransportClientFactory() {
@Override
public EurekaHttpClient newClient(EurekaEndpoint serviceUrl) {
return metricsFactory.newClient(serviceUrl);
}
@Override
public void shutdown() {
metricsFactory.shutdown();
jerseyFactory.shutdown();
}
};
}
/**
* Renew with the eureka service by making the appropriate REST call
*/
public boolean renew(Registration registration) {
InstanceInfo instanceInfo = registration.getInstanceInfo();
EurekaHttpResponse<InstanceInfo> httpResponse;
try {
httpResponse = this.transport.getEurekaHttpClient().sendHeartBeat(instanceInfo.getAppName(), instanceInfo.getId(), instanceInfo, null);
if (log.isDebugEnabled()) {
log.debug(String.format("EurekaLite_%s/%s - Heartbeat status: %s", instanceInfo.getAppName(), instanceInfo.getId(), httpResponse.getStatusCode()));
}
if (httpResponse.getStatusCode() == HttpStatus.NOT_FOUND.value()) {
log.info(String.format("EurekaLite_%s/%s - Re-registering apps/%s", instanceInfo.getAppName(), instanceInfo.getId(), instanceInfo.getAppName()));
return register(registration);
}
return httpResponse.getStatusCode() == HttpStatus.OK.value();
} catch (Exception e) {
log.error("EurekaLite_"+instanceInfo.getAppName()+"/"+ instanceInfo.getId() + " - was unable to send heartbeat!", e);
return false;
}
}
/**
* Register with the eureka service by making the appropriate REST call.
*/
protected boolean register(Registration registration) {
InstanceInfo instanceInfo = registration.getInstanceInfo();
log.info(String.format("EurekaLite_%s/%s: registering service...", instanceInfo.getAppName(), instanceInfo.getId()));
EurekaHttpResponse<Void> httpResponse;
try {
httpResponse = this.transport.getEurekaHttpClient().register(instanceInfo);
} catch (Exception e) {
log.warn("EurekaLite_"+instanceInfo.getAppName()+"/"+ instanceInfo.getId() + " - registration failed " + e.getMessage(), e);
throw e;
}
if (log.isInfoEnabled()) {
log.info(String.format("EurekaLite_%s/%s - registration status: %s", instanceInfo.getAppName(), instanceInfo.getId(), httpResponse.getStatusCode()));
}
return httpResponse.getStatusCode() == HttpStatus.NO_CONTENT.value();
}
public void shutdown(Registration registration) {
InstanceInfo instanceInfo = registration.getInstanceInfo();
try {
EurekaHttpResponse<Void> httpResponse = this.transport.getEurekaHttpClient().cancel(instanceInfo.getAppName(), instanceInfo.getInstanceId());
log.info(String.format("EurekaLite_%s/%s - deregister status: %s", instanceInfo.getAppName(), instanceInfo.getId(), httpResponse.getStatusCode()));
} catch (Exception e) {
log.error("EurekaLite_"+instanceInfo.getAppName()+"/"+ instanceInfo.getId() + " - de-registration failed " + e.getMessage(), e);
}
this.transport.shutdown();
}
}
/**
* Taken from https://github.com/spencergibb/spring-cloud-netflix-eureka-lite
*
* @author Spencer Gibb
*
* @since 1.0.0
*/
class EurekaTransport {
private final EurekaHttpClientFactory eurekaHttpClientFactory;
private final EurekaHttpClient eurekaHttpClient;
private final TransportClientFactory transportClientFactory;
private final ClosableResolver closableResolver;
public EurekaTransport(EurekaHttpClientFactory eurekaHttpClientFactory,
EurekaHttpClient eurekaHttpClient,
TransportClientFactory transportClientFactory,
ClosableResolver closableResolver) {
this.eurekaHttpClientFactory = eurekaHttpClientFactory;
this.eurekaHttpClient = eurekaHttpClient;
this.transportClientFactory = transportClientFactory;
this.closableResolver = closableResolver;
}
public void shutdown() {
this.eurekaHttpClientFactory.shutdown();
this.eurekaHttpClient.shutdown();
this.transportClientFactory.shutdown();
this.closableResolver.shutdown();
}
public EurekaHttpClientFactory getEurekaHttpClientFactory() {
return this.eurekaHttpClientFactory;
}
public EurekaHttpClient getEurekaHttpClient() {
return this.eurekaHttpClient;
}
public TransportClientFactory getTransportClientFactory() {
return this.transportClientFactory;
}
public ClosableResolver getClosableResolver() {
return this.closableResolver;
}
}
/**
* Taken from https://github.com/spencergibb/spring-cloud-netflix-eureka-lite
*
* @author Spencer Gibb
*
* @since 1.0.0
*/
class Application {
private String name;
private String instance_id;
private String hostname;
private int port;
public Application(String name, String instance_id, String hostname, int port) {
this.name = name;
this.instance_id = instance_id;
this.hostname = hostname;
this.port = port;
}
public Application() {
}
@JsonIgnore
public String getRegistrationKey() {
return computeRegistrationKey(this.name, this.instance_id);
}
static String computeRegistrationKey(String name, String instanceId) {
return name + ":" + instanceId;
}
public String getName() {
return this.name;
}
public String getInstance_id() {
return this.instance_id;
}
public String getHostname() {
return this.hostname;
}
public int getPort() {
return this.port;
}
}
/**
* Scheduled service that automatically will renew registrations in Eureka
*/
class Renewer implements Runnable {
private static final Log log = LogFactory.getLog(MethodHandles.lookup().lookupClass());
final Eureka eureka;
final Registration registration;
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Renewer(int flushInterval, Eureka eureka,
Registration registration) {
this.eureka = eureka;
this.registration = registration;
this.scheduler.scheduleWithFixedDelay(this, 0, flushInterval, SECONDS);
}
@Override
public void run() {
if (log.isTraceEnabled()) {
log.trace("Renewing registration [" + this.registration + "]");
}
this.eureka.renew(this.registration);
}
}

View File

@@ -1,20 +1,33 @@
package org.springframework.cloud.contract.stubrunner.spring.cloud.eureka;
import java.lang.invoke.MethodHandles;
import java.net.InetAddress;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.cloud.contract.stubrunner.StubConfiguration;
import org.springframework.cloud.contract.stubrunner.StubRunning;
import org.springframework.cloud.contract.stubrunner.spring.cloud.StubMapperProperties;
import org.springframework.cloud.contract.stubrunner.spring.cloud.StubsRegistrar;
import org.springframework.cloud.netflix.eureka.CloudEurekaClient;
import org.springframework.cloud.netflix.eureka.EurekaClientConfigBean;
import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean;
import org.springframework.cloud.netflix.eureka.InstanceInfoFactory;
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
import org.springframework.context.ApplicationContext;
import org.springframework.util.StringUtils;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs;
import com.netflix.discovery.EurekaClient;
/**
* Registers all stubs in Eureka Service Discovery
*
@@ -27,39 +40,50 @@ public class EurekaStubsRegistrar implements StubsRegistrar {
private static final Log log = LogFactory.getLog(MethodHandles.lookup().lookupClass());
private final StubRunning stubRunning;
private final Eureka eurekaClient;
private final StubMapperProperties stubMapperProperties;
private final InetUtils inetUtils;
private final EurekaInstanceConfigBean eurekaInstanceConfigBean;
private final List<Renewer> discoveryList = new LinkedList<>();
private final EurekaClientConfigBean eurekaClientConfigBean;
private final List<EurekaRegistration> registrations = new LinkedList<>();
private final ServiceRegistry<EurekaRegistration> serviceRegistry;
private final ApplicationContext context;
public EurekaStubsRegistrar(StubRunning stubRunning, Eureka eureka,
public EurekaStubsRegistrar(StubRunning stubRunning,
ServiceRegistry<EurekaRegistration> serviceRegistry,
StubMapperProperties stubMapperProperties, InetUtils inetUtils,
EurekaInstanceConfigBean eurekaInstanceConfigBean) {
EurekaInstanceConfigBean eurekaInstanceConfigBean,
EurekaClientConfigBean eurekaClientConfigBean,
ApplicationContext context) {
this.stubRunning = stubRunning;
this.stubMapperProperties = stubMapperProperties;
this.eurekaClient = eureka;
this.serviceRegistry = serviceRegistry;
this.inetUtils = inetUtils;
this.eurekaInstanceConfigBean = eurekaInstanceConfigBean;
this.eurekaClientConfigBean = eurekaClientConfigBean;
this.context = context;
}
@Override public void registerStubs() {
Map<StubConfiguration, Integer> activeStubs = this.stubRunning.runStubs()
.validNamesAndPorts();
for (Map.Entry<StubConfiguration, Integer> entry : activeStubs.entrySet()) {
Application application = new Application(name(entry.getKey()), entry.getKey().getArtifactId(),
StringUtils.hasText(hostName(entry)) ?
hostName(entry) :
this.inetUtils.findFirstNonLoopbackAddress().getHostName(),
port(entry));
EurekaInstanceConfigBean instance = registration(entry);
log.info("Will register stub in Eureka " + "[" + instance.getAppname() + ", "
+ instance.getHostname() + ", " + instance.getNonSecurePort() + ", "
+ instance.getInstanceId() + "]");
InstanceInfo instanceInfo = new InstanceInfoFactory().create(instance);
ApplicationInfoManager applicationInfoManager = new ApplicationInfoManager(instance, instanceInfo);
AbstractDiscoveryClientOptionalArgs args = args();
EurekaClient client = new CloudEurekaClient(applicationInfoManager, this.eurekaClientConfigBean, args, this.context);
EurekaRegistration registration = EurekaRegistration.builder(instance)
.with(this.eurekaClientConfigBean, this.context)
.with(client)
.build();
this.registrations.add(registration);
try {
Registration register = this.eurekaClient.register(application);
this.discoveryList.add(new Renewer(
this.eurekaClient.clientConfig.getInstanceInfoReplicationIntervalSeconds() / 2, this.eurekaClient, register));
if (log.isDebugEnabled()) {
log.debug("Successfully registered stub [" + entry.getKey().toColonSeparatedDependencyNotation()
+ "] in Service Discovery");
}
this.serviceRegistry.register(registration);
log.info("Successfully registered stub " + "[" + entry.getKey()
.toColonSeparatedDependencyNotation() + "] in Service Discovery");
}
catch (Exception e) {
log.warn("Exception occurred while trying to register a stub [" + entry.getKey().toColonSeparatedDependencyNotation()
@@ -68,6 +92,33 @@ public class EurekaStubsRegistrar implements StubsRegistrar {
}
}
private AbstractDiscoveryClientOptionalArgs args() {
try {
return this.context
.getBean(AbstractDiscoveryClientOptionalArgs.class);
} catch (BeansException e) {
return null;
}
}
private EurekaInstanceConfigBean registration(Map.Entry<StubConfiguration, Integer> entry) {
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(this.inetUtils);
String appName = name(entry.getKey());
config.setInstanceEnabledOnit(true);
InetAddress address = this.inetUtils.findFirstNonLoopbackAddress();
config.setIpAddress(address.getHostAddress());
config.setHostname(StringUtils.hasText(hostName(entry)) ?
hostName(entry) : address.getHostName());
config.setAppname(appName);
config.setVirtualHostName(appName);
config.setSecureVirtualHostName(appName);
int port = port(entry);
config.setNonSecurePort(port);
config.setInstanceId(address.getHostAddress() + ":" + entry.getKey().getArtifactId() + ":" + port);
config.setLeaseRenewalIntervalInSeconds(1);
return config;
}
protected String hostName(Map.Entry<StubConfiguration, Integer> entry) {
return this.eurekaInstanceConfigBean.getHostname();
}
@@ -87,9 +138,9 @@ public class EurekaStubsRegistrar implements StubsRegistrar {
@Override
public void close() throws Exception {
for (Renewer renewer : this.discoveryList) {
this.eurekaClient.shutdown(renewer.registration);
renewer.scheduler.shutdown();
for (EurekaRegistration registration : this.registrations) {
this.serviceRegistry.deregister(registration);
registration.close();
}
}
}

View File

@@ -1,45 +0,0 @@
package org.springframework.cloud.contract.stubrunner.spring.cloud.eureka;
import com.netflix.appinfo.InstanceInfo;
/**
* Taken from https://github.com/spencergibb/spring-cloud-netflix-eureka-lite
*
* @author Spencer Gibb
*
* @since 1.0.0
*/
public class Registration {
private final InstanceInfo instanceInfo;
private final ApplicationStatus applicationStatus;
public Registration(InstanceInfo instanceInfo, ApplicationStatus applicationStatus) {
this.instanceInfo = instanceInfo;
this.applicationStatus = applicationStatus;
}
public Registration(InstanceInfo instanceInfo, Application application) {
this(instanceInfo, new ApplicationStatus(application, InstanceInfo.InstanceStatus.UP));
}
public String getRegistrationKey() {
return this.applicationStatus.getApplication().getRegistrationKey();
}
public String getApplicationName() {
return this.applicationStatus.getApplication().getName();
}
public InstanceInfo getInstanceInfo() {
return this.instanceInfo;
}
public ApplicationStatus getApplicationStatus() {
return this.applicationStatus;
}
@Override public String toString() {
return "Registration{" + "instanceInfo=" + this.instanceInfo + ", applicationStatus="
+ this.applicationStatus + '}';
}
}

View File

@@ -18,14 +18,13 @@ package org.springframework.cloud.contract.stubrunner.spring.cloud.eureka;
import java.util.Map;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.discovery.EurekaClientConfig;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.cloud.contract.stubrunner.StubConfiguration;
import org.springframework.cloud.contract.stubrunner.StubRunning;
@@ -37,6 +36,7 @@ import org.springframework.cloud.netflix.eureka.CloudEurekaClient;
import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration;
import org.springframework.cloud.netflix.eureka.EurekaClientConfigBean;
import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean;
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -62,9 +62,12 @@ public class StubRunnerSpringCloudEurekaAutoConfiguration {
@Configuration
protected static class NonCloudConfig {
@Bean(initMethod = "registerStubs")
public StubsRegistrar stubsRegistrar(StubRunning stubRunning, Eureka eureka,
StubMapperProperties stubMapperProperties, InetUtils inetUtils, EurekaInstanceConfigBean eurekaInstanceConfigBean) {
return new EurekaStubsRegistrar(stubRunning, eureka, stubMapperProperties, inetUtils, eurekaInstanceConfigBean);
public StubsRegistrar stubsRegistrar(StubRunning stubRunning,
ServiceRegistry<EurekaRegistration> serviceRegistry, ApplicationContext context,
StubMapperProperties stubMapperProperties, InetUtils inetUtils,
EurekaInstanceConfigBean eurekaInstanceConfigBean, EurekaClientConfigBean eurekaClientConfigBean) {
return new EurekaStubsRegistrar(stubRunning, serviceRegistry, stubMapperProperties, inetUtils,
eurekaInstanceConfigBean, eurekaClientConfigBean, context);
}
}
@@ -77,9 +80,12 @@ public class StubRunnerSpringCloudEurekaAutoConfiguration {
@Autowired Environment environment;
@Bean(initMethod = "registerStubs")
public StubsRegistrar cloudStubsRegistrar(StubRunning stubRunning, Eureka eureka,
StubMapperProperties stubMapperProperties, InetUtils inetUtils, EurekaInstanceConfigBean eurekaInstanceConfigBean) {
return new EurekaStubsRegistrar(stubRunning, eureka, stubMapperProperties, inetUtils, eurekaInstanceConfigBean) {
public StubsRegistrar stubsRegistrar(StubRunning stubRunning,
ServiceRegistry<EurekaRegistration> serviceRegistry, ApplicationContext context,
StubMapperProperties stubMapperProperties, InetUtils inetUtils,
EurekaInstanceConfigBean eurekaInstanceConfigBean, EurekaClientConfigBean eurekaClientConfigBean) {
return new EurekaStubsRegistrar(stubRunning, serviceRegistry, stubMapperProperties, inetUtils,
eurekaInstanceConfigBean, eurekaClientConfigBean, context) {
@Override protected String hostName(Map.Entry<StubConfiguration, Integer> entry) {
String hostname =
CloudConfig.this.environment.getProperty("application.hostname") +
@@ -94,11 +100,4 @@ public class StubRunnerSpringCloudEurekaAutoConfiguration {
};
}
}
@Bean(name = "eurekaRegistrar")
public Eureka eureka(InetUtils inetUtils, ApplicationInfoManager manager,
EurekaClientConfig config, ApplicationContext applicationContext,
EurekaClientConfigBean eurekaClientConfigBean) {
return new Eureka(inetUtils, eurekaClientConfigBean, new CloudEurekaClient(manager, config, applicationContext));
}
}