eureka如何构建高可用的Eureka集群?

1 个回答

  • java小王子
    遇见错的人会消耗你,遇见对的人会治愈你。
    首先,搭建一个高可用的Eureka集群,只需要在每个注册中心(服务端)通过配置: ``` eureka.client.service-url.defaultZone ``` 指定其他服务端的地址,多个使用逗号隔开,如: ``` eureka.client.service-url.defaultZone=http://localhost:10000/eureka/,http://localhost:10001/eureka/,http://localhost:10002/eureka/ ``` 在eureka的高可用状态下,这些注册中心是对等的,他们会互相将注册在自己的实例同步给其他的注册中心,同样是通过问题1的方式将注册在自己上的实例注册到其他注册中心去。 那么问题来了,一旦 其中一个eureka收到一个客户端注册实例时,既然eureka注册中心将注册在自己的实例同步到其他注册中心中的方式和客户端注册的方式相同,那么在接收的eureka注册中心一端,会不会再同步回给注册中心(或者其他注册中心),从而导致死循环。 ### 1、源码解析 我们回到2.1节的PeerAwareInstanceRegistryImpl类的register方法,在该方法中的最后一行: ```java replicateToPeers(Action.Register, info.getAppName(), info.getId(), info, null, isReplication); ``` replicateToPeers方法字面意思是同步或者复制到同事(即其他对等的注册中心),最后一个参数为isReplication,是一个boolean值,表示是否同步(复制),如果是客户端注册的,那么为false,如果是其他注册中心同步的则为true,replicateToPeers方法中,如果isReplication=false时,将会发起同步(第19行): ```JAVA private void replicateToPeers(Action action, String appName, String id, InstanceInfo info /* optional */, InstanceStatus newStatus /* optional */, boolean isReplication) { Stopwatch tracer = action.getTimer().start(); try { if (isReplication) { numberOfReplicationsLastMin.increment(); } // If it is a replication already, do not replicate again as this will create a poison replication if (peerEurekaNodes == Collections.EMPTY_LIST || isReplication) { return; } for (final PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) { // If the url represents this host, do not replicate to yourself. if (peerEurekaNodes.isThisMyUrl(node.getServiceUrl())) { continue; } replicateInstanceActionsToPeers(action, appName, id, info, newStatus, node); } } finally { tracer.stop(); } } ``` ### 2、总结 搭建高可用的Eureka集群,只需要在注册中心的配置文件中配置其他注册中心的地址,配置属性如下: ``` eureka.client.service-url.defaultZone ``` 注册中心收到注册信息后会判断是否是其他注册中心同步的信息还是客户端注册的信息,如果是客户端注册的信息,那么他将会将该客户端信息同步到其他注册中心去;否则收到信息后不作任何操作。通过此机制避免集群中信息同步的死循环。
    编辑于 2022-03-11 20:59 •IP属地 青海
    举报
    评论
    收藏