下面分析下Eureka Server的集群同步,先看关键代码

    1. registry.register(info, "true".equals(isReplication));

    其中关键字段 isReplication表示是否来自于集群同步
    假如现在有3个Eureka server集群,3个user集群服务,3个product集群服务。
    当user服务启动时向其中某个Eureka Server注册时,注册完毕后会将同步注册信息给其他的Eureka Server,为了防止产生死循环(也即第二个服务收到注册信息后又重复发给第一个服务器),即引入了isReplication字段。
    当User服务向Eureka Server注册时,isReplication为null,而服务器同步时isReplication为true。

    1. public void register(final InstanceInfo info, final boolean isReplication) {
    2. int leaseDuration = Lease.DEFAULT_DURATION_IN_SECS;
    3. if (info.getLeaseInfo() != null && info.getLeaseInfo().getDurationInSecs() > 0) {
    4. leaseDuration = info.getLeaseInfo().getDurationInSecs();
    5. }
    6. super.register(info, leaseDuration, isReplication);
    7. replicateToPeers(Action.Register, info.getAppName(), info.getId(), info, null, isReplication);
    8. }

    集群同步

    1. private void replicateToPeers(Action action, String appName, String id,
    2. InstanceInfo info /* optional */,
    3. InstanceStatus newStatus /* optional */, boolean isReplication) {
    4. Stopwatch tracer = action.getTimer().start();
    5. try {
    6. if (isReplication) {
    7. numberOfReplicationsLastMin.increment();
    8. }
    9. // If it is a replication already, do not replicate again as this will create a poison replication
    10. // isReplication 如果为true则直接返回,不用同步
    11. if (peerEurekaNodes == Collections.EMPTY_LIST || isReplication) {
    12. return;
    13. }
    14. for (final PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {
    15. // If the url represents this host, do not replicate to yourself.
    16. if (peerEurekaNodes.isThisMyUrl(node.getServiceUrl())) {
    17. // 如果没有集群也跳过同步,这种情况是没有Eureka Server集群
    18. continue;
    19. }
    20. // 同步注册信息给其他服务器
    21. replicateInstanceActionsToPeers(action, appName, id, info, newStatus, node);
    22. }
    23. } finally {
    24. tracer.stop();
    25. }
    26. }

    其中关键字段 isReplication表示是否来自于集群同步
    假如现在有3个Eureka server集群,3个user集群服务,3个product集群服务。
    当user服务启动时向其中某个Eureka Server注册时,注册完毕后会将同步注册信息给其他的Eureka Server,为了防止产生死循环(也即第二个服务收到注册信息后又重复发给第一个服务器),即引入了isReplication字段。
    当User服务向Eureka Server注册时,isReplication为null,而服务器同步时isReplication为true。

    1. public void register(final InstanceInfo info, final boolean isReplication) {
    2. int leaseDuration = Lease.DEFAULT_DURATION_IN_SECS;
    3. if (info.getLeaseInfo() != null && info.getLeaseInfo().getDurationInSecs() > 0) {
    4. leaseDuration = info.getLeaseInfo().getDurationInSecs();
    5. }
    6. super.register(info, leaseDuration, isReplication);
    7. replicateToPeers(Action.Register, info.getAppName(), info.getId(), info, null, isReplication);
    8. }

    集群同步

    1. private void replicateToPeers(Action action, String appName, String id,
    2. InstanceInfo info /* optional */,
    3. InstanceStatus newStatus /* optional */, boolean isReplication) {
    4. Stopwatch tracer = action.getTimer().start();
    5. try {
    6. if (isReplication) {
    7. numberOfReplicationsLastMin.increment();
    8. }
    9. // If it is a replication already, do not replicate again as this will create a poison replication
    10. // isReplication 如果为true则直接返回,不用同步
    11. if (peerEurekaNodes == Collections.EMPTY_LIST || isReplication) {
    12. return;
    13. }
    14. for (final PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {
    15. // If the url represents this host, do not replicate to yourself.
    16. if (peerEurekaNodes.isThisMyUrl(node.getServiceUrl())) {
    17. // 如果没有集群也跳过同步,这种情况是没有Eureka Server集群
    18. continue;
    19. }
    20. // 同步注册信息给其他服务器
    21. replicateInstanceActionsToPeers(action, appName, id, info, newStatus, node);
    22. }
    23. } finally {
    24. tracer.stop();
    25. }
    26. }

    两种情况是不用同步

    • isReplication为true,即来自集群间同步请求
    • 只有一个单一的Eureka Server服务器