《重新定义Spring Cloud实战》——3.6.2 Eureka Server部分不可用
3.6.2 Eureka Server部分不可用
这里我们分Client端及Server端两个方面来阐述。
1. Client端
Client端有个定时任务('AsyncResolver.updateTask')去拉取serviceUrl的变更,如果配置文件有改动,运行时可以动态变更。拉取完之后,Client端会随机化Server的list。例如:
eureka:
client:
serviceUrl:
defaultZone: http://host1:8761/eureka/,http://host2:8762/eureka/,http://host3:8763/eureka/
第一次拉取的时候可能是按配置的顺序,如host1、host2、host3这样,之后定时任务更新会随机化一次,变为host2、host1、host3这样。
而Client端在请求Server的时候,维护了一个不可用的Eureka Server列表('quarantineSet,在Connection error或者5xx的情况下会被列入该列表,当该列表的大小超过指定阈值则会重新清空');对可用的Server列表('一般为拉取回来的Server列表剔除不可用的列表,如果剔除之后为空,则不会做剔除处理'),采用RetryableEurekaHttpClient进行请求,numberOfRetries为3。也就是说,如果Eureka Server有一台挂掉,则会被纳入不可用列表。那么这个时候获取的服务注册信息是来自健康的Eureka Server。
2. Server端
Eureka Server之间相互成为peer node,如果Eureka Server有一台挂了,则Eureka Server之间的replication会受影响。
PeerEurekaNodes有个定时任务(peersUpdateTask),会去从配置文件拉取availabilityZones及serviceUrl信息,然后在运行时更新peerEurekaNodes信息。如果在一台Eureka Server挂掉的时候,人工介入更改Eureka Server的serviceUrl信息,则可以主动剔除挂掉的peerNode。
如果未能及时剔除,则会报错:
2018-06-03 23:00:59.069 ERROR 4562 --- [get_localhost-3] c.n.e.cluster.ReplicationTaskProcessor : Network level connection to peer localhost; retrying after delay
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187) ~[jersey-apache-client4-1.19.1.jar:1.19.1]
at com.netflix.eureka.cluster.DynamicGZIPContentEncodingFilter.handle(DynamicGZIPContentEncodingFilter.java:48) ~[eureka-core-1.8.8.jar:1.8.8]
at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27) ~[eureka-client-1.8.8.jar:1.8.8]
at com.sun.jersey.api.client.Client.handle(Client.java:652) ~[jersey-client-1.19.1.jar:1.19.1]
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) ~[jersey-client-1.19.1.jar:1.19.1]
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) ~[jersey-client-1.19.1.jar:1.19.1]
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:570) ~[jersey-client-1.19.1.jar:1.19.1]
at com.netflix.eureka.transport.JerseyReplicationClient.submitBatchUpdates(JerseyReplicationClient.java:116) ~[eureka-core-1.8.8.jar:1.8.8]
at com.netflix.eureka.cluster.ReplicationTaskProcessor.process(ReplicationTaskProcessor.java:80) ~[eureka-core-1.8.8.jar:1.8.8]
at com.netflix.eureka.util.batcher.TaskExecutors$BatchWorkerRunnable.run(TaskExecutors.java:187) [eureka-core-1.8.8.jar:1.8.8]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_71]
Eureka Server目前没有对peerEurekaNodes进行健康检查,源码中可以看到eureka.server.peer-eureka-status-refresh-time-interval-ms配置,不过没看到使用的地方,推测这个配置是给后续对peer node进行健康检查用。
- 点赞
- 收藏
- 关注作者
评论(0)