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 ...
随机推荐
- Linux系统下连接校园网Drcom客户端教程(广东工业大学)
这篇教程写给想要学习Linux系统或者在Linux系统下有需要使用Drcom上网的同学,在我疯狂踩坑,经过n多次的刷机装机实验,体验不同发行版本的linux系统后,终于懂得怎么连接上drcom,想想连 ...
- FPGA千兆网UDP协议实现
接着上一篇百兆网接口的设计与使用,我们接着来进行FPGA百兆网UDP(User Datagram Protocol)协议的设计. 1)UDP简介 在此,参考博主夜雨翛然的博文“https://www. ...
- 20155217 实验二 Java面向对象程序设计 实验报告
20155217 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...
- 20155322 2016-2017-2 《Java面向对象程序设计》第十二周课堂练习之Arrays和String单元测试
20155322 2016-2017-2 <Java面向对象程序设计>第十二周课堂练习之Arrays和String单元测试 练习目地 在IDEA中以TDD的方式对String类和Array ...
- 20155333 2016-2017-2 《Java程序设计》第十周学习总结
20155333 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络概览 两台计算机用于通信的语言叫做"协议".我们只需关心应用层中的协 ...
- [2016北京集训试题7]thr-[树形dp+树链剖分+启发式合并]
Description Solution 神仙操作orz. 首先看数据范围,显然不可能是O(n2)的.(即绝对不是枚举那么简单的),我们考虑dp. 定义f(x,k)为以x为根的子树中与x距离为k的节点 ...
- LNMP的安装--详细版
一.软件概述 [root@webserver ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@webserver ~]# u ...
- AngularJS中Directive指令系列
近段时间在研究Angular中的directive用法,打算写个系列.以官方文档为主.并参考诸多教程.加上自己的思考. 基本概念及用法 scope属性的使用. &, <, =, @ 符 ...
- equals和==方法比较(一)
问题描述 今天在使用spotbugs代码走查时发现这样一个问题,两个Long类型的变量使用==判断数值是否相等,spotbugs提示这是一个很致命的错误,代码大概如下, Long l1=123l; L ...
- Android开发笔记——视频录制播放常见问题
本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程 以微信为例,其录制触发为按下(住) ...