当前位置: 首页 > 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();}});}

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

 

          

http://www.lryc.cn/news/396895.html

相关文章:

  • 基于Make的c工程No compilation commands found报错
  • c++:面向对象的继承特性
  • skywalking-2-客户端-php的安装与使用
  • 图文讲解IDEA如何导入JDBC驱动包
  • java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Int
  • scrapy写爬虫
  • Mybatis study
  • 【论文速读】《面向深度学习的联合消息传递与自编码器》
  • 防御---001
  • DNS 杂谈
  • docker笔记2
  • 数字统计
  • Git 使用问题
  • JMH325【剑侠情缘3】第2版80级橙武网游单机更稳定亲测视频安装教学更新整合收集各类修改教学补丁兴趣可以慢慢探索
  • 大数据专业创新人才培养体系的探索与实践
  • MySQL 中的 DDL、DML、DQL 和 DCL
  • 基础架构服务API:降低成本,提升业务效益
  • Redis IO多路复用
  • 如何在Vue中实现拖拽功能?
  • 在Linux下使用Docker部署chirpstack
  • 《昇思25天学习打卡营第14天|计算机视觉-ShuffleNet图像分类》
  • 将字符串写入结构体变量中
  • iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦
  • PG在还没有pg_class的时候怎么访问基础系统表?
  • UnityHub 无法添加模块问题
  • python04——类(基础new)
  • 【Python百日进阶-Web开发-Peewee】Day296 - 查询示例(五)聚合2、递归
  • 闲话银行家舍入法,以及在程序中如何实现
  • 最短路径算法(算法篇)
  • 昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别