博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聊聊netflix的EurekaHttpClient
阅读量:7009 次
发布时间:2019-06-28

本文共 7928 字,大约阅读时间需要 26 分钟。

本文主要研究下netflix的EurekaHttpClient

EurekaHttpClient

eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/EurekaHttpClient.java

public interface EurekaHttpClient {    EurekaHttpResponse
register(InstanceInfo info); EurekaHttpResponse
cancel(String appName, String id); EurekaHttpResponse
sendHeartBeat(String appName, String id, InstanceInfo info, InstanceStatus overriddenStatus); EurekaHttpResponse
statusUpdate(String appName, String id, InstanceStatus newStatus, InstanceInfo info); EurekaHttpResponse
deleteStatusOverride(String appName, String id, InstanceInfo info); EurekaHttpResponse
getApplications(String... regions); EurekaHttpResponse
getDelta(String... regions); EurekaHttpResponse
getVip(String vipAddress, String... regions); EurekaHttpResponse
getSecureVip(String secureVipAddress, String... regions); EurekaHttpResponse
getApplication(String appName); EurekaHttpResponse
getInstance(String appName, String id); EurekaHttpResponse
getInstance(String id); void shutdown();}复制代码

可以看到这个client接口定义了eureka server的一些low level rest api,其中包括register、cancel、sendHeartBeat、statusUpdate、getApplications等。

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
{ EurekaHttpResponse
execute(EurekaHttpClient delegate); RequestType getRequestType(); } protected abstract
EurekaHttpResponse
execute(RequestExecutor
requestExecutor); //......}复制代码

EurekaHttpClientDecorator通过定义一个抽象方法execute(RequestExecutor requestExecutor),来包装EurekaHttpClient

EurekaHttpClientDecorator的子类

继承自EurekaHttpClientDecorator的类有如下几个,都在com.netflix.discovery.shared.transport.decorator包里头

  • 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();}复制代码

这个是EurekaHttpClient的工厂高级别接口,定义了newClient()以及shutdown()方法

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
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

  • 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
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

  • 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
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创建

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();}复制代码

如注释上所说,不建议高级别的消费者使用,是一个低级别的api

TransportClientFactory实现类

  • 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

上面这三个是有专门的类实现,下面这几个是匿名类实现

  • RedirectingEurekaHttpClient
  • EurekaServerHttpClients
  • Jersey1TransportClientFactories
  • MetricsCollectingEurekaHttpClient

小结

netflix的eureka关于httpClient的接口为EurekaHttpClient,其工厂方法主要分类top level的EurekaHttpClientFactory以及low level的TransportClientFactory。

  • top level的话,主要是通过decorator模式进行一系列包装,像EurekaHttpClients创建的则是经过RedirectingEurekaHttpClient、RetryableEurekaHttpClient、SessionedEurekaHttpClient包装的client。
  • low levle的话,主要是底层的http远程调用的实现,netflix提供的是基于Jersey的版本,而spring cloud则提供了基于RestTemplate的版本。

doc

转载地址:http://mwxtl.baihongyu.com/

你可能感兴趣的文章
zabbix自动报警邮件正文变成附件问题解决
查看>>
豆瓣阿北:用户价值大于产品体验,通过产品做运营
查看>>
我的友情链接
查看>>
利用clonezilla克隆、还原CentOS整个系统
查看>>
解决127.0.0.1 localhost 劫持问题
查看>>
winscp连接虚拟机Linux被拒绝的问题解决方案
查看>>
教程-Delphi设置功能表
查看>>
Java中的多线程,线程池
查看>>
软件下载站
查看>>
Zend Studio 12 生成 WSDL
查看>>
JAVA学习心得
查看>>
【夯实Mysql基础】记一次mysql语句的优化过程
查看>>
VBPR: Visual Bayesian Personalized Ranking from Implicit Feedback-AAAI2016 -20160422
查看>>
servlet injection analysis
查看>>
(原)centos7安装和使用greenplum4.3.12(详细版)
查看>>
Hive之 hive与hadoop的联系
查看>>
java中的==、equals()、hashCode()源码分析
查看>>
HDU 3613 Best Reward 正反两次扩展KMP
查看>>
zepto.js 源码解析
查看>>
HTTP状态码大全
查看>>