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

平昌城乡与住房建设部网站阿里云建站视频教程

平昌城乡与住房建设部网站,阿里云建站视频教程,免费商标查询官网,青岛网络建站网站推广文章目录 前言kill -9 pid的危害如何优雅的停机理论步骤优雅方式1、kill -15 pid 命令停机2、ApplicationContext close停机3、actuator shutdown 停机4、ApplicationListener 监听延时停机 前言 相信很多同学都会用Kill -9 PID来杀死进程,如果用在我们微服务项目里…

文章目录

    • 前言
    • kill -9 pid的危害
    • 如何优雅的停机
      • 理论步骤
      • 优雅方式
        • 1、kill -15 pid 命令停机
        • 2、ApplicationContext close停机
        • 3、actuator shutdown 停机
        • 4、ApplicationListener 监听延时停机

前言

相信很多同学都会用Kill -9 PID来杀死进程,如果用在我们微服务项目里面,突然杀死进程会有什么后果?有没有其他的方式优雅的停机呢?今天,我们就来讨论下kill -9 pid 这个命令对微服务项目的影响,以及如何优雅的停机的问题。

kill -9 pid的危害

kill -9 属于暴利删除,直接杀死进程。对于微服务系统而言,直接判了死刑,直接从系统层面对进程进行了结束。微服务中的线程,根本没有反应的机会直接香消玉损。

比如前端发起的订单请求,后端springboot项目中的线程正在处理订单数据的保存。此时如果kill -9 pid 将微服务进程杀死,后端将不会有任何响应请求的机会,页面请求会立即中断出现异常情况。虽然一般对于后端事务数据库都会回滚,但是,页面出现异常毕竟会让用户体验度下降。

如何优雅的停机

理论步骤

1、停止接收请求和内部线程
2、判断是否有线程正在执行
3、等待正在执行的线程执行完毕
4、停止tomcat容器

优雅方式

1、kill -15 pid 命令停机

项目增加测试入口:

/*** 停机 测试* kill -15* kill -9* @return a* @author senfel* @date 2023/5/13 17:37*/
@GetMapping("test")
public void test(){log.error("测试方法进入开始===========");try {Thread.sleep(100000);} catch (InterruptedException e) {e.printStackTrace();}log.error("测试方法执行结束===========");
}

服务启动项目

[root@devops-01 tmp]# nohup java -jar demo.jar &
[11] 43451
[root@devops-01 tmp]# nohup: ignoring input and appending output to ‘nohup.out’

页面访问地址后服务器用kill -15 PID结束进程

[root@devops-01 tmp]# kill -15 43451

查看日志:
在这里插入图片描述

居然报错了,但是测试日志都打印出来了。为什么会报错呢?这就和sleep这个方法有关了,在线程休眠期间,当调用线程的interrupt方法的时候会导致sleep抛出异常,这里很明显就是kill -15 这个命令会让程序马上调用线程的interrupt方法,目的是为了让线程停止,虽然让线程停止,但线程什么时候停止还是线程自己决定。

kill -15 pid 会等待线程执行完并拒绝新的请求,如果有线程睡眠会抛出java.lang.InterruptedException异常。

2、ApplicationContext close停机

项目增加测试代码:

/*** shutdown* @author senfel* @version 1.0* @date 2023/5/13 18:04*/
@RestController
@Slf4j
public class ShutDownController implements ApplicationContextAware {private ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.context = applicationContext;}/*** 停机 ConfigurableApplicationContext方式* @return a* @author senfel* @date 2023/5/13 17:36*/@PostMapping(value = "shutdown")public void shutdown(){ConfigurableApplicationContext cyx = (ConfigurableApplicationContext) context;cyx.close();}
}

启动项目

[root@devops-01 tmp]# nohup java -jar demo.jar &
[15] 44001
[root@devops-01 tmp]# nohup: ignoring input and appending output to ‘nohup.out’

调用测试方法后,调用上下文主动停机接口/shutdown
查看服务日志:
在这里插入图片描述

同样的日志信息,表示调用上下文停机后会等待线程执行完并拒绝新的请求,如果有线程睡眠会抛出java.lang.InterruptedException异常。

3、actuator shutdown 停机

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置yml

management:endpoints:web:exposure:include: health,shutdownendpoint:shutdown:enabled: true

这种方式是通过引入依赖的方式停止服务,actuator提供了很多接口,比如健康检查,基本信息等等,
我们也可以使用他来优雅的停机。

调用接口测试//actuator/shutdown
查看日志:
在这里插入图片描述

查看日志同样是停机后会等待线程执行完并拒绝新的请求,如果有线程睡眠会抛出java.lang.InterruptedException异常。只不过页面会有提示,更加的友好。

在这里插入图片描述

4、ApplicationListener 监听延时停机

以上三种都是直接打断睡眠线程,那么有没有一种方式在阻断新请求的同时,让睡眠线程睡眠完成优雅停机呢?
有点,我们的ApplicationListener 可以监听到服务关闭事件,覆写事件并延时即可。

增加监听代码:

/*** GracefulShutdown* @author senfel* @version 1.0* @date 2023/5/13 19:40*/
@Slf4j
@Component
public class GracefulShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {private volatile Connector connector;@Overridepublic void customize(Connector connector) {this.connector = connector;}@Overridepublic void onApplicationEvent(ContextClosedEvent event) {this.connector.pause();Executor executor = this.connector.getProtocolHandler().getExecutor();if (executor instanceof ThreadPoolExecutor) {try {ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;threadPoolExecutor.shutdown();if (!threadPoolExecutor.awaitTermination(30, TimeUnit.SECONDS)) {log.error("Tomcat thread pool did not shut down gracefully within 30 seconds. Proceeding with forceful shutdown");}} catch (InterruptedException ex) {Thread.currentThread().interrupt();}}}
}

先请求带有睡眠代码的接口,然后停机,查看日志:
在这里插入图片描述

http://www.yayakq.cn/news/968292/

相关文章:

  • 个人网站可以做电商吗wordpress枚举用户名
  • 公司域名备案网站名称用动易建设网站教程
  • 网站开发项目组团队百度网络推广怎么做
  • 唐河微网站建设wordpress支付宝免插件
  • 长安网站建设制作公司六数字域名做网站好不好
  • 专门做招商的网站是什么网站建设流程代理商
  • dreamware怎么做网站天津代理记账
  • 不是营销型的网站广州网站建设公司兴田德润怎么样
  • 找家里做的工作上哪个网站手机制作软件
  • 网站大全2021网站做外链推广的常用方法
  • 简单公司网站网件路由器app 中文版
  • 公司网站突然打不开了微信网站开发js框架
  • 朋友做网站网站挣了好多钱网站建设怎么骗人
  • 长春网站设计团队虚拟资源交易商城wordpress
  • 一般网站的费用湖北seo服务
  • 公众号中微网站开发抖音网络营销案例分析
  • 汕头网站制作哪家强赤峰市住房和城乡建设局官方网站
  • 青岛网站设计公司排名做淘宝客为什么要建网站
  • 中建设计集团网站营销企业网站建设步骤
  • 重庆企业做网站多少钱网页转向功能网站
  • 校园网站建设项目总结报告wordpress在lnmp部署
  • 电商网站建设方面的毕业设计wordpress分类目录表
  • 河南专业网站建设公司推荐哪个网站可以接针织衫做单
  • 百度站长工具后台cms进行网站开发
  • 有哪些网站可以免费看熬夜必备以黄去黄
  • 网络营销热门岗位seo技术员
  • 石家庄网站制作系统中国造价工程建设管理协会网站
  • 海东市城市规划建设局网站备案审核网站显示500
  • 网站内容设计模板展示型网站建设的建议
  • 外网代理服务器网站温州在线制作网站