您当前的位置:首页 > 互联网教程

k8s服务优雅退出

发布时间:2025-05-25 07:56:44    发布人:远客网络

k8s服务优雅退出

一、k8s服务优雅退出

部署预估服务,rollingUpdate,使用Jmeter一直发压力请求

确认当前预估服务不支持优雅退出

发现light4j从1.5.15开始支持graceful shutdown

启动预估服务后,直接给java程序发SIGTERM信号,kill-SIGTERM JAVAPID,发现java程序能够优雅退出

但是通过RollingUpdate,发现java程序没有优雅退出

4.2与此同时,k8s会将POD从对应的service删除

4.3与此同时,有preStop hook的容器,会先执行preStop hook,如果preStop hook的时间超出了Grace period,kubelet会发送SIGTERM

4.4与此同时,没有preStop hook的容器,kubelet发送SIGTERM信号给启动进程

由于预估服务的镜像是通过bash script启动,而不是直接在Dockerfile里面执行java程序,由上面的知识可知,POD删除的时候,kubelet会发送SIGTERM信号给Bash Script进程。

现在会有一个问题,bash是不能传递信号的

所以需要在bash脚本里面捕获信号,并给java程序发SIGTERM信号

通过Bash Trap信号传递给JAVA进程后,发现RollingUpdate操作还是会有失败的请求,压测qps 500的时候,会有20个请求失败,表现为503, connect refuse

请求持续不断的过来,这个时候进程收到了SIGTERM信号后开始处理没有完成的请求,但是在切流量的过程中,就是kubelet发送SIGTERM信号和把POD从service拿掉的过程中,有一点请求漏过来了

所以需要确保切流量之后,进程收到SIGTERM之前,不要有流量进来。

再次测试,RollingUpdate几次,发现没有失败的请求了

二、Java学习路线

根据个人实际的经历,结合多种书籍,特别整理出了下面的java学习路线:

1、java基础:基础语法;面向对象(重点);集合框架(重点);常见类库API;

2、java界面编程:AWT;事件机制;Swing;

3、java高级知识:Annotation;IO和NIO、AIO;多线程、线程池;阻塞、非阻塞、异步网络通信;反射、动态代理;

4、SQL基础:基础SQL语句;基本查询;多表查询;子查询;结果集的交、并、差运算;

5、JDBC基础:常见数据库用法;JDBC操作常见数据库;RowSet与离线结果集;数据库连接池;事务管理、批处理;

6、JDBC进阶:存储过程、函数;触发器;理解JCBC的不足;掌握ORM工具优势和设计;

7、HTML基础:基本HTML标签;常见表单标签;DIV+CSS布局;

8、JavaScript知识:javascript基本语法;javascript基本对象特征;Json语法;深刻理解javascript的动态特征;

9、Dom和事件机制:DOM操作、编程;常见浏览器事件机制;掌握用户交互技巧;

10、XML基础:XML基础规则;DTD和SCheme;XML和样式单;

11、XML进阶:DOM、SAX和JAXP;dom4j、JDOM等工具;XQuery和XQJ;基于XML的数据交换;

12、Web Service:JAX_WS2、SAAJ规范;WSDL和SOAP协议;CXF框架、拦截器;CXF整合Spring;

13、Web编程基础:Tomcat服务器;Jsp语法、EL、内置对象;Servlet API;Servlet 3.0注解;Listener和Filter;

14、Web编程进阶:自定义标签库;MVC和DAO、Servlet、标签的作用;JSTL、DisplayTag等常见标签库用法;

15、Web编程原理:请求/响应、架构;Http协议;深刻理解Jsp运行原理;掌握Web容器底层的线程池、socket通信、调用Servlet的命令模式;

16、Ajax编程:XML HttpRequest和异步请求;发送请求和处理响应;常见Ajax库(Prototype、Jquery、ExtJs、DWR)用法;结合Http协议、异步请求深入研究ajax库的设计;

17、Android基础:Android开发调试环境;Android应用结构;界面组件与界面编程;资源管理;四大组件;

18、Android中级:文件IO和SQLite;图形、图像与动画;音频、视频的录制与播放;传感器编程;GPS应用;

19、Android高级:网络编程与Web Service;OpenGL_ES 3D开发;整合Google服务;使用NDK开发;java和c相互调试;

17、Struts2:MVC与struts体系;Action和Result;国际化和标签库;文件上传、下载;类型转换和输入检验;拦截器与插件开发;

18、Hibernate:ORM与持久化映射;关系映射、继承映射;延迟加载、性能调优;HQL查询、条件查询、SQL查询;二级缓存和查询缓存;

19、Spring:IoC与Bean配置、管理;Bean生命周期;SP、EL;AOP与事务权限控制;S2SH整合开发;Spring整合Jpa;

20、JSF<选学>:MVC与JSF设计理念;托管Bean与导航模型;JSF流程与事件机制;JSF标签库;类型转换与输入检验;

21、EJB及相关技术:JNPI与RMI;会话Bean及其生命周期;IoC与EJB拦截器;JMS与MDB;会话Bean与Web Service;

22、JPA:ORM框架与JPA规范;JPA注解与常用API;JTA事务与事务管理;JPQL查询;EJB、JPA整合;

23、Java EE实践与架构:Ant+Ivy或Maven;SVN、CVS;深刻理解10种以上设计模式;掌握各种Java EE架构及各自优势;

24、Workflow:Workflow规范及功能;JBPM等workflow框架;多次重构、反复思考;大型项目经验;

25、Java EE进阶:掌握各MVC框架运行原理、能开发类似框架;掌握Spring、HiveMind、AspectJ等框架原理、能开发类似工具;掌握Hibernate、iBatis等框架原理,能开发类似工具;深入研究EJB机制、大致了解应用服务器的实现;

三、java学习路线

1、目前在职Java开发,我给出的Java学习路线是:

2、JavaSE--数据库--jdbc----前端基础--Javaweb--Spring--Mybatis--Maven--Springboot---Reids--Springcloud--Linux--Git。

3、JavaSE:java基础,既然是基础,那肯定是最重要的,所以学习的时候也是需要重点学习的地方。

4、数据库:为什么要学数据库呢,因为我们的web数据需要持久化到磁盘上统一管理,而数据库无疑就是最好工具。目前主流的关系型数据库有mysql和oracle。我建议先学mysql。为什么呢mysql相比Oracle难度要低,而在国内应用场景又是最多的。

5、学会了mysql可以开发出一个完整的产品了,再学oracle都可以的。

6、前端基础:既然是做一个网站,那肯定不能是后台的数据,这样用户也是没办法看的,所以需要学习前端知识,把数据展示到页面上,而对于后台人员来说,学习阶段只需要学习前端基础就可以了。Html、js、css、jquery就可以了。当然到离开后期你也可以学学专门为后端人员定制的前端框架,比如,layui,easyui。如果还觉得不够可以学学前端专用框架。比如vue element,但是大前提是把自己的后台学到位了再学其他的。

7、Javaweb:jsp、servlet。为什么用了html还要学jsp呢。因为jsp和Java是无缝连接的。学了javaweb以后就可以自己做一个项目出来了,比如你想做一个个人网站。你可以给你们学校做一个教务管理系统都是可以的。

8、Spring:后台框架。为什么要用框架呢,可以快速开发,并且降低了耦合。Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用,Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。

9、Mybatis:持久层框架,当然持久层还有一个框架应用也很广的,那就是hibernate,一个是半自动的一个是全自动,而在国内应用最多的是mybatis,在国外用得最多的是hibernate,具体原因,大家可以百度查查。持久层框架有什么好处呢?如果你用原始的jdbc做开发,那你得自己来管理每一个连接,连接的打开和关闭,都是有开发人员来操作的,而且jdbc也没有实体的映射,需要我们写代码把值set进去,而用了框架这些都交给框架去做了。

10、Maven:mavne是一个工具,他的核心是pom.xml,这个配置文件,pom的全英文是project object model,意思是对象管理模型,也就是把项目也看成一个对象来操作了。给我们带来最直观的好处就是依赖问题,以前我们需要自己下载jar包,在构建到项目中,但是有了maven只需要写jar的依赖就可以自动给我们下载了。

11、Springboot:springboot是基于maven的,springboot最明显的特点就是开箱即用,也就是构建了一个springboot项目直接就可以做开发了,而不需要像我们自己配一个springmvc的框架一样的需要去配置大量的xml文件。让我们开发人员更着重于业务上的开发。

12、Redis:前面的mysql,oracle是关系型数据库,什么是关系型呢,就是一对一一对多多对多。有表与表之间有这些关系在,所以就叫关系型数据库,而redis就是非关系型数据库,也就是他存储数据之间是没有这些关系,他是以键值对 list set方式存储的。

13、对了,顺便在这里说一下,我目前是在职Java开发,如果你现在也在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中缺乏基础入门的视频教程,你都可以申请加入我的Java新手学习交流qun:前面输入是:前面输入是:七九八,中间输入是:八四四,最后输入是:六二零。里面聚集了很多正在学习Java技术的初学者,qun文件里面还有我做Java技术这段时间整理的一些学习手册,面试题,开发工具,PDF文档书籍教程,需要的话都可以来获取下载。

14、Springcloud:微服务框架,什么是微服务呢,就是把我们传统的单体服务拆分开了,就是将一个单体架构的应用按业务划分为一个个的独立运行的程序即服务,微服务架构其实就是一个分布式架构,具体的就不详细的讲了,因为这里面牵涉到的解决方案是灵活的。

15、Linux:linux的应用通常都是在底层,那我们上层开发人员为什么也要学它呢,其实我们的主要应用是在服务器上,也就是服务器的系统。当然系统也有Windows的,而Windows的和Linux的区别就是Windows服务器有问题是微软来解决,很方便:别人替你做,但也不方便:你遇到问题都得让他官方来解决漏洞,但是Linux就不一样,他是完全开源的,有问题自己马上就可以解决,只要开发人员能力够硬去改内核都是可以的。

16、Git:版本管理工具,与之对应的还有svn,最大的区别在于git是分布式系统,而svn不是分布式的,因为你们进企业以后都是协同开发也就是一个项目小组里面几个小伙伴一起开发一个项目,所以就要有一个代码的管理工具来保证你们做的不同模块可以整合,所以说git也是需要学的。