当前位置: 首页 > news >正文

DangerWind-RPC-framework---三、服务端下机

        当一台机器下线时,面临很多问题:如何将其从注册中心下线?如何清理释放资源?客户端拉取服务列表时也使用了本地缓存,如何及时更新本地缓存?

        服务端机器的优雅下线需要使用ShutdownHook,这相当于添加了一个关闭钩子,这个钩子是一个线程,它在JVM关闭时(即程序结束时)被调用,清理资源,优雅下机。

   public void clearAll() {log.info("addShutdownHook for clearAll");// 添加了一个关闭钩子,这个钩子是一个线程,它在JVM关闭时(即程序结束时)被调用,清理资源,优雅下机Runtime.getRuntime().addShutdownHook(new Thread(() -> {try {InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), NettyRpcServer.PORT);CuratorUtils.clearRegistry(CuratorUtils.getZkClient(), inetSocketAddress);} catch (UnknownHostException ignored) {}// 操作完整、优雅,便于释放连接资源,便于自定义清理逻辑ThreadPoolFactoryUtil.shutDownAllThreadPool();}));}

          在钩子线程中需要编写从注册中心当中删除节点的逻辑,如下所示:

  // RPC Server端 本机所注册服务的缓存private static final Set<String> REGISTERED_PATH_SET = ConcurrentHashMap.newKeySet();public static void clearRegistry(CuratorFramework zkClient, InetSocketAddress inetSocketAddress) {REGISTERED_PATH_SET.stream().parallel().forEach(p -> {try {// 是本机在ZK注册的节点if (p.endsWith(inetSocketAddress.toString())) {// 根据路径名删除节点zkClient.delete().forPath(p);}} catch (Exception e) {log.error("clear registry for path [{}] fail", p);}});log.info("All registered services on the server are cleared:[{}]", REGISTERED_PATH_SET.toString());}

           在注册中心ZK当中删除节点之后,需要释放线程池资源:

  public static void shutDownAllThreadPool() {log.info("call shutDownAllThreadPool method");THREAD_POOLS.entrySet().parallelStream().forEach(entry -> {ExecutorService executorService = entry.getValue();// 停止接收新的任务,但已提交的任务会继续执行executorService.shutdown();log.info("shut down thread pool [{}] [{}]", entry.getKey(), executorService.isTerminated());try {// 等待线程池中的任务在指定的时间内完成。如果在指定时间内线程池未能终止,会抛出 InterruptedExceptionexecutorService.awaitTermination(10, TimeUnit.SECONDS);} catch (InterruptedException e) {log.error("Thread pool never terminated");// 指定时间内线程池未能终止,立即停止所有正在执行的任务executorService.shutdownNow();}});}

            自定义关闭线程池的逻辑可以更加优雅的实现线程池资源的释放。可以达到停止接受新的任务,继续在一定等待时间范围内执行已提交的任务,超出等待时间在强制终止线程池。

 

          

相关文章:

DangerWind-RPC-framework---三、服务端下机

当一台机器下线时&#xff0c;面临很多问题&#xff1a;如何将其从注册中心下线&#xff1f;如何清理释放资源&#xff1f;客户端拉取服务列表时也使用了本地缓存&#xff0c;如何及时更新本地缓存&#xff1f; 服务端机器的优雅下线需要使用ShutdownHook&#xff0c;这相当于添…...

基于Make的c工程No compilation commands found报错

由于安装gcc时只安装了build-essential&#xff0c;没有将其添加到环境变量中&#xff0c;因此打开Make工程时&#xff0c;CLion会产生如下错误&#xff1a; 要解决这个问题&#xff0c;一个方法是将GCC添加到环境变量中&#xff0c;但是这个方法需要修改至少两个配置文件&…...

c++:面向对象的继承特性

什么是继承 (1)继承是C源生支持的一种语法特性&#xff0c;是C面向对象的一种表现 (2)继承特性可以让派生类“瞬间”拥有基类的所有&#xff08;当然还得考虑权限&#xff09;属性和方法 (3)继承特性本质上是为了代码复用 (4)类在C编译器的内部可以理解为结构体&#xff0c;派…...

skywalking-2-客户端-php的安装与使用

skywalking的客户端支持php&#xff0c;真的很棒。 官方安装文档&#xff1a;https://skywalking.apache.org/docs/skywalking-php/next/en/setup/service-agent/php-agent/readme/ 前置准备 本次使用的php版本是8.2.13: php -v PHP 8.2.13 (cli) (built: Nov 21 2023 09:5…...

图文讲解IDEA如何导入JDBC驱动包

前言 学习JDBC编程,势必要学会如何导入驱动包,这里笔者用图文的方式来介绍 视频版本在这里 50秒教你怎么导入驱动包然后进行JDBC编程的学习_哔哩哔哩_bilibili 忘记录音频了,大伙凑合着看 下载驱动包 https://mvnrepository.com/artifact/mysql/mysql-connector-java 去中…...

java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Int

java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Int fun main(args: Array<String>) {var any1: Any?any1 nullval n1 any1 as? Int ?: -2024println(n1)kotlin.runCatching {var any2: Any?any2 nullval n2 any2 as Intprintln(…...

scrapy写爬虫

Scrapy是一个用于爬取网站数据并提取结构化信息的Python框架 一、Scrapy介绍 1.引擎&#xff08;Engine&#xff09; – Scrapy的引擎是控制数据流和触发事件的核心。它管理着Spider发送的请求和接收的响应&#xff0c;以及处理Spider生成的Item。引擎是Scrapy运行的驱动力。…...

Mybatis study

一、Mybatis Plus mybatis-plus指定实体类字段不查询 加标签 TableField(exist false) Spring Data Jpa学习 干我们这行&#xff0c;啥时候懈怠&#xff0c;就意味着长进的停止&#xff0c;长进的停止就意味着被淘汰&#xff0c;只能往前冲&#xff0c;直到凤凰涅槃的一天&am…...

【论文速读】《面向深度学习的联合消息传递与自编码器》

这篇文章来自华为的渥太华无线先进系统能力中心和无线技术实验室&#xff0c;作者中有大名鼎鼎的童文。 一、自编码架构的全局收发机面临的主要问题 文章对我比较有启发的地方&#xff0c;是提到自编码架构的全局收发机面临的主要问题&#xff1a; 问题一&#xff1a;基于随…...

防御---001

一、实验拓扑二、要求 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00 - 18:00)可以访问&#xff0c;生产区的的设备全天可以访问. 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMZ…...

DNS 杂谈

一、定义 DNS&#xff08;Domain Name System&#xff09;&#xff0c;域名系统&#xff0c;该系统记录域名和Ip地址的相互映射关系。用户访问互联网时&#xff0c;通过域名地址得到对应的IP地址&#xff0c;这个过程称为域名解析。DNS运行于UDP协议之上&#xff0c;使用的端口…...

docker笔记2

docker笔记2 一、阿里云镜像配置二、docker基本原理1.docker是如何启动一个容器的2.docker的底层原理 三、镜像命令总结 一、阿里云镜像配置 配置镜像的目的 由于Docker Hub等公共镜像仓库的服务器可能位于国外&#xff0c;直接从中拉取镜像时可能会遇到网络延迟或不稳定的问…...

数字统计

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别// 注意 while 处理多个 caseint a in.nextInt();i…...

Git 使用问题

Git 使用问题 1, 网络问题 1, 网络问题 # 报错如下&#xff1a; fatal: unable to access https://github.com/xianglingliwei/HRNet.git/: Failed to connect to github.com port 443 after 21044 ms: Couldnt connect to server在不能正常访问Github的区域&#xff0c;需要设…...

JMH325【剑侠情缘3】第2版80级橙武网游单机更稳定亲测视频安装教学更新整合收集各类修改教学补丁兴趣可以慢慢探索

资源介绍&#xff1a; 是否需要虚拟机&#xff1a;是 文件大小&#xff1a;压缩包约14G 支持系统&#xff1a;win10、win11 硬件需求&#xff1a;运行内存8G 4核及以上CPU独立显卡 下载方式&#xff1a;百度网盘 任务修复&#xff1a; 1&#xff0c;掌门任务&#xff08…...

大数据专业创新人才培养体系的探索与实践

一、引言 随着大数据技术的迅猛发展&#xff0c;其在各行各业中的应用日益广泛&#xff0c;对大数据专业人才的需求也日益增长。我国高度重视大数据产业的发展&#xff0c;将大数据作为国家战略资源&#xff0c;推动大数据与各行业的深度融合。教育部也积极响应国家战略&#…...

MySQL 中的 DDL、DML、DQL 和 DCL

文章目录 1. 数据定义语言&#xff08;DDL&#xff09;2. 数据操作语言&#xff08;DML&#xff09;3. 数据查询语言&#xff08;DQL&#xff09;4. 数据控制语言&#xff08;DCL&#xff09;总结 在 MySQL 数据库管理系统中&#xff0c;SQL 语句可以根据其功能分为不同的类别&…...

基础架构服务API:降低成本,提升业务效益

基础架构服务API的应用可以显著降低企业的成本&#xff0c;并提升业务效益。通过使用这些API&#xff0c;企业可以充分利用云计算、自动化部署和资源管理等功能&#xff0c;从而减少了传统基础设施所需的大量投资和维护成本。这些API还提供了弹性扩展和自动化功能&#xff0c;使…...

Redis IO多路复用

0、前言 本文所有代码可见 > 【gitee code demo】 本文涉及的主题&#xff1a; 1、BIO、NIO的业务实践和缺陷 2、Redis IO多路复用&#xff1a;redis快的主要原因 3、epoll 架构 部分图片 via 【epoll 原理分析】 1、BIO单线程版 1.1 业务代码 client client代码相同…...

如何在Vue中实现拖拽功能?

Vue.js是一款流行的JavaScript框架&#xff0c;用于构建用户界面。其中一个常见的需求是在Vue中实现拖拽功能&#xff0c;让用户可以通过拖拽元素来进行交互。今天&#xff0c;我们就来学习如何在Vue中实现这一功能。 首先&#xff0c;我们需要明白拖拽功能的基本原理&#xf…...

OpenClaw浏览器自动化:ollama-QwQ-32B模拟登录与数据抓取

OpenClaw浏览器自动化&#xff1a;ollama-QwQ-32B模拟登录与数据抓取 1. 为什么选择OpenClaw进行浏览器自动化 去年我在做一个社科研究项目时&#xff0c;需要从十几个政府公开数据平台定期抓取更新的统计报表。最初尝试用Python写爬虫&#xff0c;但遇到几个头疼的问题&…...

3步打造静音ThinkPad:双风扇控制技术指南

3步打造静音ThinkPad&#xff1a;双风扇控制技术指南 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 一、技术原理与核心优势 1.1 笔记本散热系统的工作瓶颈 大多数笔…...

Coda Prompt 实战:如何通过智能提示提升开发效率

作为一名开发者&#xff0c;每天面对海量代码&#xff0c;你是否也常常感到疲惫&#xff1f;重复的 CRUD 操作、频繁在文档和 IDE 之间切换、为某个函数命名绞尽脑汁……这些看似微小的“摩擦力”&#xff0c;日积月累却严重消耗着我们的精力与时间。今天&#xff0c;我想和大家…...

税务季钓鱼攻击中合法远程管理工具的滥用机制与防御策略研究

摘要 随着数字化办公环境的普及&#xff0c;网络攻击手段正经历从传统恶意软件向“无文件”及“合法工具滥用”的深刻转型。2026年3月&#xff0c;微软威胁情报团队披露了一系列针对美国税务季的复杂网络钓鱼活动&#xff0c;这些活动不仅利用了社会工程学原理窃取凭证&#xf…...

告别插件冲突!手把手教你手动安装Obsidian动态目录插件(Dynamic Table of Contents)

告别插件冲突&#xff01;Obsidian动态目录插件手动安装全指南 为什么需要手动安装动态目录插件&#xff1f; Obsidian作为一款强大的知识管理工具&#xff0c;其插件生态让用户能够高度自定义工作流。然而&#xff0c;插件间的兼容性问题常常成为用户痛点。许多用户习惯使用Fl…...

水晶排课 13.9.0.5:专注学校教务排课场景,集智能自动排课、灵活课表调整、多维度视图与便捷输出于一体,高效解决排课冲突,适用于中小学各类教务管理需求。

大家好&#xff0c;我是大飞哥。在学校教务管理中&#xff0c;排课是一项繁琐又容易出错的工作 —— 既要兼顾教师课时、班级需求&#xff0c;又要避免冲突&#xff0c;这款水晶排课 13.9.0.5就是专门解决这些问题的工具&#xff0c;它是一款专业高效的教务排课软件&#xff0c…...

RWKV7-1.5B-g1a效果对比:RWKV7-1.5B vs RWKV6-3B在中文摘要任务F1提升11%

RWKV7-1.5B-g1a效果对比&#xff1a;RWKV7-1.5B vs RWKV6-3B在中文摘要任务F1提升11% 1. 模型介绍 rwkv7-1.5B-g1a 是一个基于 RWKV-7 架构的多语言文本生成模型&#xff0c;特别适合处理基础问答、文案续写、简短总结和轻量中文对话任务。相比前代RWKV6-3B模型&#xff0c;它…...

DeEAR语音情感识别入门必看:三维度(唤醒度/自然度/韵律)原理与Gradio界面实操

DeEAR语音情感识别入门必看&#xff1a;三维度&#xff08;唤醒度/自然度/韵律&#xff09;原理与Gradio界面实操 1. 为什么需要语音情感识别 想象一下&#xff0c;当你接到客服电话时&#xff0c;对方的声音是机械冰冷的还是热情自然的&#xff1f;这种差异直接影响沟通效果…...

3大突破!MiroFish群体智能引擎如何重构分布式协作系统?

3大突破&#xff01;MiroFish群体智能引擎如何重构分布式协作系统&#xff1f; 【免费下载链接】MiroFish A Simple and Universal Swarm Intelligence Engine, Predicting Anything. 简洁通用的群体智能引擎&#xff0c;预测万物 项目地址: https://gitcode.com/GitHub_Tren…...

低延迟鸿蒙设备管控革新:HOScrcpy跨域投屏技术全解析

低延迟鸿蒙设备管控革新&#xff1a;HOScrcpy跨域投屏技术全解析 【免费下载链接】鸿蒙远程真机工具 该工具主要提供鸿蒙系统下基于视频流的投屏功能&#xff0c;帧率基本持平真机帧率&#xff0c;达到远程真机的效果。 项目地址: https://gitcode.com/OpenHarmonyToolkitsPl…...