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

上篇说道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. Oracle——系统数据字典常用命令(查看表所属空间层目录等)

    发生背景: 项目前后台交互对接时候,经常存在对底层表蒙圈情况尤其是oracle数据库,所在层级不同会导致操作对象直接的改变,从而发生意向不到的事情:很多时候需要了解我们所操作对象所处的层级等相关信息, ...

  2. 编译Libuv

    Libuv https://github.com/libuv/libuv LibSourcey是基于libuv,集合了第三方用于视频流的开源库,使用C++11. 下载最新 https://dist.l ...

  3. dns欺骗之ettercap

    ettercap是一个基于ARP地址欺骗方式的网络嗅探工具,主要适用于局域网. ettercap是一款现有流行的网络抓包软件,它利用计算机在局域网内进行通信的ARP协议的缺陷进行攻击,在目标与服务器之 ...

  4. sqlserver之on与where条件

    在进行两个表乃至多个表进行联接时需要on条件进行匹配,很多时候我们会对过滤条件放在on还是where中心存疑惑.一般来讲,在外联接中on是两个表进行关联的匹配条件,在该条件匹配下会生成一个虚拟表. 如 ...

  5. Noip 2016 Day 1 & Day 2

    Day 1 >>> T1 >> 水题直接模拟AC: 考察三个知识点:1.你能不能编程 2.你会不会取模 3.你脑子抽不抽 然而第一次评测还是90,因为当模运算时 “ en ...

  6. 【EXCEL】簡単に重複探し

    下記のような表があって.重複があるかどうか探すのが大変と思いますが. 簡単に重複探す方法を紹介します. Step1.重複を探す(例えこちらでは項目)を選択します. Step2.メニューで 条件付き書式 ...

  7. 20155233 实验一 Java开发环境的熟悉(Linux + IDEA)

    20155233 实验一 Java开发环境的熟悉(Linux + IDEA) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA编辑.编译.运行.调试Java程序. 实验步骤 ( ...

  8. aspnetcore 2.1 发布到树莓派3linux的艰辛路程

    发布至docker for windows. 提示: image operating system "windows" cannot be used on this platfor ...

  9. underscore.js 分析 第四天

    查看underscore包含多少属性和方法 通过阅读JavaScript 获取对象的键的数组 var a = _; var arr = Object.keys(a); console.log(arr) ...

  10. dsp6657的helloworld例程测试-第二篇-CFG文件

    1. 上一篇疑问,int StackTest()这个函数是怎么运行的,后来在.cfg文件找到了答案,.cfg包含丰富的信息,对于用惯C语言的,确实不太习惯 var Memory = xdc.useMo ...