聊聊spring cloud的DefaultEurekaServerContext
序
本文主要研究一下spring cloud的DefaultEurekaServerContext
EurekaServerAutoConfiguration
@Configuration
@Import(EurekaServerInitializerConfiguration.class)
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
@EnableConfigurationProperties({ EurekaDashboardProperties.class,InstanceRegistryProperties.class })
@PropertySource("classpath:/eureka/server.properties")
public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter {//......@Beanpublic EurekaServerContext eurekaServerContext(ServerCodecs serverCodecs,PeerAwareInstanceRegistry registry, PeerEurekaNodes peerEurekaNodes) {return new DefaultEurekaServerContext(this.eurekaServerConfig, serverCodecs,registry, peerEurekaNodes, this.applicationInfoManager);}//......
}
复制代码
DefaultEurekaServerContext
eureka-core-1.8.8-sources.jar!/com/netflix/eureka/DefaultEurekaServerContext.java
@PostConstruct@Overridepublic void initialize() throws Exception {logger.info("Initializing ...");peerEurekaNodes.start();registry.init(peerEurekaNodes);logger.info("Initialized");}@PreDestroy@Overridepublic void shutdown() throws Exception {logger.info("Shutting down ...");registry.shutdown();peerEurekaNodes.shutdown();logger.info("Shut down");}
复制代码
实例化后的时候执行peerEurekaNodes.start();以及registry.init(peerEurekaNodes); 销毁之前执行registry.shutdown();以及peerEurekaNodes.shutdown();
start
PeerEurekaNodes.start
eureka-core-1.8.8-sources.jar!/com/netflix/eureka/cluster/PeerEurekaNodes.java
public void start() {taskExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r, "Eureka-PeerNodesUpdater");thread.setDaemon(true);return thread;}});try {updatePeerEurekaNodes(resolvePeerUrls());Runnable peersUpdateTask = new Runnable() {@Overridepublic void run() {try {updatePeerEurekaNodes(resolvePeerUrls());} catch (Throwable e) {logger.error("Cannot update the replica Nodes", e);}}};taskExecutor.scheduleWithFixedDelay(peersUpdateTask,serverConfig.getPeerEurekaNodesUpdateIntervalMs(),serverConfig.getPeerEurekaNodesUpdateIntervalMs(),TimeUnit.MILLISECONDS);} catch (Exception e) {throw new IllegalStateException(e);}for (PeerEurekaNode node : peerEurekaNodes) {logger.info("Replica node URL: {}", node.getServiceUrl());}}
复制代码
这里首先执行updatePeerEurekaNodes,之后注册定时任务去定时触发updatePeerEurekaNodes,时间间隔为erverConfig.getPeerEurekaNodesUpdateIntervalMs()
resolvePeerUrls
/*** Resolve peer URLs.** @return peer URLs with node's own URL filtered out*/protected List<String> resolvePeerUrls() {InstanceInfo myInfo = applicationInfoManager.getInfo();String zone = InstanceInfo.getZone(clientConfig.getAvailabilityZones(clientConfig.getRegion()), myInfo);List<String> replicaUrls = EndpointUtils.getDiscoveryServiceUrls(clientConfig, zone, new EndpointUtils.InstanceInfoBasedUrlRandomizer(myInfo));int idx = 0;while (idx < replicaUrls.size()) {if (isThisMyUrl(replicaUrls.get(idx))) {replicaUrls.remove(idx);} else {idx++;}}return replicaUrls;}
复制代码
首先通过resolvePeerUrls来获取replicaUrls,这里获取的是健康的url,然后剔除自己的url
updatePeerEurekaNodes
/*** Given new set of replica URLs, destroy {@link PeerEurekaNode}s no longer available, and* create new ones.** @param newPeerUrls peer node URLs; this collection should have local node's URL filtered out*/protected void updatePeerEurekaNodes(List<String> newPeerUrls) {if (newPeerUrls.isEmpty()) {logger.warn("The replica size seems to be empty. Check the route 53 DNS Registry");return;}Set<String> toShutdown = new HashSet<>(peerEurekaNodeUrls);toShutdown.removeAll(newPeerUrls);Set<String> toAdd = new HashSet<>(newPeerUrls);toAdd.removeAll(peerEurekaNodeUrls);if (toShutdown.isEmpty() && toAdd.isEmpty()) { // No changereturn;}// Remove peers no long availableList<PeerEurekaNode> newNodeList = new ArrayList<>(peerEurekaNodes);if (!toShutdown.isEmpty()) {logger.info("Removing no longer available peer nodes {}", toShutdown);int i = 0;while (i < newNodeList.size()) {PeerEurekaNode eurekaNode = newNodeList.get(i);if (toShutdown.contains(eurekaNode.getServiceUrl())) {newNodeList.remove(i);eurekaNode.shutDown();} else {i++;}}}// Add new peersif (!toAdd.isEmpty()) {logger.info("Adding new peer nodes {}", toAdd);for (String peerUrl : toAdd) {newNodeList.add(createPeerEurekaNode(peerUrl));}}this.peerEurekaNodes = newNodeList;this.peerEurekaNodeUrls = new HashSet<>(newPeerUrls);}
复制代码
主要是跟原始或上次更新的peerEurekaNodeUrls对比,移除掉不健康的节点,移除的时候会调用PeerEurekaNode的shutdown方法,添加的时候通过createPeerEurekaNode创建
protected PeerEurekaNode createPeerEurekaNode(String peerEurekaNodeUrl) {HttpReplicationClient replicationClient = JerseyReplicationClient.createReplicationClient(serverConfig, serverCodecs, peerEurekaNodeUrl);String targetHost = hostFromUrl(peerEurekaNodeUrl);if (targetHost == null) {targetHost = "host";}return new PeerEurekaNode(registry, targetHost, peerEurekaNodeUrl, replicationClient, serverConfig);}
复制代码
添加的时候会创建新的PeerEurekaNode
registry.init(peerEurekaNodes)
eureka-core-1.8.8-sources.jar!/com/netflix/eureka/registry/PeerAwareInstanceRegistryImpl.java
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);}}
复制代码
这里初始化ResponseCache、调度RenewalThresholdUpdateTask、还有初始化RemoteRegionRegistry
shutdown
registry.shutdown()
eureka-core-1.8.8-sources.jar!/com/netflix/eureka/registry/PeerAwareInstanceRegistryImpl.java
/*** Perform all cleanup and shutdown operations.*/@Overridepublic void shutdown() {try {DefaultMonitorRegistry.getInstance().unregister(Monitors.newObjectMonitor(this));} catch (Throwable t) {logger.error("Cannot shutdown monitor registry", t);}try {peerEurekaNodes.shutdown();} catch (Throwable t) {logger.error("Cannot shutdown ReplicaAwareInstanceRegistry", t);}numberOfReplicationsLastMin.stop();super.shutdown();}
复制代码
这里主要是调用peerEurekaNodes.shutdown(),还有super的shutdown
super.shutdown
eureka-core-1.8.8-sources.jar!/com/netflix/eureka/registry/AbstractInstanceRegistry.java
/*** Perform all cleanup and shutdown operations.*/@Overridepublic void shutdown() {deltaRetentionTimer.cancel();evictionTimer.cancel();renewsLastMin.stop();}
复制代码
主要是关闭一些计时器
peerEurekaNodes.shutdown()
eureka-core-1.8.8-sources.jar!/com/netflix/eureka/cluster/PeerEurekaNodes.java
public void shutdown() {taskExecutor.shutdown();List<PeerEurekaNode> toRemove = this.peerEurekaNodes;this.peerEurekaNodes = Collections.emptyList();this.peerEurekaNodeUrls = Collections.emptySet();for (PeerEurekaNode node : toRemove) {node.shutDown();}}
复制代码
除了系统关闭会调用外,该eureka node被认为不健康的时候,被剔除时,也会调用shutdown方法
PeerEurekaNode.shutdown()
eureka-core-1.8.8-sources.jar!/com/netflix/eureka/cluster/PeerEurekaNode.java
/*** Shuts down all resources used for peer replication.*/public void shutDown() {batchingDispatcher.shutdown();nonBatchingDispatcher.shutdown();}
复制代码
主要是关闭dispatcher
小结
EurekaServerContext主要注册了bean初始化及销毁时执行的操作。初始化时,启动peerNodes,然后初始化registry;销毁时,关闭registry,然后关闭peerNodes。关于peerNodes,主要的是定时任务以erverConfig.getPeerEurekaNodesUpdateIntervalMs()时间间隔去定时触发updatePeerEurekaNodes,而这个操作是跟原始或上次更新的peerEurekaNodeUrls对比,移除掉不健康的节点,添加新的节点如果有的话。移除的时候会调用PeerEurekaNode的shutdown方法,添加新的peerNode的时候通过createPeerEurekaNode创建。
doc
- Understanding Eureka Peer to Peer Communication
聊聊spring cloud的DefaultEurekaServerContext相关推荐
- 聊聊spring cloud gateway的GlobalFilter
序 本文主要研究一下spring cloud gateway的GlobalFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0 ...
- 从架构演进的角度聊聊Spring Cloud都做了些什么?
Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...
- 聊聊Spring Cloud版本的那些事儿
继续昨天说的计划,解惑一下收到比较多的问题. 有朋友问"为什么在很多文章中,大家引用的Spring版本名字都不一样呢?比如:Angel.SR6,Brixton.SR5等等,它们都有什么区别呢 ...
- 聊聊spring cloud gateway的PreserveHostHeaderGatewayFilter
序 本文主要研究下spring cloud gateway的PreserveHostHeaderGatewayFilter GatewayAutoConfiguration spring-cloud- ...
- 聊聊spring cloud的LoadBalancerAutoConfiguration
序 本文主要研究一下spring cloud的LoadBalancerAutoConfiguration RibbonAutoConfiguration spring-cloud-netflix-ri ...
- 聊聊 Spring Cloud Config
一般服务器的应用都有以下几种类型, 其中当属业务部分最多也最繁杂. 当应用越来越庞大和复杂时,单机就肯定不能满足需求了,然后就要考虑分布式了,接下可能会应用不同的语言来开发应用. 比如 nginx 毫 ...
- 聊聊spring cloud gateway的SecureHeadersGatewayFilter
序 本文主要研究下spring cloud gateway的SecureHeadersGatewayFilter GatewayAutoConfiguration @Configuration @Co ...
- 聊聊spring cloud gateway的XForwardedHeadersFilter
序 本文主要研究spring cloud gateway的XForwardedHeadersFilter GatewayAutoConfiguration spring-cloud-gateway-c ...
- 聊聊spring cloud gateway的SetStatusGatewayFilter
序 本文主要研究下spring cloud gateway的SetStatusGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-c ...
最新文章
- 清华校友总会AI大数据专委会(筹)第一次理事会顺利召开
- #define 用法
- mysql12----explain
- linux ssh 报错 Failed to start OpenSSH Server daemon
- Elasticsearch优化
- C++中的类模板详细讲述
- Ubuntu 火狐浏览器不能上网解决办法
- android 序列化 json,android 读取json 为什么不直接反序列化
- php css布局技巧,最全的CSS开发常用技巧
- ELMo代码详解(二)
- 贪心——你可以获得的最大硬币数目(Leetcode 1561)
- android多个activity绑定一个service,8.1.2 绑定Activity和Service
- 自定义控件-----输入框
- Java 性能优化系列之3.2[JVM调优]
- android原生ios,Windows Phone的原生iOS/Android应用程序
- 【优化求解】基于matalb改进的遗传算法(GA+IGA)求解城市交通信号优化问题【含Matlab源码 213期】
- 电脑DIY基本知识扫盲!图文并茂!
- 麦氏细菌浊度分析仪的校准物质选择
- 计算机学报应用研究,组推荐系统及其应用研究-计算机学报.PDF
- 基于lxr的源代码浏览系统
热门文章
- python实现文件下载-python实现上传下载文件功能
- pythonurllib模块-Python中的urllib模块使用详解
- python要不要装pycharm-subli(python要不要装pycharm)
- python开发好学吗-Python的前景和Python好不好学呢?
- Windows+Python 3.6环境下安装PyQt4
- python 下载图片的集中方法
- beanstalkd php扩展,PHP操作Beanstalkd队列(1)安装与基础
- UVa11022 String Factoring(kmp+dp)
- Mybatis的解析模块基础
- 问题 1436: 地宫取宝 (dp)