sequence
This article mainly studies EurekaHttpClient of netflix
EurekaHttpClient
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/EurekaHttpClient.java
public interface EurekaHttpClient {
EurekaHttpResponse<Void> register(InstanceInfo info);
EurekaHttpResponse<Void> cancel(String appName, String id);
EurekaHttpResponse<InstanceInfo> sendHeartBeat(String appName, String id, InstanceInfo info, InstanceStatus overriddenStatus);
EurekaHttpResponse<Void> statusUpdate(String appName, String id, InstanceStatus newStatus, InstanceInfo info);
EurekaHttpResponse<Void> deleteStatusOverride(String appName, String id, InstanceInfo info);
EurekaHttpResponse<Applications> getApplications(String... regions);
EurekaHttpResponse<Applications> getDelta(String... regions);
EurekaHttpResponse<Applications> getVip(String vipAddress, String... regions);
EurekaHttpResponse<Applications> getSecureVip(String secureVipAddress, String... regions);
EurekaHttpResponse<Application> getApplication(String appName);
EurekaHttpResponse<InstanceInfo> getInstance(String appName, String id);
EurekaHttpResponse<InstanceInfo> getInstance(String id);
void shutdown();
}
You can see that this client interface defines some low level rest apis of eureka server, including register, cancel, sendHeartBeat, statusUpdate, getApplications, etc.
EurekaHttpClientDecorator
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/decorator/EurekaHttpClientDecorator.java
public abstract class EurekaHttpClientDecorator implements EurekaHttpClient {
public enum RequestType {
Register,
Cancel,
SendHeartBeat,
StatusUpdate,
DeleteStatusOverride,
GetApplications,
GetDelta,
GetVip,
GetSecureVip,
GetApplication,
GetInstance,
GetApplicationInstance
}
public interface RequestExecutor<R> {
EurekaHttpResponse<R> execute(EurekaHttpClient delegate);
RequestType getRequestType();
}
protected abstract <R> EurekaHttpResponse<R> execute(RequestExecutor<R> requestExecutor);
//......
}
EurekaHttpClientDecorator wraps EurekaHttpClient by defining an abstract method execute(RequestExecutor<R> requestExecutor)
Subclass of EurekaHttpClientDecorator
The classes inherited from EurekaHttpClientDecorator are as follows, all in the com.netflix.discovery.shared.transport.decorator package
- MetricsCollectingEurekaHttpClient
- RedirectingEurekaHttpClient
- RetryableEurekaHttpClient
- SessionedEurekaHttpClient
EurekaHttpClientFactory(top level
)
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/EurekaHttpClientFactory.java
/**
* A top level factory to create http clients for application/eurekaClient use
*
* @author Tomasz Bak
*/
public interface EurekaHttpClientFactory {
EurekaHttpClient newClient();
void shutdown();
}
This is the factory high-level interface of EurekaHttpClient, which defines newClient() and shutdown() methods
Implementation class of EurekaHttpClientFactory
- RetryableEurekaHttpClient eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/decorator/RetryableEurekaHttpClient.java
public static EurekaHttpClientFactory createFactory(final String name,
final EurekaTransportConfig transportConfig,
final ClusterResolver<EurekaEndpoint> clusterResolver,
final TransportClientFactory delegateFactory,
final ServerStatusEvaluator serverStatusEvaluator) {
return new EurekaHttpClientFactory() {
@Override
public EurekaHttpClient newClient() {
return new RetryableEurekaHttpClient(name, transportConfig, clusterResolver, delegateFactory,
serverStatusEvaluator, DEFAULT_NUMBER_OF_RETRIES);
}
@Override
public void shutdown() {
delegateFactory.shutdown();
}
};
}
Created is a client wrapped by RetryableEurekaHttpClient
- MetricsCollectingEurekaHttpClient eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/decorator/MetricsCollectingEurekaHttpClient.java
public static EurekaHttpClientFactory createFactory(final EurekaHttpClientFactory delegateFactory) {
final Map<RequestType, EurekaHttpClientRequestMetrics> metricsByRequestType = initializeMetrics();
final ExceptionsMetric exceptionMetrics = new ExceptionsMetric(EurekaClientNames.METRIC_TRANSPORT_PREFIX + "exceptions");
return new EurekaHttpClientFactory() {
@Override
public EurekaHttpClient newClient() {
return new MetricsCollectingEurekaHttpClient(
delegateFactory.newClient(),
metricsByRequestType,
exceptionMetrics,
false
);
}
@Override
public void shutdown() {
shutdownMetrics(metricsByRequestType);
exceptionMetrics.shutdown();
}
};
}
Created is a client wrapped by MetricsCollectingEurekaHttpClient
- EurekaHttpClients eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/EurekaHttpClients.java
static EurekaHttpClientFactory canonicalClientFactory(final String name,
final EurekaTransportConfig transportConfig,
final ClusterResolver<EurekaEndpoint> clusterResolver,
final TransportClientFactory transportClientFactory) {
return new EurekaHttpClientFactory() {
@Override
public EurekaHttpClient newClient() {
return new SessionedEurekaHttpClient(
name,
RetryableEurekaHttpClient.createFactory(
name,
transportConfig,
clusterResolver,
RedirectingEurekaHttpClient.createFactory(transportClientFactory),
ServerStatusEvaluators.legacyEvaluator()),
transportConfig.getSessionedClientReconnectIntervalSeconds() * 1000
);
}
@Override
public void shutdown() {
wrapClosable(clusterResolver).shutdown();
}
};
}
What is created is the client wrapped by RedirectingEurekaHttpClient, RetryableEurekaHttpClient, SessionedEurekaHttpClient and the original EurekaHttpClient is created by TransportClientFactory
TransportClientFactory(low level
)
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/TransportClientFactory.java
/**
* A low level client factory interface. Not advised to be used by top level consumers.
*
* @author David Liu
*/
public interface TransportClientFactory {
EurekaHttpClient newClient(EurekaEndpoint serviceUrl);
void shutdown();
}
As mentioned in the comments, it is not recommended for high-level consumers, it is a low-level api
TransportClientFactory implementation class
- JerseyEurekaHttpClientFactory eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/jersey/JerseyEurekaHttpClientFactory.java
- JerseyRemoteRegionClientFactory eureka-core-1.8.8-sources.jar!/com/netflix/eureka/transport/JerseyRemoteRegionClientFactory.java
- RestTemplateTransportClientFactory spring-cloud-netflix-eureka-client-2.0.0.RC1-sources.jar!/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java
The above three are implemented by special classes, and the following are implemented by anonymous classes
- RedirectingEurekaHttpClient
- EurekaServerHttpClients
- Jersey1TransportClientFactories
- MetricsCollectingEurekaHttpClient
summary
Netflix's eureka's interface for httpClient is EurekaHttpClient, and its factory methods are mainly classified into top level EurekaHttpClientFactory and low level TransportClientFactory.
- At the top level, a series of packaging is mainly carried out through the decorator mode. For example, EurekaHttpClients creates clients that are wrapped by RedirectingEurekaHttpClient, RetryableEurekaHttpClient, and SessionedEurekaHttpClient.
- In the case of low levle, it is mainly the implementation of the underlying http remote call, netflix provides the Jersey-based version, and spring cloud provides the RestTemplate-based version.