只需要增加Eurke服务器注册URL:
## Eureka Server 服务 URL,用于客户端注册
eureka.client.serviceUrl.defaultZone=http://localhost:9090/eureka,http://localhost:9091/eureka
如果Eureka客户端应用配置了多个Eureka注册服务器,那么默认情况只有第一台可用的服务器,存在注册信息。
如果第一台可用的Eureka服务器Down掉了,那么Eureka客户端应用将会选择下一台可用的Eureka服务器。
配置项eureka.client.serviceUrl实际映射的字段为serviceUrl,它是Map类型,Key为自定义,默认值“defaultZone”,value是需要配置的Eureka注册服务器URL。
private Map serviceUrl = new HashMap<>();
{
this.serviceUrl.put(DEFAULT_ZONE, DEFAULT_URL);
}
value可以是多值字段,通过“,”分割:
public List getEurekaServerServiceUrls(String myZone) {
String serviceUrls = this.serviceUrl.get(myZone);
if (serviceUrls == null || serviceUrls.isEmpty()) {
serviceUrls = this.serviceUrl.get(DEFAULT_ZONE);
}
if (!StringUtils.isEmpty(serviceUrls)) {
final String[] serviceUrlsSplit = StringUtils
.commaDelimitedListToStringArray(serviceUrls); //“,”分割
List eurekaServiceUrls = new ArrayList<>(serviceUrlsSplit.length);
for (String eurekaServiceUrl : serviceUrlsSplit) {
if (!endsWithSlash(eurekaServiceUrl)) {
eurekaServiceUrl += "/";
}
eurekaServiceUrls.add(eurekaServiceUrl.trim());
}
return eurekaServiceUrls;
}
return new ArrayList<>();
}
Eureka 客户端需要获取Eureka服务器注册信息,方便服务调用。
Eureka客户端:EurekaClient,关联应用集合:Applications
单个应用信息:Application,关联过个应用实例
单个应用实例:InstanceInfo
当Eureka客户端需要调用具体某个服务时,比如user-service-consumer调用user-service-provider,user-service-provider实际应用对象时Application,关联了许多应用实例(InstanceInfo)。
如果应用user-service-provider的应用实例发生变化时,那么user-service-consumer是需要感知的。比如user-service-provider服务器从10台降到了5台,那么,作为调用方的user-service-consumer需要知道这个变化情况。可是这个变化过程,可能存在一定的延迟,可以通过调整注册信息时间间隔来减少错误。
注:user-service-consumer服务调用者,user-service-provider服务提供者
具体配置项
##调整注册信息的获取周期,默认值:30秒
eureka.client.registry-fetch-interval-seconds=5
就是客户端信息上报到Eureka服务器的时间。当Eureka客户端应用上报的频率越频繁,那么Eureka服务器的应用状态管理一致性就越高。
具体配置项
##调整客户端应用状态上报的周期
eureka.client.instance-info-replication-interval-seconds= 5
Eureka的应用信息获取方式:拉模式
Eureka的应用信息上报的方式:推模式
从Eureka Server Dashboard里面可以看到具体某个应用中的实例信息,比如:
UP (2) - 192.168.1.103:user-service-provider:7077 , 192.168.1.103:user-service-provider:7070
其中,它们的命名模式:
${hostname}:${spring.application.name}:${server.port}
配置项
##Eureka 客户端应用实例的ID
eureka.instance.instance-id=${spring.application.name}:${server.port}
源码位置:EurekaInstanceConfigBean
private String actuatorPrefix = "/actuator";
private String statusPageUrlPath = actuatorPrefix + "/info";
配置项
## Eureka 客户端应用实例状态URL
eureka.instance.status-page-url-path=/actuator/health
Eureka Server1 -> Proflie:peer1
配置项
spring.application.name=eureka-server
server.port=9090
##取消服务器自我注册
eureka.client.register-with-eureka=true
##不需要检索服务
eureka.client.fetch-registry=true
## Eureka Service 服务URL,用于客户端注册
eureka.client.serviceUrl.defaultZone=http://localhost:9091/eureka
Eureka Server1 -> Proflie:peer2
配置项
spring.application.name=eureka-server
server.port=9091
##取消服务器自我注册
eureka.client.register-with-eureka=true
##不需要检索服务
eureka.client.fetch-registry=true
## Eureka Service 服务URL,用于客户端注册
eureka.client.serviceUrl.defaultZone=http://localhost:9090/eureka
通过 --spring.profiles.active=peer1 和 --spring.profiles.active=peer2 分别激活 Eureka Server1 和 Eureka Server2
Eureka Server1 里面的replicas信息:
registered-replicas | http://localhost:9091/eureka/ |
Eureka Server2 里面的replicas信息:
registered-replicas | http://localhost:9090/eureka/ |
自定义实现
编码问题
切换序列化/反序列化的协议
举例说明
RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory()); //HTTP Client
切换HTTP通讯实现,提升性能
加深RestTemplate拦截过程
RestTemplate增加一个LoadBalancerInterceptor,调用Netfilx中的LoadBalander实现,根据Eureka客户端应用获取目标应用IP+Port信息,轮询的方式调用。
核心规则接口
IRule
核心策略接口
IPingStrategy
IPing
NIWSDiscoveryPing