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();}});}

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

 

          

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

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

相关文章

前端八股文 插槽的使用场景

什么是插槽 官方解释&#xff1a;Vue 实现了一套内容分发的 API&#xff0c;将 元素作为承载分发内容的出口。 大白话&#xff1a;插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用<slot> 表示&#xff0c;父组件可以在这个占位 符中填充任何模板代码&am…

苹果笔记本电脑能玩哪些游戏 苹果电脑可以玩的单机游戏推荐

苹果笔记本有着优美的外观和强大的性能。用户不仅可以使用苹果笔记本办公、剪辑&#xff0c;越来越多的用户开始关注苹果笔记本在游戏领域的表现&#xff0c;尤其是在大型游戏方面。本文将为你详细介绍苹果笔记本都能玩什么游戏&#xff0c;以及为你推荐苹果电脑可以玩的单机游…

Mybatis之动态sql、缓存、分页、配置数据源

SQL动态查询 if标签 当传递某个DTO时&#xff0c;需要根据某个属性是否存在而动态增加条件时&#xff0c;就可以使用if标签 <select id"getUser" resultType"user">select id, name, age, sex from user where 11<if test"userDto.name !…

EventBus原理分析

EventBus 是一个流行的事件发布/订阅框架&#xff0c;主要用于简化 Android 应用中不同组件之间的通信。它的设计基于观察者模式&#xff0c;可以有效地减少组件间的耦合性&#xff0c;使得代码更加模块化和可维护。 下面是 EventBus 的实现原理&#xff0c;结合其源码进行说明…

快到不可思议!Internet Download Manager下载器,让你的网速飞起来!

&#x1f31f; 快到不可思议&#xff01;Internet Download Manager下载器&#xff0c;让你的网速飞起来&#xff01;&#x1f680; 嗨喽&#xff0c;各位csdn的朋友们&#xff01;&#x1f44b;今天我要跟大家分享一个我超爱的下载神器——Internet Download Manager&#xff…

MySQL相关函数

SQL函数 聚合函数 定义&#xff1a;聚合函数作用与一组数据&#xff0c;并对一组数据返回一个值。 常用&#xff1a;AVG()、SUM()、MAX()、MIN()、COUNT()。 说明&#xff1a;聚合函数不能嵌套使用。 字符串函数 MYSQL中常用的字符串函数&#xff1a; 函数名作用concat(s1,s…

springboot+vue项目实战2024第三集修改用户信息

1.获取用户信息 GetMapping("/userInfo")// RequestHeader(name "Authorization") String tokenpublic Result<User> userInfo(){// Map<String, Object> map JwtUtil.parseToken(token);Map<String,Object> map ThreadLocalUti…

基于uni-app与图鸟UI的知识付费小程序模板

一、项目概述 在知识经济蓬勃发展的背景下&#xff0c;移动互联网成为知识传播与消费的重要渠道。本项目旨在利用前沿的前端技术栈——uni-app及高效UI框架图鸟UI&#xff0c;打造一款集多功能于一体的、面向广大求知者的知识付费平台移动端模板。该模板旨在简化开发流程&…

Java:分批查询

前言 最近遇到一个场景问题&#xff0c;就是基于SQL server数据库的规范&#xff0c;查询条件in如果个数超过2100个就会报错。由于是ORM映射框架采用的MybatisPlus 起初我想到的是基于 MybatisPlus 的 参数分割&#xff0c;测试还是不行&#xff0c;于是就直接基于 mybatis xm…

自定义业务非受检异常

【受检和非受检异常】 受检异常&#xff1a;当你需要强制调用者对异常异常进行处理时&#xff0c;抛出该类型异常。往往适用于开发通用的底层接口、或者调用第三方出现异常时。 非受检异常&#xff1a;当你不需要调用者关心时&#xff0c;抛出该类型异常。往往适用于普通的业务…

arm64架构下源码编译安装kafka —— 筑梦之路

一般来说&#xff0c;直接使用官方提供的二进制文件即可&#xff0c;没有必要使用源码编译安装的方式&#xff0c;而对于有特殊用途的&#xff0c;选择源码编译安装无疑是更好地选择。比如修改源码实现想要的功能&#xff0c;mirrormaker2保持topic名称不变。 git clone https…

缓存击穿、缓存穿透、缓存雪崩以及应对措施

1.缓存击穿 1.1概念 是指当某一key的缓存时间过期时大量并发量的请求同时访问此key&#xff0c;瞬间击穿服务器的直接访问数据库&#xff0c;让数据库处于负载的情况。 1.2解决措施 1.2.1异步定时更新 在缓存处理上&#xff0c;某一个热点数据的过期时间为一小时&#xff…

线性回归笔记

https://blog.51cto.com/u_16213589/7682076 残差图 多元回归-最小二乘法-残差分析笔记 一.多元线性回归模型的假设 我们需要进行以下六个假设&#xff0c;这些假设是经典的多元线性回归模型有效的前提&#xff1a; 1、因变量Y和自变量X1&#xff0c;X2&#xff0c;…&#…

Vue3.js“非原始值”响应式实现基本原理笔记(三)

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

BEV 之 LSS概要

1、 Lift 显示估计图像下采样&#xff08;16倍&#xff09;后的特征点深度&#xff0c;将2D图像提升到3D空间&#xff0c;得到图像特征的视锥&#xff08;点云&#xff09;。 根据图像和深度均分得到3D视锥索引 下采样16倍&#xff0c;得到特征图大小为 H x W, 每个特征点深…

机器视觉理论入门

文章目录 前言一、马尔视觉理论二、图形与图像三、图像基础名词总结 前言 Marr的视觉计算理论立足于计算机科学&#xff0c;系统地概括了心理物理学、神经生理学、临床神经病理学等方面已取得的所有重要成果&#xff0c;是迄今为止最为系统的视觉理论。Marr 的视觉计算理论虽然…

LiteOS GPIO操作

在源码工程中&#xff0c; 华为海思在hi_io.h头文件里已定义好表示每个IO口的宏定义&#xff0c;如&#xff1a; typedef enum {HI_IO_NAME_GPIO_0, /**< GPIO0 */HI_IO_NAME_GPIO_1, /**< GPIO1 */HI_IO_NAME_GPIO_2, /**< GPIO2 */... } 并且在此头文…

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

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

洛杉矶裸机云大宽带服务器的特性和优势

洛杉矶裸机云大宽带服务器是结合了物理服务器性能和云服务灵活性的高性能计算服务&#xff0c;为用户提供高效、安全的计算和存储能力。在了解如何使用洛杉矶裸机云大宽带服务器之前&#xff0c;需要了解其基本特性和优势。以下是对洛杉矶裸机云大宽带服务器的具体分析&#xf…

使用lv虚拟卷扩展磁盘

使用centos演示。 首先创建centos虚拟机。链接&#xff1a;VMWARE安装Centos8,并且使用ssh连接虚拟机-CSDN博客 1. 增加磁盘。 选中要扩容的虚拟机&#xff0c;右键选择设置&#xff0c;然后点击磁盘&#xff0c;选择添加。 这里选择NVM的磁盘。选择这种磁盘是为了保持与之前…