下面有几个疑问是我看源码时问自己的,先提出来,希望看这篇文章的人带着疑问去读,然后初步介绍下EurekaHttpClient体系,后面会详细讲RetryableEurekaHttpClient
1、Eureka Client如何向Eureka Server集群注册?如果我的Client端的ServiceUrl配置了多个Eureka Service地址,那么Client是否会向每一个Server发起注册?
2、Eureka Server具有复制行为,即向其他Eureka Server节点复制自身的实例信息,那么既然有复制行为,那么Eureka Client的ServiceUrl中只配置一个不就行了吗,我注册到Server上,Server自己去把我的信息复制为其他Eureka Server节点不就好了吗,是否就说明Eureka Client的ServiceUrl只配置一个就好?
3、如果Eureka Client的ServiceUrl配置了多个,那么Client会和那个Eureka Server保持通信(注册、续约心跳等)?是否是第一个,或者是随机的?
defaultZone: http://server3:50220/eureka,http://server1:50100/eureka,http://server2:50300/eureka
RetryableEurekaHttpClient继承自EurekaHttpClient装饰器EurekaHttpClientDecorator,它并不是真正发起http请求的HttpClient,它会间接的把请求委托给AbstractJerseyEurekaHttpClient,如下类图:
EurekaHttpClientDecorator这个类采用了模板方法模式,在register、cancel、sendHeartBeat等行为中,抽象出了execute方法,让子类自定义执行行为
//匿名接口,没有具体实现类
public interface RequestExecutor<R> {
EurekaHttpResponse<R> execute(EurekaHttpClient delegate);
RequestType getRequestType();
}
//采用模板方法设计模式,从register、cancel、sendHeartBeat等行为中抽象出execute行为,让子类自己去定义具体实现
protected abstract <R> EurekaHttpResponse<R> execute(RequestExecutor<R> requestExecutor);
下面只列出register方法
@Override
public EurekaHttpResponse<Void> register(final InstanceInfo info) {
//匿名接口的实现,调用子类的execute方法
return execute(new RequestExecu