《重新定义Spring Cloud实战》——3.6.2 Eureka Server部分不可用

举报
华章计算机 发表于 2019/06/04 15:27:08 2019/06/04
【摘要】 本书摘自《重新定义Spring Cloud实战》——书中第3章,第3.6.2节,作者是许进、叶志远、钟尊发、蔡波斯、方志朋、郭芳碧、朱德明。

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进行健康检查用。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200