Eureka Server Replicate
为了方便说明,就把上篇博客的图再贴一遍了。
上篇说道Application Service向Eureka Server注册服务的过程,在完成注册之后,由于Eureka Server是对等集群,其他Server也需要同步这一注册信息。与zookeeper相比,Eureka并不追求很强的一致性,而是认为A(可用性)和P(分区容错性)更重要。
基于此,Eureka采用复制的方式进行注册信息的同步。
1、在完成注册方法之后,进行复制。
PeerAwareInstanceRegistryImpl类
- public void register(final InstanceInfo info, final boolean isReplication) { int leaseDuration = Lease.DEFAULT_DURATION_IN_SECS;
- if (info.getLeaseInfo() != null && info.getLeaseInfo().getDurationInSecs() > 0) {
- leaseDuration = info.getLeaseInfo().getDurationInSecs();
- }
- super.register(info, leaseDuration, isReplication);
- replicateToPeers(Action.Register, info.getAppName(), info.getId(), info, null, isReplication);
- }
2、具体的复制步骤
- 复制方法,复制eureka的所有action操作除了流量。
- 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 (peerEurekaNodes == Collections.EMPTY_LIST || isReplication) {
- return;
- }
- //遍历eureka集群中的所有节点,进行复制操作
- 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();
- }
- }
Tips:
Eureka Server的复制不会进行第二次,可以参考上面的代码。
判断isReplication的值,如果复制过,则不再复制。如果没有复制过,遍历集群中的node节点个数(即Eureka Server集群),依次进行复制操作。
具体的复制action,包括取消、注册、心跳、状态更新等。
- private void replicateInstanceActionsToPeers(Action action, String appName, String id, InstanceInfo info, InstanceStatus newStatus,
- PeerEurekaNode node) {
- try {
- InstanceInfo infoFromRegistry = null;
- CurrentRequestVersion.set(Version.V2);
- switch (action) {
- case Cancel:
- node.cancel(appName, id);
- break;
- case Heartbeat:
- InstanceStatus overriddenStatus = overriddenInstanceStatusMap.get(id);
- infoFromRegistry = getInstanceByAppAndId(appName, id, false);
- node.heartbeat(appName, id, infoFromRegistry, overriddenStatus, false);
- break;
- case Register:
- node.register(info);
- break;
- case StatusUpdate:
- infoFromRegistry = getInstanceByAppAndId(appName, id, false);
- node.statusUpdate(appName, id, newStatus, infoFromRegistry);
- break;
- case DeleteStatusOverride:
- infoFromRegistry = getInstanceByAppAndId(appName, id, false);
- node.deleteStatusOverride(appName, id, infoFromRegistry);
- break;
- }
- } catch (Throwable t) {
- logger.error("Cannot replicate information to {} for action {}", node.getServiceUrl(), action.name(), t);
- }
- }
思考:
peerEurekaNodes如何获取集群中的所有node节点?
首先,在PeerAwareInstanceRegistryImpl类中的init方法中找到了peerEurekaNodes的赋值。
- public void init(PeerEurekaNodes peerEurekaNodes) throws Exception {
- this.numberOfReplicationsLastMin.start();
- this.peerEurekaNodes = peerEurekaNodes;
- initializedResponseCache();
- scheduleRenewalThresholdUpdateTask();
- initRemoteRegionRegistry();
- try {
- Monitors.registerObject(this);
- } catch (Throwable e) {
- logger.warn("Cannot register the JMX monitor for the InstanceRegistry :", e);
- }
- }
在其父类中AwsInstanceRegistry也有其实现。
- public void init(PeerEurekaNodes peerEurekaNodes) throws Exception {
- super.init(peerEurekaNodes);
- this.awsAsgUtil = new AwsAsgUtil(serverConfig, clientConfig, this);
- // We first check if the instance is STARTING or DOWN, then we check explicit overrides,
- // then we see if our ASG is UP, then we check the status of a potentially existing lease.
- this.instanceStatusOverrideRule = new FirstMatchWinsCompositeRule(new DownOrStartingRule(),
- new OverrideExistsRule(overriddenInstanceStatusMap), new AsgEnabledRule(this.awsAsgUtil),
- new LeaseExistsRule());
- }
继续往上找,DefaultEurekaServerContext类中,
- @PostConstruct
- @Override
- public void initialize() throws Exception {
- logger.info("Initializing ...");
- peerEurekaNodes.start();
- registry.init(peerEurekaNodes);
- logger.info("Initialized");
- }
最后,EurekaBootStrap中进行了调用。
- protected void initEurekaServerContext() throws Exception {
- //省略配置信息
- logger.info("Initializing the eureka client...");
- //创建node组
- PeerEurekaNodes peerEurekaNodes = new PeerEurekaNodes(
- registry,
- eurekaServerConfig,
- eurekaClientConfig,
- serverCodecs,
- applicationInfoManager
- );
- serverContext = new DefaultEurekaServerContext(
- eurekaServerConfig,
- serverCodecs,
- registry,
- peerEurekaNodes,
- applicationInfoManager
- );
- EurekaServerContextHolder.initialize(serverContext);
- serverContext.initialize();
- logger.info("Initialized server context");
- // Copy registry from neighboring eureka node
- int registryCount = registry.syncUp();
- registry.openForTraffic(applicationInfoManager, registryCount);
- // Register all monitoring statistics.
- EurekaMonitors.registerAllStats();
- }
Eureka Server Replicate的更多相关文章
- 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)
目录 一.Spring Cloud Eureka Server自动配置及初始化 @EnableEurekaServer EurekaServerAutoConfiguration - 注册服务自动配置 ...
- Spring Cloud Eureka(六):Eureka Client 如何注册到Eureka Server
1.本节概要 根据前文我们对Eureka Server 有了一定的了解,本节我们主要学习Eureka Client 与 Eureka Server 如何通讯的及相关通信机制是什么,本文会弄清楚一下几个 ...
- Eureka 源码分析之 Eureka Server
文章首发于公众号<程序员果果> 地址 : https://mp.weixin.qq.com/s/FfJrAGQuHyVrsedtbr0Ihw 简介 上一篇文章<Eureka 源码分析 ...
- Spring Cloud Eureka Server集群Demo级搭建
将上篇随笔Spring Cloud Eureka服务Demo级搭建进行改造,改造成一个在本机的伪集群 1.修改hosts文件(windows10 hosts文件位置:C:\Windows\System ...
- (2-2)SpringCloud-服务注册到Eureka Server集群并消费
服务注册到Eureka Server集群 在(2-1)SpringCloue-Eureka实现高可用注册中心中我们搭建好了高可用的Eureka注册中心,下面我们要把服务注册到Eureka Server ...
- Spring Cloud Eureka Server高可用注册服务中心的配置
前言 Eureka 作为一个云端负载均衡,本身是一个基于REST的服务,在 Spring Cloud 中用于发现和注册服务. 那么当成千上万个微服务注册到Eureka Server中的时候,Eurek ...
- SpringCloud(2) 服务注册和发现Eureka Server
一.简介 EureKa在Spring Cloud全家桶中担任着服务的注册与发现的落地实现.Netflix在设计EureKa时遵循着AP原则,它基于REST的服务,用于定位服务,以实现云端中间层服务发现 ...
- springboot中关闭eureka server中已注册服务列表自我保护配置
配置集群服务可以向eureka通知应用是否可以使用a.在eureka server的application.properties中加入:# 设为false,关闭自我保护eureka.server.en ...
- sprigcloud Eureka Server环境搭建
1.搭建springcloud的Erueka组件,现在搭建这些套件已经变的很方便了,进入https://start.spring.io/页面,如下图: 2.选择好Eureka Server,点击Gen ...
随机推荐
- Oracle——系统数据字典常用命令(查看表所属空间层目录等)
发生背景: 项目前后台交互对接时候,经常存在对底层表蒙圈情况尤其是oracle数据库,所在层级不同会导致操作对象直接的改变,从而发生意向不到的事情:很多时候需要了解我们所操作对象所处的层级等相关信息, ...
- 编译Libuv
Libuv https://github.com/libuv/libuv LibSourcey是基于libuv,集合了第三方用于视频流的开源库,使用C++11. 下载最新 https://dist.l ...
- dns欺骗之ettercap
ettercap是一个基于ARP地址欺骗方式的网络嗅探工具,主要适用于局域网. ettercap是一款现有流行的网络抓包软件,它利用计算机在局域网内进行通信的ARP协议的缺陷进行攻击,在目标与服务器之 ...
- sqlserver之on与where条件
在进行两个表乃至多个表进行联接时需要on条件进行匹配,很多时候我们会对过滤条件放在on还是where中心存疑惑.一般来讲,在外联接中on是两个表进行关联的匹配条件,在该条件匹配下会生成一个虚拟表. 如 ...
- Noip 2016 Day 1 & Day 2
Day 1 >>> T1 >> 水题直接模拟AC: 考察三个知识点:1.你能不能编程 2.你会不会取模 3.你脑子抽不抽 然而第一次评测还是90,因为当模运算时 “ en ...
- 【EXCEL】簡単に重複探し
下記のような表があって.重複があるかどうか探すのが大変と思いますが. 簡単に重複探す方法を紹介します. Step1.重複を探す(例えこちらでは項目)を選択します. Step2.メニューで 条件付き書式 ...
- 20155233 实验一 Java开发环境的熟悉(Linux + IDEA)
20155233 实验一 Java开发环境的熟悉(Linux + IDEA) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA编辑.编译.运行.调试Java程序. 实验步骤 ( ...
- aspnetcore 2.1 发布到树莓派3linux的艰辛路程
发布至docker for windows. 提示: image operating system "windows" cannot be used on this platfor ...
- underscore.js 分析 第四天
查看underscore包含多少属性和方法 通过阅读JavaScript 获取对象的键的数组 var a = _; var arr = Object.keys(a); console.log(arr) ...
- dsp6657的helloworld例程测试-第二篇-CFG文件
1. 上一篇疑问,int StackTest()这个函数是怎么运行的,后来在.cfg文件找到了答案,.cfg包含丰富的信息,对于用惯C语言的,确实不太习惯 var Memory = xdc.useMo ...