一种JAVA系统不间断运行方法、系统、存储介质与流程

文档序号:29089886发布日期:2022-03-02 02:28阅读:302来源:国知局
一种JAVA系统不间断运行方法、系统、存储介质与流程
一种java系统不间断运行方法、系统、存储介质
技术领域
1.本发明涉及java领域,具体指有一种java系统不间断运行方法、系统、存储介质。


背景技术:

2.在当下的技术环境中,所有系统,特别是b/s结构系统,在面临升级时都需要进行停机更新,具体操作需要运维人员执行“打包-上传-停机-备份-更新-日志记录-服务重启”等操作流程,若系统属于集群环境则需要重复多次以上操作流程,在以上工作中无可避免的会出现错误。同时,有些细小的漏洞或功能限制升级修改代码仅需要若干分钟,但升级部署可能需要几个小时。在集群环境中更新前还需要不断的切换负载均衡引擎路由配置来确保升级中的服务不可用,同时在升级过程中会增加其他环境的请求压力,在传统工作流程中,系统升级风险远远大于系统上线风险,也是所有工作人员最担心的环节。
3.大型网络架构大多采用java进行开发,java的执行逻辑是通过classloader将编译好的二进制文件加载到jvm的内存中进行执行,当下的技术环境为了更方便的管理java系统的bean,市面上的系统大多数都是用了spring框架作为系统基础框架来完成工作,而spring的单例特性实现逻辑是在程序启动时会自动初始化所有的bean对象,这就导致了无法灵活装载和卸载各个模块,即使能完成中途装载也无法使用spring的单例特性。
4.随着互联网的发展,越来越多的系统使用java进行开发,为了提升系统运行的健壮性和有效性,大型系统都使用调度总线的方式来切割系统的多个模块,封装独立服务,在系统需要升级或出现问题时仅替换部分模块来确保系统的可访问性,但这也极大的增加了系统的硬件成本和运维成本。
5.针对上述的现有技术存在的问题设计一种java系统不间断运行方法、系统、存储介质是本发明研究的目的。


技术实现要素:

6.针对上述现有技术存在的问题,本发明在于提供一种java系统不间断运行方法、系统、存储介质,能够有效解决上述现有技术存在的问题。
7.本发明的技术方案是:
8.一种java系统不间断运行方法,
9.基于系统集成结构,所述系统集成结构对不同的bean容器之间进行隔离;所述系统集成结构隔离插件与主程序之间的io;所述系统集成结构对不同的插件之间提供通讯接口,所述系统集成结构对插件和主容器之间提供通讯接口;
10.所述方法包含以下步骤:
11.扫描部署环境,并注册当前环境到设备管理中心;
12.当更新插件时,执行以下步骤:
13.停止待更新插件:注销所述bean容器与所述主程序之间的关联;释放插件与主程序之间的io与相应的jar文件之间的链接,断开待更新插件与其他插件之间的通讯接口,断
开待更新插件和主容器之间提供通讯接口;将待更新内部的模板引擎从主程序的渲染列表删除,完成停止;
14.启动新插件:扫描并关联bean容器,关联权限检查至主程序安全框架;将新插件与主程序之间的io链接到相应的jar文件,配置新插件与其他插件之间的通讯接口,配置新插件和主容器之间提供通讯接口;将新插件内部的模板引擎添加至主程序的渲染列表,完成启动,进而完成更新。
15.进一步地,所述系统集成结构对不同的bean容器之间进行隔离包括:
16.创建rootapplicationcontext作为容器管理的根节点;
17.创建pluginapplicationcontext插件模块容器管理,并将parent设置为root节点,实现bean容器之间的隔离。
18.进一步地,所述系统集成结构隔离插件与主程序之间的io包括:
19.在容器加载时,创建独立的classloader对象,隔离插件与主程序之间的io。
20.进一步地,所述断开插件与主程序之间的io与相应的jar文件之间的链接包括:
21.销毁所述classloader,释放io与相应的jar文件之间的链接;
22.所述将插件与主程序之间的io链接到相应的jar文件包括:
23.通过classloader将io链接到相应的jar文件。
24.进一步地,所述系统集成结构对不同的插件之间提供通讯接口包括:
25.在所述插件内建立applicationcontext对象,并将所述applicationcontext对象的classloader连接到插件内的jar文件,通过@caller对象与@supplier对象作为插件之间通讯的接口。
26.进一步地,所述系统集成结构对插件和主容器之间提供通讯接口包括:
27.将插件的applicationcontext对象设置为pluginapplicationcontext的子对象,调用多层父对象内部的bean实现对插件和主容器之间提供通讯接口。
28.进一步地,所述插件设置有状态标记。
29.进一步地,所述插件设置有监听器,所述系统集成结构对所述插件进行监听,获取所述插件生命周期。
30.进一步提供一种java系统不间断运行系统,基于系统集成结构,所述系统集成结构对不同的bean容器之间进行隔离;所述系统集成结构隔离插件与主程序之间的io;所述系统集成结构对不同的插件之间提供通讯接口,所述系统集成结构对插件和主容器之间提供通讯接口。
31.进一步提供一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现所述的一种java系统不间断运行方法。
32.因此,本发明提供以下的效果和/或优点:
33.本发明通过所述系统集成结构对不同的bean容器之间进行隔离;所述系统集成结构隔离插件与主程序之间的io;所述系统集成结构对不同的插件之间提供通讯接口,所述系统集成结构对插件和主容器之间提供通讯接口,从而实现了在更新插件时,可以快速、便捷地实现对插件进行更新,整个过程耗时大大缩短,从而实现java系统的不间断运行。
34.本发明因为插件结构将程序物理层面上切分成为了多个模块,自然提升了主程序的启动速度,同时每个插件模块在启动时仅需要载入独立的jar文件,插件首次装载至启动
完成时间不会大于100ms,插件启动时间不会大于10ms,插件更新时间系统要经历停止、卸载、新插件装载、插件启动,总时长不会大于100ms,真正解决了生产环境的无感知热升级部署。
35.本发明集群环境中添加新节点只需要部署主程序即可,系统启动后再后台将插件选入响应节点中插件引擎会自动从数据库中拉取对应的插件包,完成新节点的插件功能部署。
36.本发明兼容集群环境,兼容spring,确保spring所有功能可有效使用。将操作系统环境透明化,升级过程无需人工远程,脱离运维人员亦可升级。解决多容器管理部署管理复杂问题,全部交由插件引擎进行自动化部署、更新、卸载操作。使用插件模块在开发过程中,每个插件独立进行开发、打包、部署,开发过程中代码编写人员仅需要解读接口文档完成具体实现即可,不需要飞散精力解读主程序源代码与其他插件的源代码,大大提升了功能模块的清晰度与安全性。
37.应当明白,本发明的上文的概述和下面的详细说明是示例性和解释性的,并且意在提供对如要求保护的本发明的进一步的解释。
附图说明
38.图1为本发明的结构示意图。
39.图2为系统集成结构的示意图。
40.图3为插件容器与主容器的拓扑结构示意图。
41.图4为插件发布界面。
42.图5为系统启动后自动注册节点情况。
43.图6为系统启动后设备资源信息图。
44.图7为插件回滚界面。
具体实施方式
45.为了便于本领域技术人员理解,现将实施例结合附图对本发明的结构作进一步详细描述:应了解到,在本实施例中所提及的步骤,除特别说明其顺序的,均可依实际需要调整其前后顺序,甚至可同时或部分同时执行,
46.参考图1,
47.一种java系统不间断运行方法,
48.基于系统集成结构,所述系统集成结构对不同的bean容器之间进行隔离;所述系统集成结构隔离插件与主程序之间的io;所述系统集成结构对不同的插件之间提供通讯接口,所述系统集成结构对插件和主容器之间提供通讯接口,所述插件设置有监听器。
49.系统集成结构具体为:
50.参考图2,在spring framework启动时自动创建rootapplicationcontext作为容器管理的根节点,在spring framework启动完成后自动创建pluginapplicationcontext插件模块容器管理,并将parent设置为root节点,实现bean容器之间的隔离。每个classloader对象内部都会有一个parent属性指向它的父加载器。
51.本实施例中,通过spring框架提供了现代的基于java的企业应用程序在任何部署
平台的综合规划和配置模型。其中,spring framework是一个开源的java/java ee全功能栈(full-stack)的应用程序框架,是为解决企业应用程序开发复杂性而创建的。在通过applicationcontext作为spring framework中的容器管理的根节点,可以用来获取容器中的各种bean组件,注册监听事件,加载资源文件等功能。然后进一步建立pluginapplicationcontext插件模块容器管理,实现对插件进行状态标记,实现bean容器的声明,例如如果扫描到有@controller、@service、@repository、@component等注解的java类,就会将这些bean容易纳入spring容器管理。
52.然后,系统集成结构的容器在加载时,系统集成结构自动创建独立的classloader对象,用于/实现隔离插件与主程序之间的io。
53.本实施例中,classloader是用来加载class,它负责将class的字节码形式转换成内存形式的class对象。其中的class的字节码可以来自jar包里的*.class。每个class对象的内部都有一个classloader字段来标识自己是由哪个classloader加载的。
54.最后,系统集成结构对每个插件均会独立创建applicationcontext对象,并使用此环境对象的classloader连接到插件jar文件,通过相应的通讯协议设置插件之间通讯的接口。例如,插件引擎内部根据通信协议,将@caller对象和@supplier对象作为提供插件之间通讯的接口。每个插件的applicationcontext对象均是pluginapplicationcontext的子对象,可以随意调用多层父对象内部的bean实现插件与主容器之间的通讯。
55.通过上述的系统集成结构的特殊组成,实现了对不同的bean容器之间进行隔离,隔离插件与主程序之间的io,对不同的插件之间提供通讯接口,对插件和主容器之间提供通讯接口。
56.下面开始介绍本技术根据上述系统集成结构进行的控制,从而实现java系统不间断运行方法。
57.所述方法包含以下步骤:
58.s0,启动主程序,主程序自动加载插件引擎。
59.s1,扫描部署环境,并注册当前环境到设备管理中心。插件引擎扫描部署环境,并注册当前环境到设备管理中心,机制为ip、端口、设备编号,支持同一设备内集群部署,同时支持多设备多环境部署。
60.s2,通过插件引擎检查当前服务内的插件状态,根据状态对插件进行对应操作。操作至少包含启动插件、卸载插件、部署插件。所述插件设置有状态标记,例如,本实施例以@controller作为其中的一个标记,用于将插件内部的具体类作为用户端请求入口装载至主程序的mvc框架中,进一步扫描@controller类中的@requestmapping等注解作为url的直接请求地址,同时在主程序内标记此地址在插件成功启动后可以被用户访问。
61.通过步骤s2,实现了对系统集成结构进行启动,同时启动需要启动的正常插件。
62.s3,当更新插件时,执行以下步骤:
63.s3.1,停止待更新插件,包括以下步骤:
64.s3.1.1,注销所述bean容器与所述主程序之间的关联;具体为注销插件内所有@controller类型bean容器在主程序内的关联,同时移除模板渲染列表,触发事件,对卸载插件进行隔离备份。由于bean容器之间是相互隔离,因此注销所述bean容器与所述主程序之间的关联只需通过插件管理器检查classloader内关联的bean容器,并进行逐一释放即可。
65.s3.1.2,释放插件与主程序之间的io与相应的jar文件之间的链接;所述断开插件与主程序之间的io与相应的jar文件之间的链接具体为,销毁所述classloader,释放io与相应的jar文件之间的链接。通过销毁所述classloader,可以将对应的class进行卸载,经过销毁后,该类所有的实例都已经被gc,也就是jvm中不存在该class的任何实例。此时,加载该类的classloader已经被gc;该类的java.lang.class对象没有在任何地方被引用。当该类的class对象不再被引用之后,该类的生命周期也就结束了。由于插件与主程序之间的io是相互隔离的,因此插件管理器发送事件通知到okframework,用于执行用户自定义释放处理,然后classloader进行销毁,并释放关联io。
66.s3.1.3,断开待更新插件与其他插件之间的通讯接口,断开待更新插件和主容器之间提供通讯接口;插件注销后所有系统中的所有插件功能将立刻下线,但不影响其他插件与主程序功能。
67.s3.1.4,将待更新内部的模板引擎从主程序的渲染列表删除,完成停止;okframework更新各个设备的插件状态变更。
68.通过步骤s3.1,我们停止了待更新插件。接下来,将新插件进行启动,从而替换待更新插件,实现更新。
69.s3.2,启动新插件,启动新插件的方法与停止待更新插件的方法相仿,包括以下步骤:
70.s3.2.1,扫描并关联bean容器,关联权限检查至主程序安全框架;插件将@controller类型的bean容器进行扫描,并关联权限检查到主程序安全框架。此时,新插件初步启动成功。
71.s3.2.2,将新插件与主程序之间的io链接到相应的jar文件;具体为通过classloader将io链接到相应的jar文件。
72.s3.2.3,配置新插件与其他插件之间的通讯接口,配置新插件和主容器之间提供通讯接口;
73.s3.2.4,将新插件内部的模板引擎添加至主程序的渲染列表,成功启动的插件将内部的模板引擎添加至主程序的springmvc模板渲染列表,此时插件完成启动,插件启动完成后,触发事件。进而完成更新。
74.通过步骤s3.2即实现了插件的更新/升级操作。
75.s3.3,在数据库中留存所述待更新插件,当回退插件时,通过所述数据库调取所述待更新插件。插件的每次更新/升级,旧版本的插件均会在数据库中留存,方便进行历史插件的回退。
76.s4,通过所述系统集成结构对所述插件进行监听,获取所述插件生命周期。在插件管理后台中可以针对具体的容器进行不同的插件部署,以根据容器的性能匹配不同业务压力的插件。后台中可以查看每个插件的具体信息,例如名称、表示、版本号、作者、是否有页面组件、发布日期、启动时间等。
77.重复上述步骤s3,即可实现插件部署到具体容器后,插件引擎会异步启动插件,完成插件的装载操作,并触发相应的事件通知主程序与插件自身。
78.实验数据
79.通过本实施例提供的基于系统集成结构以及java系统不间断运行方法,对bean容
器进行一次实例化操作,如图4所示,获取若干新版本插件。新的插件在部署时仅需要将插件包文件拖入到“图4”的右上角区域,管理后台会自动完成插件的上传操作,随后将插件文件二进制装入数据库;在根据节点进行插件发布时,插件引擎会自动从数据库中还原插件文件到硬盘目录,实现了多节点自动装载的功能。一键式的上传操作完成集群部署,彻底摆脱了依赖运维人员人工操作的过程,所有流程均不影响主程序和其他模块的运行。
80.之后,自动向设备管理中心注册登记当前系统信息,增加节点时仅需要完成系统部署并启动即可,不需要进行集群配置工作。
81.集群环境中添加新节点只需要部署主程序即可,系统启动后再后台将插件选入响应节点中插件引擎会自动从数据库中拉取对应的插件包,完成新节点的插件功能部署。
82.插件首次装载至启动完成时间不会大于100ms,插件启动时间不会大于10ms,插件更新时间系统要经历停止、卸载、新插件装载、插件启动,总时长不会大于100ms。真正解决了生产环境的无感知热升级部署。
83.参考图6,图6为系统启动后设备资源信息图,实现了本发明提供的方法或系统对设备运转状态监控。
84.若在运行过程中发现程序bug,可以直接在历史版本中进行回退,如图7所示,则一键完成所有容器自动回退到特定版本的功能,大大降低了系统维护的成本与风险,所有操作全程不停机。
85.实施例二
86.一种java系统不间断运行系统,基于系统集成结构,所述系统集成结构对不同的bean容器之间进行隔离;所述系统集成结构隔离插件与主程序之间的io;所述系统集成结构对不同的插件之间提供通讯接口,所述系统集成结构对插件和主容器之间提供通讯接口。
87.实施例三
88.一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现所述的一种java系统不间断运行方法。
89.本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
90.本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
91.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或
多个方框中指定的功能。
92.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
93.应当注意的是,在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的部件或步骤。位于部件之前的单词“一”或“一个”不排除存在多个这样的部件。本发明可以借助于包括有若干不同部件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
94.尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
95.显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
96.在本发明的描述中,需要理解的是,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本发明的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
97.在本发明中,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”、“固定”等术语应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或成一体;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通或两个元件的相互作用关系。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。
98.在本发明中,除非另有明确的规定和限定,第一特征在第二特征“上”或“下”可以是第一和第二特征直接接触,或第一和第二特征通过中间媒介间接接触。而且,第一特征在第二特征“之上”、“上方”和“上面”可是第一特征在第二特征正上方或斜上方,或仅仅表示第一特征水平高度高于第二特征。第一特征在第二特征“之下”、“下方”和“下面”可以是第一特征在第二特征正下方或斜下方,或仅仅表示第一特征水平高度小于第二特征。
99.在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不应理解为必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1