为了方便说明,就把上篇博客的图再贴一遍了。

上篇说道Application Service向Eureka Server注册服务的过程,在完成注册之后,由于Eureka Server是对等集群,其他Server也需要同步这一注册信息。与zookeeper相比,Eureka并不追求很强的一致性,而是认为A(可用性)和P(分区容错性)更重要。

基于此,Eureka采用复制的方式进行注册信息的同步。

1、在完成注册方法之后,进行复制。

PeerAwareInstanceRegistryImpl类

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

2、具体的复制步骤

  1. 复制方法,复制eureka的所有action操作除了流量。
  2. private void replicateToPeers(Action action, String appName, String id,
  3. InstanceInfo info /* optional */,
  4. InstanceStatus newStatus /* optional */, boolean isReplication) {
  5. Stopwatch tracer = action.getTimer().start();
  6. try {
  7. if (isReplication) {
  8. numberOfReplicationsLastMin.increment();
  9. }
  10. // 如果已经复制过,就不再复制
  11. if (peerEurekaNodes == Collections.EMPTY_LIST || isReplication) {
  12. return;
  13. }
  14. //遍历eureka集群中的所有节点,进行复制操作
  15. for (final PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {
  16. // If the url represents this host, do not replicate to yourself.
  17. if (peerEurekaNodes.isThisMyUrl(node.getServiceUrl())) {
  18. continue;
  19. }
  20. replicateInstanceActionsToPeers(action, appName, id, info, newStatus, node);
  21. }
  22. } finally {
  23. tracer.stop();
  24. }
  25. }

Tips:

Eureka Server的复制不会进行第二次,可以参考上面的代码。

判断isReplication的值,如果复制过,则不再复制。如果没有复制过,遍历集群中的node节点个数(即Eureka Server集群),依次进行复制操作。

具体的复制action,包括取消、注册、心跳、状态更新等。

  1. private void replicateInstanceActionsToPeers(Action action, String appName, String id, InstanceInfo info, InstanceStatus newStatus,
  2. PeerEurekaNode node) {
  3. try {
  4. InstanceInfo infoFromRegistry = null;
  5. CurrentRequestVersion.set(Version.V2);
  6. switch (action) {
  7. case Cancel:
  8. node.cancel(appName, id);
  9. break;
  10. case Heartbeat:
  11. InstanceStatus overriddenStatus = overriddenInstanceStatusMap.get(id);
  12. infoFromRegistry = getInstanceByAppAndId(appName, id, false);
  13. node.heartbeat(appName, id, infoFromRegistry, overriddenStatus, false);
  14. break;
  15. case Register:
  16. node.register(info);
  17. break;
  18. case StatusUpdate:
  19. infoFromRegistry = getInstanceByAppAndId(appName, id, false);
  20. node.statusUpdate(appName, id, newStatus, infoFromRegistry);
  21. break;
  22. case DeleteStatusOverride:
  23. infoFromRegistry = getInstanceByAppAndId(appName, id, false);
  24. node.deleteStatusOverride(appName, id, infoFromRegistry);
  25. break;
  26. }
  27. } catch (Throwable t) {
  28. logger.error("Cannot replicate information to {} for action {}", node.getServiceUrl(), action.name(), t);
  29. }
  30. }

思考:

         peerEurekaNodes如何获取集群中的所有node节点?

首先,在PeerAwareInstanceRegistryImpl类中的init方法中找到了peerEurekaNodes的赋值。

  1. public void init(PeerEurekaNodes peerEurekaNodes) throws Exception {
  2. this.numberOfReplicationsLastMin.start();
  3. this.peerEurekaNodes = peerEurekaNodes;
  4. initializedResponseCache();
  5. scheduleRenewalThresholdUpdateTask();
  6. initRemoteRegionRegistry();
  7.  
  8. try {
  9. Monitors.registerObject(this);
  10. } catch (Throwable e) {
  11. logger.warn("Cannot register the JMX monitor for the InstanceRegistry :", e);
  12. }
  13. }

在其父类中AwsInstanceRegistry也有其实现。

  1. public void init(PeerEurekaNodes peerEurekaNodes) throws Exception {
  2. super.init(peerEurekaNodes);
  3. this.awsAsgUtil = new AwsAsgUtil(serverConfig, clientConfig, this);
  4. // We first check if the instance is STARTING or DOWN, then we check explicit overrides,
  5. // then we see if our ASG is UP, then we check the status of a potentially existing lease.
  6. this.instanceStatusOverrideRule = new FirstMatchWinsCompositeRule(new DownOrStartingRule(),
  7. new OverrideExistsRule(overriddenInstanceStatusMap), new AsgEnabledRule(this.awsAsgUtil),
  8. new LeaseExistsRule());
  9. }

继续往上找,DefaultEurekaServerContext类中,

  1. @PostConstruct
  2. @Override
  3. public void initialize() throws Exception {
  4. logger.info("Initializing ...");
  5. peerEurekaNodes.start();
  6. registry.init(peerEurekaNodes);
  7. logger.info("Initialized");
  8. }

最后,EurekaBootStrap中进行了调用。

  1. protected void initEurekaServerContext() throws Exception {
  2.  
  3. //省略配置信息
  4. logger.info("Initializing the eureka client...");
  5.  
  6. //创建node组
  7. PeerEurekaNodes peerEurekaNodes = new PeerEurekaNodes(
  8. registry,
  9. eurekaServerConfig,
  10. eurekaClientConfig,
  11. serverCodecs,
  12. applicationInfoManager
  13. );
  14.  
  15. serverContext = new DefaultEurekaServerContext(
  16. eurekaServerConfig,
  17. serverCodecs,
  18. registry,
  19. peerEurekaNodes,
  20. applicationInfoManager
  21. );
  22.  
  23. EurekaServerContextHolder.initialize(serverContext);
  24.  
  25. serverContext.initialize();
  26. logger.info("Initialized server context");
  27.  
  28. // Copy registry from neighboring eureka node
  29. int registryCount = registry.syncUp();
  30. registry.openForTraffic(applicationInfoManager, registryCount);
  31.  
  32. // Register all monitoring statistics.
  33. EurekaMonitors.registerAllStats();
  34. }

Eureka Server Replicate的更多相关文章

  1. 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)

    目录 一.Spring Cloud Eureka Server自动配置及初始化 @EnableEurekaServer EurekaServerAutoConfiguration - 注册服务自动配置 ...

  2. Spring Cloud Eureka(六):Eureka Client 如何注册到Eureka Server

    1.本节概要 根据前文我们对Eureka Server 有了一定的了解,本节我们主要学习Eureka Client 与 Eureka Server 如何通讯的及相关通信机制是什么,本文会弄清楚一下几个 ...

  3. Eureka 源码分析之 Eureka Server

    文章首发于公众号<程序员果果> 地址 : https://mp.weixin.qq.com/s/FfJrAGQuHyVrsedtbr0Ihw 简介 上一篇文章<Eureka 源码分析 ...

  4. Spring Cloud Eureka Server集群Demo级搭建

    将上篇随笔Spring Cloud Eureka服务Demo级搭建进行改造,改造成一个在本机的伪集群 1.修改hosts文件(windows10 hosts文件位置:C:\Windows\System ...

  5. (2-2)SpringCloud-服务注册到Eureka Server集群并消费

    服务注册到Eureka Server集群 在(2-1)SpringCloue-Eureka实现高可用注册中心中我们搭建好了高可用的Eureka注册中心,下面我们要把服务注册到Eureka Server ...

  6. Spring Cloud Eureka Server高可用注册服务中心的配置

    前言 Eureka 作为一个云端负载均衡,本身是一个基于REST的服务,在 Spring Cloud 中用于发现和注册服务. 那么当成千上万个微服务注册到Eureka Server中的时候,Eurek ...

  7. SpringCloud(2) 服务注册和发现Eureka Server

    一.简介 EureKa在Spring Cloud全家桶中担任着服务的注册与发现的落地实现.Netflix在设计EureKa时遵循着AP原则,它基于REST的服务,用于定位服务,以实现云端中间层服务发现 ...

  8. springboot中关闭eureka server中已注册服务列表自我保护配置

    配置集群服务可以向eureka通知应用是否可以使用a.在eureka server的application.properties中加入:# 设为false,关闭自我保护eureka.server.en ...

  9. sprigcloud Eureka Server环境搭建

    1.搭建springcloud的Erueka组件,现在搭建这些套件已经变的很方便了,进入https://start.spring.io/页面,如下图: 2.选择好Eureka Server,点击Gen ...

随机推荐

  1. Linux系统下连接校园网Drcom客户端教程(广东工业大学)

    这篇教程写给想要学习Linux系统或者在Linux系统下有需要使用Drcom上网的同学,在我疯狂踩坑,经过n多次的刷机装机实验,体验不同发行版本的linux系统后,终于懂得怎么连接上drcom,想想连 ...

  2. FPGA千兆网UDP协议实现

    接着上一篇百兆网接口的设计与使用,我们接着来进行FPGA百兆网UDP(User Datagram Protocol)协议的设计. 1)UDP简介 在此,参考博主夜雨翛然的博文“https://www. ...

  3. 20155217 实验二 Java面向对象程序设计 实验报告

    20155217 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...

  4. 20155322 2016-2017-2 《Java面向对象程序设计》第十二周课堂练习之Arrays和String单元测试

    20155322 2016-2017-2 <Java面向对象程序设计>第十二周课堂练习之Arrays和String单元测试 练习目地 在IDEA中以TDD的方式对String类和Array ...

  5. 20155333 2016-2017-2 《Java程序设计》第十周学习总结

    20155333 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络概览 两台计算机用于通信的语言叫做"协议".我们只需关心应用层中的协 ...

  6. [2016北京集训试题7]thr-[树形dp+树链剖分+启发式合并]

    Description Solution 神仙操作orz. 首先看数据范围,显然不可能是O(n2)的.(即绝对不是枚举那么简单的),我们考虑dp. 定义f(x,k)为以x为根的子树中与x距离为k的节点 ...

  7. LNMP的安装--详细版

    一.软件概述 [root@webserver ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@webserver ~]# u ...

  8. AngularJS中Directive指令系列

    近段时间在研究Angular中的directive用法,打算写个系列.以官方文档为主.并参考诸多教程.加上自己的思考. 基本概念及用法 scope属性的使用.  &, <, =, @ 符 ...

  9. equals和==方法比较(一)

    问题描述 今天在使用spotbugs代码走查时发现这样一个问题,两个Long类型的变量使用==判断数值是否相等,spotbugs提示这是一个很致命的错误,代码大概如下, Long l1=123l; L ...

  10. Android开发笔记——视频录制播放常见问题

    本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程 以微信为例,其录制触发为按下(住) ...