Dubbo优雅启动(附源码分析)

news2024/11/27 12:53:53

Dubbo优雅启动

1. 启动有什么问题

我们知道,应用在运行了一段时间后,执行速度会比刚启动的时候要快。这是因为在 Java 里面,在运行过程中,JVM 虚拟机会把高频的代码编译成机器码,被加载过的类也会被缓存到 JVM 缓存中,再次使用的时候不会触发临时加载,这样就使得“热点”代码的执行不用每次都通过解释,从而提升执行速度。

但是这些“临时数据”,都在我们应用重启后就消失了。重启后的这些“红利”没有了之后,如果让我们刚启动的应用就承担像停机前一样的流量,这会使应用在启动之初就处于高负载状态,从而导致调用方过来的请求可能出现大面积超时,进而对线上业务产生损害行为。

所以,在应用启动的时候,需要先让应用只处理少部分的流量,这样低功率运行一段时间后,再逐渐提升至最佳状态。

2. 优雅启动的方法

启动预热

那什么叫启动预热呢?

简单来说,就是让刚启动的服务提供方应用不承担全部的流量,而是让它被调用的次数随着时间的移动慢慢增加,最终让流量缓和地增加到跟已经运行一段时间后的水平一样。

那么Dubbo中是如何实现启动预加热的呢?

首先看一下 RoundRobinLoadBalance.doSelect 方法。此方法是从invoker 列表中根据权重选择出一个invoker.
在这里插入图片描述

其次看一下getWeight()方法,此方法计算invoker的权重。
在这里插入图片描述

具体的计算方式如下:
在这里插入图片描述

延迟暴露

我们应用启动的时候都是通过 main 入口,然后顺序加载各种相关依赖的类。以 Spring 应用启动为例,在加载的过程中,Spring 容器会顺序加载 Spring Bean,如果某个 Bean 是 RPC 服务的话,我们不光要把它注册到 Spring-BeanFactory 里面去,还要把这个 Bean 对应的接口注册到注册中心。注册中心在收到新上线的服务提供方地址的时候,会把这个地址推送到调用方应用内存中;当调用方收到这个服务提供方地址的时候,就会去建立连接发请求。

但这时候是不是存在服务提供方可能并没有启动完成的情况?因为服务提供方应用可能还在加载其它的 Bean。对于调用方来说,只要获取到了服务提供方的 IP,就有可能发起 RPC 调用,但如果这时候服务提供方没有启动完成的话,就会导致调用失败,从而使业务受损。

在解决问题前,我们先看下出现上述问题的根本原因。这是因为服务提供方应用在没有启动完成的时候,调用方的请求就过来了,而调用方请求过来的原因是,服务提供方应用在启动过程中把解析到的 RPC 服务注册到了注册中心,这就导致在后续加载没有完成的情况下服务提供方的地址就被服务调用方感知到了。这样的话,其实我们就可以把接口注册到注册中心的时间挪到应用启动完成后。

具体的做法就是在应用启动加载、解析 Bean 的时候,如果遇到了 RPC 服务的 Bean,只先把这个 Bean 注册到 Spring-BeanFactory 里面去,而并不把这个 Bean 对应的接口注册到注册中心,只有等应用启动完成后,才把接口注册到注册中心用于服务发现,从而实现让服务调用方延迟获取到服务提供方地址。

Dubbo 2.6.5 以前的版本,如果需要延迟到 Spring 初始化完成后,再暴露服务。那么需要进行如下的配置:

<dubbo:service delay="-1" />

延迟 5 秒暴露服务

<dubbo:service delay="5000" />

Dubbo 2.6.5以及以后的版本,所有服务都将在 Spring 初始化完成后进行暴露,如果你不需要延迟暴露服务,无需配置 delay。

延迟 5 秒暴露服务

<dubbo:service delay="5000" />

我们来看一下其中的源码实现。看一下 ServiceConfig.export()方法。
在这里插入图片描述
也就是如果是延时export,就使用时间调度器延时执行服务export逻辑。

QOS 命令上线

Dubbo 还为服务提供了另一个配置项:

<dubbo:service register="false" />

该配置项配置后,服务将不会发布到注册中心,可能很多 Dubbo 用户不会注意到这个配置,它的作用恰恰是 QOS 指令使用的。

当需要发布的时候,我们可以通过online 命令手动将服务发。

滚动升级

  1. 分时分批启动,就和灰度发布一样;
  2. 在请求低峰把,在热点的应用肯定是有使用低峰的;

3. 总结

启动预热与延迟暴露,它们并不是 RPC 的专属功能,我们在开发其它系统时,也可以利用这两点来减少冷启动对业务的影响。

4. 鸣谢

RPC实战与核心原理

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

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

相关文章

主数据和元数据、数据标准、数据质量有什么关系

企业数据治理涉及的工作很广&#xff0c;包括数据标准、数据质量、数据安全、数据共享机制、元数据管理、主数据管理等。主数据作为企业的黄金数据&#xff0c;对于企业信息化管理具有重要意义。本文将对主数据的概念及主数据与数据治理体系中的几个核心部分的关系和大家做一个…

oracle 查询到的结果在快捷地写入到excel过程中标题部分正确的处理方式

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤羌笛何须怨杨柳&#xff0c;春风不度玉门关。大家好&#xff0c;我是皮皮。一、前言前几天在Python最强王者交流群【粉丝】问了一个pandas数据处理的问题&…

一篇文章让你掌握HTML(上)

目录 前言 1. 基础认知 1.1 HTML概念 1.2 Web标准 2. HTML骨架结构 3. 开发工具的基本使用 4. 语法规范 4.1 HTML的注释 4.2 HTML标签的结构 4.3 HTML标签的关系 5. 排版标签 5.1 标题标签 5.2 段落标签 5.3 换行标签 5.4 水平线标签 6. 文本格式化标签…

清华教授极力推荐的三本入门学习Python书籍

目录 Python入门书&#xff08;适合初学者&#xff09; Python进阶书&#xff08;适合有基础的&#xff09; Python数据科学&#xff08;适合初学者&#xff09; Python入门书&#xff08;适合初学者&#xff09; 这应该是世界上最畅销的Python编程书&#xff0c;没有之一。…

实战|记一次2022某地HVV中的木马逆向分析

声明&#xff1a;本文仅限于技术讨论与分享&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全行为后果自负&#xff0c;与本号及原作者无关。前言事情是这样的&#xff0c;国庆前期某地HVV&#xff0c;所以接到了客户通知他们收到了钓鱼邮件想要溯源直接下载文件逆…

电子模块|光照强度传感器模块 GY-302及其驱动(arduino、STC51、STM32)

电子模块|光照强度传感器模块 GY-302及其驱动&#xff08;arduino、STC51、STM32&#xff09;实物照片模块简介模块特点原理图驱动程序arduinoSTC51STM32实物照片 模块简介 BH1750是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强…

【Linux】文件操作、文件描述符和重定向

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;重新谈论文…

【数据结构】5.1 树和二叉树的定义

前言 数形结构的关系是 1 对 n 的&#xff0c;树的每个元素后面都可以有多个后继&#xff0c;但是只能有 1 个前趋。 树形结构&#xff08;非线性结构&#xff09; 结点之间有分支具有层次关系 5.1.1 数的定义 树&#xff08;Tree&#xff09;是 n &#xff08;n > 0&…

java中javaSE与javaEE的区别

javaSE是什么&#xff1f; 怎么说吧&#xff0c;可以理解为javaSE是java的基石&#xff0c;如果将java程序想象成一座高楼大厦&#xff0c;那么javaSE就是地基。 官方的解释&#xff1a; Java SE&#xff08;Java Platform&#xff0c;Standard Edition&#xff09; Java SE 以…

实验室设计基本原则SICOLAB

实验室设计基本原则SICOLAB实验室设计、实验室建设施工SICOLAB实验室布局必须符合实验流程的规律&#xff0c;从样品接收、样品暂存、试剂和耗材储存、前处理和准备、样品分析测试、清洗到废物回收和处理&#xff0c;都必须有一个清晰的流程。要区分人流和物流&#xff0c;以及…

SQL DELETE 语句

DELETE 语句用于删除表中的记录。 SQL DELETE 语句 DELETE 语句用于删除表中的行。 SQL DELETE 语法 DELETE FROM table_name WHERE condition; 参数说明&#xff1a; table_name&#xff1a;要删除的表名称。condition&#xff1a;删除条件&#xff0c;用于指定哪些数据要…

小程序开发经验分享(4)-框架的选择

3个小程序开发框架 小程序开发公认的3个小程序开发框架: 原生、wepy、mpvue。3者个有利弊: 原生框架:微信的亲儿子,可直接在微信开发者工具中开发,方便调试,结构直接对应微信文档,框架无缝升级,最快支持最新版本的开发基础库。缺点是原生开发提供的开发方式比较朴素,…

2023年网络安全比赛--网络安全事件响应中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启动异常进程的脚本,并将其绝对路径作为Flag值提交; 2.黑客通过网络攻入本地服务器,通过特殊手段在系统…

2022年12月国产数据库大事记-墨天轮

本文为墨天轮技术社区整理的2022年12月国产数据库大事件和重要产品发布消息。 目录 12月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证排行榜新增数据库厂商活动相关资料 12月国产数据库大事记&#xff08;时间线&#xff09; 12月2日&#xff0c;…

linux环境tomcat发布系统

目录 1、上传需要发布的war 包 2、查看当前java线程 3、杀死需要启动的服务的java线程 3、修改上传的war包名称&#xff0c;删除原来的代码包 4、重新启动程序 5、查看启动日志 1、上传需要发布的war 包 通过XFTP上传war 包到 服务器 tomcat -->webapps 目录下。 注…

测试开发 | 相比 Selenium,Web 自动化测试框架 Playwright 有哪些强大的优势?

Playwright 是由微软的研发团队所开发的一款 Web 自动化测试框架&#xff0c;这个框架具有多平台、跨语言的特点。除了基本的自动化测试能力之外&#xff0c;同时它还具备非常强大的录制功能、追踪功能。以下是 Playwright 与 Selenium 的对比。 由此可见&#xff0c;Playwrigh…

Nginx编译安装vts监控模块

目录 1、环境准备 2、编译安装Nginx源码 2.1、安装依赖 2.2、编译安装Nginx 2.3验证Nginx安装 3、Nginx添加配置 3.11、Http模块下面添加 3.1.2、添加status访问页面 4、启动Nginx 4.3、访问前端页面 1、环境准备 参考Github vts模块参考Github nginx-1.20.2.tar.…

《Kotlin核心编程》笔记:val 和 var 字符串

Kotin重要特性&#xff1a;类型推导&#xff1a;定义变量不再需要显示声明类型&#xff0c;由编译器自动推导出变量的类型 如 val a "hello” val b 5 val c 10L表达式函数: fun sum(x: Int, y: Int) x y // 省略了{}&#xff0c;Kotlin支持这种用单行表达式与等号…

Git——git分支操作

1 什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时 候&#xff0c;不会影响主线分支的运行。对于初…

ArcGIS基础实验操作100例--实验52导出点要素的坐标值

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验52 导出点要素的坐标值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…