Eureka 学习笔记2:客户端 DiscoveryClient

版本 awsVersion = ‘1.11.277’

DiscoveryClient # cacheRefreshTask

// 配置shouldFetchRegistry
if (clientConfig.shouldFetchRegistry()) {// 配置client.refresh.intervalint registryFetchIntervalSeconds = clientConfig.getRegistryFetchIntervalSeconds();// 配置expBackOffBoundint expBackOffBound = clientConfig.getCacheRefreshExecutorExponentialBackOffBound();cacheRefreshTask = new TimedSupervisorTask("cacheRefresh",scheduler,cacheRefreshExecutor,registryFetchIntervalSeconds,TimeUnit.SECONDS,expBackOffBound,new CacheRefreshThread());scheduler.schedule(cacheRefreshTask,registryFetchIntervalSeconds, TimeUnit.SECONDS);
}

shouldFetchRegistry 指定是否从服务端拉取注册列表,默认 true

client.refresh.interval 指定从服务端拉取注册列表的时间间隔,默认 30s

client.cacheRefresh.exponentialBackOffBound 指定从服务端拉取注册列表的最大时间间隔,默认 10

注1:当从服务端拉取注册列表的请求超时(即 TimedSupervisorTask 捕获 TimeoutException 异常时),下一次拉取的时间间隔会成倍递增,递增后的时间间隔不能超过 client.cacheRefresh.exponentialBackOffBoundclient.refresh.interval 的乘积(即拉取的时间间隔最大不能超过 10x30=300s)

注2
supervisor

/ˈsuːpəvaɪzə®/

/ˈsuːpərvaɪzər/
n.
监督人;主管人;指导者

注3
exponential

/ˌekspəˈnenʃl/

/ˌekspəˈnenʃl/
adj.
指数的;幂的;越来越快的;由指数表示的
n.
指数


DiscoveryClient # heartbeatTask

if (clientConfig.shouldRegisterWithEureka()) {int renewalIntervalInSecs = instanceInfo.getLeaseInfo().getRenewalIntervalInSecs();int expBackOffBound = clientConfig.getHeartbeatExecutorExponentialBackOffBound();heartbeatTask = new TimedSupervisorTask("heartbeat",scheduler,heartbeatExecutor,renewalIntervalInSecs,TimeUnit.SECONDS,expBackOffBound,new HeartbeatThread());scheduler.schedule(heartbeatTask,renewalIntervalInSecs, TimeUnit.SECONDS);
}

registration.enabled 指定是否向服务端注册实例,默认 true

lease.renewalInterval 指定向服务端续约的时间间隔,默认 30s

lease.duration 指定向服务端续约的租期时间,默认 90s

client.heartbeat.exponentialBackOffBound 指定向服务端续约的最大时间间隔,默认 10

注1:当向服务端续约的请求超时(即 TimedSupervisorTask 捕获 TimeoutException 异常时),下一次进行续约的时间间隔会成倍递增,递增后的时间间隔不能超过 client.heartbeat.exponentialBackOffBoundlease.renewalInterval 的乘积(即进行续约的时间间隔最大不能超过 10x30=300s)


DiscoveryClient # instanceInfoReplicator

// 配置registration.enabled
if (clientConfig.shouldRegisterWithEureka()) {// ...instanceInfoReplicator = new InstanceInfoReplicator(this,instanceInfo,// 配置appinfo.replicate.intervalclientConfig.getInstanceInfoReplicationIntervalSeconds(),// burstSize2);statusChangeListener = new ApplicationInfoManager.StatusChangeListener(){@Overridepublic void notify(StatusChangeEvent statusChangeEvent) {instanceInfoReplicator.onDemandUpdate();}};// 配置shouldOnDemandUpdateStatusChangeif (clientConfig.shouldOnDemandUpdateStatusChange()) {applicationInfoManager.registerStatusChangeListener(statusChangeListener);}instanceInfoReplicator.start(// 配置appinfo.initial.replicate.timeclientConfig.getInitialInstanceInfoReplicationIntervalSeconds());
}

registration.enabled 指定是否向服务端注册实例,默认 true

appinfo.replicate.interval 指定向服务端注册实例的时间间隔,默认 30s

appinfo.initial.replicate.time 指定初次向服务端注册实例的延迟时间,默认 40s

shouldOnDemandUpdateStatusChange 指定是否启用 StatusChangeListener,在实例状态更新时向服务端注册实例,默认 true


客户端通过 InstanceInfoReplicator 向服务端注册实例,有以下两种方式:

  1. scheduler 周期地异步执行 InstanceInfoReplicator 的 run 方法
public void run() {try {// 刷新实例信息discoveryClient.refreshInstanceInfo();Long dirtyTimestamp = instanceInfo.isDirtyWithTime();// 如果实例信息发生了更新if (dirtyTimestamp != null) {// 向服务端注册实例discoveryClient.register();// 重置实例的dirty状态instanceInfo.unsetIsDirty(dirtyTimestamp);}} catch (Throwable t) {} finally {// scheduler进行下一次延迟调度Future next = scheduler.schedule(this, replicationIntervalSeconds, TimeUnit.SECONDS);scheduledPeriodicRef.set(next);}
}
  1. 实例状态发生变化时,statusChangeListener 同步触发 InstanceInfoReplicator 的 onDemandUpdate 方法,scheduler 异步执行 InstanceInfoReplicator 的 run 方法
public boolean onDemandUpdate() {// 令牌桶限流,如果rateLimiter成功获取令牌if (rateLimiter.acquire(burstSize, allowedRatePerMinute)) {// 如果scheduler没有关闭if (!scheduler.isShutdown()) {scheduler.submit(new Runnable() {@Overridepublic void run() {Future latestPeriodic = scheduledPeriodicRef.get();// 如果scheduler正在执行则取消if (latestPeriodic != null && !latestPeriodic.isDone()) {latestPeriodic.cancel(false);}InstanceInfoReplicator.this.run();}});return true;} // end if (!scheduler.isShutdown())} // end if (rateLimiter.acquire(burstSize, allowedRatePerMinute))
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解Zookeeper分布式锁的概念及原理

深入理解Zookeeper分布式锁的概念及原理 1. 引言 在分布式系统中,锁是一种重要的机制,用于协调多个节点之间的并发访问。在大规模分布式系统中,实现高效且可靠的分布式锁是一个挑战。本篇博客将深入探讨Zookeeper分布式锁的概念及其原理&am…

HTML+CSS+JavaScript:轮播图的自动播放、手动播放、鼠标悬停暂停播放

一、需求 昨天我们做了轮播图的自动播放,即每隔一秒自动切换一次 今天我们增加两个需求: 1、鼠标点击向右按钮,轮播图往后切换一次;鼠标点击向左按钮,轮播图往前切换一次 2、鼠标悬停在轮播图区域中时,…

Verilog语法学习——LV5_位拆分与运算

LV5_位拆分与运算 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述: 现在输入了一个压缩的16位数据,其实际上包含了四个数据…

Layui网页模板

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>会员管理</title><link href"layui/c…

JAVA IO 的 Windows、Linux文件路径差异

因为文件路径是字符串拼接的&#xff0c;所以之前的路径是这样 D:\pics/bankslip/2023/08/01\fe68a2c16ecb498f89a88f9472a1361e.png /root/temp/bankslip/2023/08/01\fe68a2c16ecb498f89a88f9472a1361e.png 左斜杠、右斜杠都有的情况 那么在windows中这样的路径是正常的&#…

ComPDFKit 转档SDK OCR表格识别功能

我们非常高兴地宣布&#xff0c;适用于 Windows、iOS、Android 和服务器的 ComPDFKit 转档SDK 1.8.0 现已发布&#xff01;在该版本中&#xff0c;OCR 功能支持了表格识别&#xff0c;优化了OCR文字识别率。PDF to HTML 优化了html 文件结构&#xff0c;使转换后的 HTML 文件容…

css 四角边框移动效果

块是长宽相等的正方形&#xff0c;大小浏览器分辨率变化而变化利用平移变化translate来时实现边框到达鼠标划到的块&#xff0c;坐标是鼠标滑到块的offsetLeft和offsetTop <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&quo…

誉天程序员-SpringMVC回顾:五种接参方式

1、GET查询串传参&#xff1a; 2、RESTFul形式传参&#xff08;参数少&#xff09; 3、form表单传参 4、混合传参&#xff0c;查询串表单 5、终极王者&#xff0c;json传参&#xff08;参数多&#xff09; package com.book.admin.controller;import com.book.admin.entity.Us…

从互联网到云时代,Apache RocketMQ 是如何演进的?

作者&#xff1a;隆基 2022 年&#xff0c;RocketMQ 5.0 的正式版发布。相对于 4.0 版本而言&#xff0c;架构走向云原生化&#xff0c;并且覆盖了更多业务场景。 消息队列演进史 操作系统、数据库、中间件是基础软件的三驾马车&#xff0c;而消息队列属于最经典的中间件之一…

用python需要下载软件吗,python需要安装哪些软件

大家好&#xff0c;本文将围绕安装python需要什么样的电脑配置展开说明&#xff0c;python需要安装哪些软件是一个很多人都想弄明白的事情&#xff0c;想搞清楚用python需要下载软件吗需要先了解以下几个事情。 编程这东西很神奇。对于那些知道如何有用和有趣的这个工具,对于Xi…

Windows 实例如何开放端口

矩池云 Windows 实例相比于 Linux 实例&#xff0c;除了在租用机器的时候自定义端口外&#xff0c;还需要在 Windows防火墙中添加入口规则。接下来将教大家如何设置 Windows 防火墙&#xff0c;启用端口。 租用成功后通过 RDP 链接连接服务器&#xff0c;然后搜索防火墙&#x…

React的UmiJS搭建的项目集成海康威视h5player播放插件H5视频播放器开发包 V2.1.2

最近前端的一个项目&#xff0c;大屏需要摄像头播放&#xff0c;摄像头厂家是海康威视的&#xff0c;网上找了一圈都没有React集成的&#xff0c;特别是没有使用UmiJS搭脚手架搭建的&#xff0c;所以记录一下。 海康威视的开放平台的API地址&#xff0c;相关插件和文档都可以下…

使用 docker-compose 一键部署多个 redis 实例

目录 1. 前期准备 2. 导入镜像 3. 部署redis master脚本 4. 部署redis slave脚本 5. 模板文件 6. 部署redis 7. 基本维护 1. 前期准备 新部署前可以从仓库&#xff08;repository&#xff09;下载 redis 镜像&#xff0c;或者从已有部署中的镜像生成文件&#xff1a; …

简单的python有趣小程序,有趣的代码大全python

这篇文章主要介绍了python简单有趣的程序源代码&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。

网络防御技术:防火墙与入侵检测系统

目录 简介&#xff1a; 1. 防火墙基础 1.1 类型 1.2 防火墙规则配置 2. 入侵检测系统&#xff08;IDS&#xff09;基础 2.1 类型 2.2 IDS规则配置 总结 简介&#xff1a; 在当今数字化时代&#xff0c;网络安全威胁日益增加&#xff0c;保护网络免受恶意攻击变得尤为重…

安装 mysql8.0-docker版安装

一、docker安装 安装docker2022版&#xff08;对大家有帮助&#xff09; 二、docker 安装mysql8.0 1.从 Docker Hub 下载 MySQL 8.0 镜像。打开终端并运行以下命令&#xff1a; docker pull mysql:8.0 2.创建一个 MySQL 容器并运行。在终端中运行以下命令&#xff1a; docke…

Hadoop学习日记-YARN组件

YARN(Yet Another Resource Negotiator)作为一种新的Hadoop资源管理器&#xff0c;是另一种资源协调者。 YARN是一个通用的资源管理系统和调度平台&#xff0c;可为上层应用提供统一的资源管理和调度 YARN架构图 YARN3大组件&#xff1a; &#xff08;物理层面&#xff09…

ICML 2023 | 拓展机器学习的边界

编者按&#xff1a;如今&#xff0c;机器学习已成为人类未来发展的焦点领域&#xff0c;如何进一步拓展机器学习技术和理论的边界&#xff0c;是一个极富挑战性的重要话题。7月23日至29日&#xff0c;第四十届国际机器学习大会 ICML 2023 在美国夏威夷举行。该大会是由国际机器…

HarmonyOS/OpenHarmony元服务开发-配置卡片的配置文件

卡片相关的配置文件主要包含FormExtensionAbility的配置和卡片的配置两部分&#xff1a; 1.卡片需要在module.json5配置文件中的extensionAbilities标签下&#xff0c;配置FormExtensionAbility相关信息。FormExtensionAbility需要填写metadata元信息标签&#xff0c;其中键名称…

CentOS 7安装Docker

文章目录 &#x1f31e;版本选择☀️1.CentOS安装Docker&#x1f331;1.1.卸载&#xff08;可选&#xff09;&#x1f331;1.2.安装docker&#x1f331;1.3.启动docker&#x1f331;1.4.配置镜像加速 ☀️2.CentOS7安装DockerCompose&#x1f331;2.1.下载&#x1f331;2.2.修改…