本文主要研究下netflix的EurekaHttpClientjava
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/EurekaHttpClient.javagit
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(); }
能夠看到這個client接口定義了eureka server的一些low level rest api,其中包括register、cancel、sendHeartBeat、statusUpdate、getApplications等。
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/decorator/EurekaHttpClientDecorator.javagithub
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經過定義一個抽象方法execute(RequestExecutor<R> requestExecutor),來包裝EurekaHttpClient
繼承自EurekaHttpClientDecorator的類有以下幾個,都在com.netflix.discovery.shared.transport.decorator包裏頭
top level
)eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/EurekaHttpClientFactory.javaspring
/** * A top level factory to create http clients for application/eurekaClient use * * @author Tomasz Bak */ public interface EurekaHttpClientFactory { EurekaHttpClient newClient(); void shutdown(); }
這個是EurekaHttpClient的工廠高級別接口,定義了newClient()以及shutdown()方法
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/decorator/RetryableEurekaHttpClient.javaapi
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(); } }; }
建立的是通過RetryableEurekaHttpClient包裝的client
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/decorator/MetricsCollectingEurekaHttpClient.javaapp
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(); } }; }
建立的是通過MetricsCollectingEurekaHttpClient包裝的client
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/EurekaHttpClients.javaide
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(); } }; }
建立的是通過RedirectingEurekaHttpClient、RetryableEurekaHttpClient、SessionedEurekaHttpClient包裝以後的client
而原始的EurekaHttpClient則經過TransportClientFactory建立
low level
)eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/TransportClientFactory.javalua
/** * 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(); }
如註釋上所說,不建議高級別的消費者使用,是一個低級別的api
eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/jersey/JerseyEurekaHttpClientFactory.java.net
eureka-core-1.8.8-sources.jar!/com/netflix/eureka/transport/JerseyRemoteRegionClientFactory.javarest
spring-cloud-netflix-eureka-client-2.0.0.RC1-sources.jar!/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java
上面這三個是有專門的類實現,下面這幾個是匿名類實現
netflix的eureka關於httpClient的接口爲EurekaHttpClient,其工廠方法主要分類top level的EurekaHttpClientFactory以及low level的TransportClientFactory。