Java服务端热修复方法和系统与流程

文档序号:14175004阅读:459来源:国知局
Java服务端热修复方法和系统与流程

本申请要求于2017年08月15日提交中国专利局、申请号为201710696733.7、发明名称为“java服务端热修复方法和系统”的中国专利申请的优先权,其全部内容通过引用结合在本申请中。

本申请涉及互联网领域,具体涉及一种java服务端热修复方法。本申请同时涉及一种java服务端热修复装置,以及一种java服务端热修复系统,以及一种用于实现java服务端热修复方法的电子设备。



背景技术:

java作为适合于网络应用程序开发的编程语言,已经在互联网行业中得到广泛的应用。伴随着互联网业务越来越丰富,业务量越来越大,对网络服务端出现的问题的修复要求越来越高,例如紧急问题修复的解决时间要求越短越好,以及对用户的影响程度要求越小越好。一般企业互联网应用中,java服务端解决紧急问题往往要通过问题定位、确定解决方案、测试、重新发布一系列流程才能解决,流程的约束让紧急发布的时间消耗会很长,有时候仅仅为了修改一行代码,也要付出巨大的成本进行重新发布。

现有的java服务端热修复技术能够降低问题修复成本,所述热修复是指运行中在用户无感知的情况下修复软件漏洞,是一种快速、低成本修复产品软件版本缺陷的方式。现有的java服务端热修复方法一般通过java的动态挂载对问题进行热修复,具体为如下方案:使用运行之中的jvm所暴露的attachmentapi(attachmentapi是java官方工具的一部分,一般会打包到一个特殊的文件中),让第二个java进程来同jvm进行通信;使用java代理(即javaagent)定义第二参数来接收一个instrumentation的实例,然后再使用instrumentation的api对要修复的类进行重新定义,从而在不重启应用的前提下对问题进行修复。

现有java服务端热修复技术存在如下问题:这种热修复技术需要另外创建一个java进程和当前运行的jvm通信,对当前运行的jvm侵入性大,修复成本高。



技术实现要素:

本申请提供一种java服务端热修复方法,以解决现有热修复技术中对服务端当前运行的jvm侵入性大,修复成本高的问题。

本申请提供一种java服务端热修复方法,包括:

在java程序运行过程中,根据运行决策确定是否使用javascript修复代码替换特定java代码运行;若是,则进入下一步;

在java程序运行过程中,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行。

优选的,所述特定java代码,是java程序中包含的异常java代码或者是java程序所包含的待替换业务段对应的java代码。

优选的,所述异常java代码至少包括下述任一种异常:

代码异常场景;

逻辑错误场景;

算法错误场景。

优选的,所述javascript修复代码,是基于nashorn的javascript代码;所述nashorn是基于java原生jvm的轻量级javascript运行环境。

优选的,所述根据运行决策确定是否使用javascript修复代码替换特定java代码运行,此步骤中的javascript修复代码,是通过下述任一种方式得到的javascript修复代码:

使用javascript语言编写针对所述特定java代码的javascript修复代码;

生成针对所述特定java代码的java修复代码,然后将java修复代码自动转换为所述javascript修复代码。

优选的,所述将java修复代码自动转换为所述javascript修复代码,包括:通过对所述java修复代码的代码分析,进行下述转换:

将java类型依赖自动转换为javascript类型依赖;

将java强类型自动转换为javascript弱类型;

将spring上下文自动绑定到javascript运行时的上下文。

优选的,执行所述将java修复代码自动转换为所述javascript修复代码的步骤之前,包括:

针对java程序中包含的需要替换的特定java代码,生成替换所述需要替换的特定java代码的java修复代码;

下发转换命令,触发所述java修复代码自动转换为javascript修复代码的步骤。

优选的,所述在java程序运行过程中,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行,此步骤中的javascript修复代码,采用下述任一种方式获取:

在java程序运行过程中,进行业务处理时从java程序的本地缓存空间获取所述javascript修复代码;

在java程序运行过程中,进行业务处理时请求下发所述javascrip修复代码。

优选的,所述从java程序的本地缓存空间获取所述javascript修复代码,还包括下述任一种方式:

通过接入jar包定时将所述javascript修复代码同步到java程序,并且缓存在java程序的本地缓存空间;所述接入jar包集成在所述java程序中;

通过配置将所述javascript修复代码同步到所述java程序,并且缓存在java程序的本地缓存空间。

优选的,所述运行决策,采用下述任一种方式获取:

在java程序运行过程中,进行业务处理时从java程序的本地缓存空间获取所述运行决策;

在java程序运行过程中,进行业务处理时请求下发所述运行决策。

优选的,所述从java程序的本地缓存空间获取所述运行决策,还包括下述任一种方式:

通过接入jar包定时将所述运行决策同步到java程序,并且缓存在java程序的本地缓存空间;所述接入jar包集成在所述java程序中;

通过配置将所述运行决策同步到所述java程序,并且缓存在java程序的本地缓存空间。

优选的,所述运行决策,包括接收根据所述java程序的运行或部署状况而作的外部人工决策。

本申请提供一种java服务端热修复系统,包括:管理模块和修复模块;其中,

管理模块,用于将运行决策及运行代码下发到所述修复模块;所述运行代码包含用于替换特定java代码的相应的javascript修复代码;所述运行决策,包含是否在运行中使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行的相关信息;所述特定java代码,是java程序中包含的异常java代码或者是java程序所包含的待替换业务段对应的java代码;

修复模块,用于在java业务系统运行过程中,根据所述运行决策,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行。

优选的,包括代码转换模块,用于将java修复代码自动转换为相应javascript修复代码并提供给所述管理模块;所述javascript修复代码通过所述管理模块提供给所述修复模块使用;所述java修复代码,是针对所述特定java代码生成的java代码。

优选的,包括配置模块,用于向管理模块提供配置机制,所述管理模块通过所述配置机制触发所述代码转换模块将所述java修复代码转换为相应的javascript修复代码,所述管理模块还通过所述配置机制将所述运行决策和所述javascript修复代码同步到所述修复模块。

优选的,包括代码仓库模块,用于存放所述java修复代码供所述代码转换模块使用。

优选的,包括决策模块,用于生成所述运行决策,包括接收根据所述java程序的运行或部署状况而作的外部人工决策,所述运行决策用于通过所述管理模块下发给所述修复模块使用。

优选的,包括接入模块,用于提供通信服务,所述管理模块通过所述接入模块将所述运行决策和所述javascript修复代码定时同步到所述修复模块。

优选的,包括缓存模块,用于将所述运行决策和所述javascript修复代码缓存到java业务系统的本地缓存空间。

本申请同时提供一种java服务端热修复装置,包括:

管理单元,用于在java程序运行过程中,根据运行决策确定是否使用javascript修复代码替换特定java代码运行;若是,则进入下一步;

修复单元,用于在java程序运行过程中,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行。

本申请同时提供一种电子设备,包括:

存储器,以及处理器;

所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:

在java程序运行过程中,根据运行决策确定是否使用javascript修复代码替换特定java代码运行;若是,则进入下一步;

在java程序运行过程中,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行。与现有技术相比,本申请具有以下优点:

本申请提供的一种java服务端热修复方法、装置及电子设备;上述方法和装置以及电子设备,通过在java程序运行过程中,根据运行决策确定是否使用javascript修复代码替换特定java代码运行;若是,则在java程序运行过程中,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行。

上述技术方案,利用了javascript作为动态脚本语言的特性以及jdk提供的javascript引擎实现了对java程序的在线热修复,将javascript编译成java字节码在jvm中执行,因此在使用javascript代码替代相应的java代码运行时,不需要另起一个进程与jvm通信,对java程序当前运行的jvm没有侵入性,从而解决了现有热修复技术中对服务端当前运行的jvm侵入性大,修复成本高的问题。

附图说明

图1是一种java服务端热修复方法的流程图;

图2是一种java服务端热修复系统的示意图;

图3是一种java服务端热修复装置的示意图;

图4是一种用于实现java服务端热修复方法的电子设备的示意图。

具体实施方式

在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。

本申请提供一种java服务端热修复方法。本申请同时提供一种java服务端热修复系统。本申请同时涉及一种java服务端热修复装置以及一种用于实现java服务端热修复方法的电子设备。在下面的实施例中逐一进行详细说明。

本申请其一实施例提供一种java服务端热修复方法。

以下结合图1对本申请其一实施例提供的一种java服务端热修复方法进行说明。

图1是本申请其一实施例提供的一种java服务端热修复方法的处理流程示意图。

互联网行业中java作为主流的网络编程语言,广泛用于互联网应用产品的开发。实际应用中,作为复杂的软件产品,java服务端产品虽然会经过各个产品阶段的详细的测试验证才发布并部署到网络上,但是仍然难以避免出现bug,所以会一般互联网应用陆续发布新版本以解决问题。在持续交付阶段,java服务端产品可以方便的重新部署一个新的版本,但是一旦正式上网运行后,多数情况下重新部署过程会比较复杂,并且往往不允许停机。伴随着业务量增大,java服务端的问题修复的代价越来越高,采用热修复技术对服务端问题在用户无感知情况下进行快速、低成本修复,能给企业带来良好的收益。

本申请提供的java服务端热修复系统,是借助jdk8提供的java的嵌入式javascript引擎nashorn实现javascript和java相互调用,在运行中调用javascript代码对java业务中的bug进行问题修复,这样不需要另起一个java进程和jvm进行通信,从而对java业务运行的原生jvm没有侵入性。

所述java服务端,是用java语言及相应的框架开发的为客户端提供服务的应用程序,包括向客户端提供资源,保存客户端数据等。实际应用中,用java技术实现web互联网领域的服务器,是javaweb服务端,根据实际情况,可以直接用servlet开发服务端应用程序或者用框架开发,例如:spring框架等。

所述javascript,是一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为javascript引擎。

所述jdk(javadevelopmentkit),是java语言的软件开发工具包,包含多种基本组件,例如编译器javac,将java源程序编译成字节码,打包工具jar等。jdk对应不同的使用场景有不同类型的版本(edition),例如,标准版j2se(standardedition)或者javase,企业版(enterpriseedition)j2ee或者javaee,用于移动设备及嵌入设备java应用程序的(microedition)j2me或者javame,通过jdk能编译java程序。当然,运行java程序则要确保已安装了相应的jre(即java运行环境)。jdk发展到现在推出了多个版本(version),从jdk6开始捆绑基于rhino的javascript引擎,允许将javascript代码嵌入到java中,直到jdk8,提供了更高性能的嵌入式javascript引擎nashorn,加强了对于javascript和java的相互调用的支持。

所述jvm(javavirtualmachine),即java虚拟机,是通过在实际的计算机上仿真模拟各种计算机功能实现的一个虚构出来的计算机,它提供了java语言的平台无关性。jvm有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统,其主要是解释自己的指令集(即字节码)并映射到本地的cpu的指令集或操作系统的系统调用。因此,java语言编译程序只需要针对java源代码生成在jvm上运行的字节码,jvm在执行字节码时,把字节码解释成具体平台上(例如windows、linux)的机器指令执行,这样屏蔽了与具体平台相关的信息,实现了java语言在多种平台上不加修改地运行的特性。

所述侵入性,是指影响范围或者依赖性,在本申请中对原生jvm没有侵入性,是指不需要和jvm进行通信,因此对于java程序当前运行环境的jvm没有影响,也不依赖于当前运行的jvm。

由于jdk8平台对nashorn的有力支持,基于nashorn实现的服务端热修复技术,让紧急问题修复无需通过重新发布即可得到解决。nashorn使用基于jsr292的语言特性,将javascript编译成java字节码,从而允许在java中嵌入javascript代码,nashorn允许在javascript中调用java类,访问类并创建实例,还可以继承类,调用类的静态方法,这些特点提供了使用javascript代码替代相应的java代码运行的机制,并且在java程序中能够以编程的方式使用nashornjavascript引擎。例如,nashorn支持java代码直接调用定义在脚本文件中javascript函数,可以把java对象作为函数的参数且在调用函数的java方法中接收返回的数据;还以传递任意java对象而不会在javascript这边丢失类型信息;脚本本身是在jvm虚拟机中执行的,因此可以完全利用nashorn引擎的javaapi和外部库的强大功能。

本申请提供的一种java服务端热修复系统的实施例,以java业务系统(即java程序)中的某个业务出现bug为例来进行说明。应当说明,使用本申请提供的jav服务端热修复系统,同样可以实现对java程序的局部热升级,如对某个程序段的升级。

步骤s101,在java程序运行过程中,根据运行决策确定是否使用javascript修复代码替换特定java代码运行;若是,则进入下一步。

本实施例所述的java程序运行过程,其景点场景是某个服务器上运行的java应用程序,实际是指所述应用程序运行过程中产生的进程。

所谓在java程序运行过程中,是指java程序仍然在线正常运行,所谓热修复,就是指程序并未停止的情况实现对程序运行的修复,实际修复的不是静态的java程序代码,而是该java程序产生的进程在运行中所依据的代码。

所述运行决策,是根据对java服务端在现网运行情况的监控及运维过程中暴露的故障及主动发现的java程序中的缺陷,分析其影响程度并确定的现网修复决策,包括该故障或缺陷的修复时机、修复手段以及其他修复相关信息。实际应用中,首先要针对发现的故障或缺陷的严重程度、影响范围等因素划分问题等级,例如,导致宕机或业务无法使用的为致命问题,必须紧急修复;导致部分用户在业务需要多次尝试才能使用的为严重问题;导致个别用户访问高速业务忙时速率下降的为一般问题。再根据问题等级确定进一步的修复时机及修复手段,这些信息包含在所述运行决策中,例如,是否可以继续带问题运行直到在下一个新版本中修复,还是需要在不中断业务的情况下进行线上紧急修复,还是需要在业务闲时进行线上修复等。如果确定需要线上热修复,则线下修改对应的业务java代码得到java修复代码(也可以说是补丁代码),并转换生成对应的javascript修复代码,并在所述运行决策中指定java程序中在运行过程中执行到该故障或缺陷对应的特定java代码时,需要使用相应的javascript修复代码替换其运行。

当线上运行中的java业务系统的某个业务出现bug需要修复时,定位问题并确定修复方案后,通过修改需要修复的业务对应的特定java代码,得到java修复代码,通过配置触发将java修复代码自动转换成对应的javascript修复代码,并作出运行决策指定该业务要运行对应的javascript修复代码,这些javascript修复代码和运行决策信息,定时刷新到线上运行的java程序的本地缓存空间,当用户发起的业务请求到达java程序中相应的业务模块处理时,java程序根据运行决策由所述javascript修复代码替代原部署的特定java代码运行,从而完成业务bug修复。这样,由于javascript是动态脚本,因此不需要重新部署,不需要重启应用,在java程序运行过程中完成对异常的修复,在异常修复过程中,不影响用户继续使用业务,降低修复成本,提供良好的用户体验,避免了重新部署和重启应用耗时长带来的问题。

另外,本申请中所述javascript修复代码是广义上的修复,除了应用于上述的java业务系统的出现bug需要修复场景中,也可以应用于当java业务系统中的某个业务用新业务替换时的业务替换场景中,也就是说在旧业务替换场景中,采用本申请提供的方法,在java程序运行过程中,根据运行决策,将针对待替换的旧业务的特定java代码,使用相应的javascript新业务代码替换所述特定java代码运行,这些所述javascript新业务代码也称为javascript修复代码。例如,旧业务处理流程不合理需要调整为新业务,针对新业务的java代码完成开发测试后上线运行时,也可以通过本申请提供的方法,在不重新部署不重启应用的情况下,对旧业务实现热替换。

因此,本步骤中所述特定java代码,是java程序中包含的异常java代码或者是java程序所包含的待替换业务段对应的java代码;其中,所述异常java代码至少包括下述任一种异常:

代码异常场景;

逻辑错误场景;

算法错误场景。

所述代码异常场景,是指编写的源代码中存在的缺陷,由于测试手段不能全覆盖等原因在单元测试、集成测试、功能测试、预开局各个阶段的验证中没有暴露出来从而遗留到了现网,例如,字符串打字错误、if语句遗漏then分支。

所述逻辑错误,是指程序运行的结果与预期设想的不一致,通常出现逻辑错误的程序能正常运行,系统不会给出提示信息,比较难以发现。现网实际情况往往比测试环境复杂的多,在一些流程中会触发此类缺陷。例如控制程序流程分支中的逻辑运算符使用错误,可能在测试例中未能触发而遗漏到了现网。

所述算法错误,是指程序执行中使用的某些算法存在缺陷,在压力和性能测试中未触发这些缺陷而遗漏到了现网。

举例如下:假设有一个正在运行的java应用程序,通过校验http请求中的x-priority头部,来执行服务器的特殊处理。该校验使用下面的工具类来实现:

“x-pirority”拼写错误导致头部验证无法通过,这样的错误可能会在应用上线运行的时候才被发现,其中头通过另外一个应用生成并没有拼写错误。当不允许停机重启的情况下,重新部署过程可能比较很困难,可以采用本申请提供的方法解决问题。

本申请提供的实施例中,java业务系统在运行过程中根据所述运行决策确定运行javascript修复代码替换特定java代码运行,其中,所述javascript修复代码,是基于nashorn的javascript代码;所述nashorn是基于java原生jvm的轻量级javascript运行环境。nashorn能将javascript编译成java字节码传递到jvm,性能比较高。实际应用中,可以通过下述任一种方式得到的javascript修复代码:

方式一、使用javascript语言编写针对所述特定java代码的javascript修复代码;

方式二、生成针对所述特定java代码的java修复代码,然后将java修复代码自动转换为所述javascript修复代码。在编程语言能力允许的情况下,即不考虑编程语言门槛的情况下,可以针对java业务系统中暴露出的bug直接使用javascript语言编写用于修复该bug的javascript代码,而不通过使用java代码自动转换为javascript代码;当然,也可以在java业务系统中的问题定位后,基于原包含该问题的java代码进行修改以修复问题,将修改后得到的java修复代码自动转换为相应javascript修复代码。

本实施例中,采用方式二实现将java修复代码自动转换为所述javascript修复代码,需要开发代码自动转换工具或者自动转换的功能模块进行处理,包括:通过对所述java修复代码的代码分析,进行下述转换:将java类型依赖自动转换为javascript类型依赖;将java强类型自动转换为javascript弱类型;将spring上下文自动绑定到javascript运行时的上下文。

所述java类型依赖,是指一个java类对于另一个java类的依赖,例如,employee类中有一个方法叫做takemoney(bankbank)这个方法,在这个方法的参数中用到了bank这个类,那么这个时候可以说employee类依赖了bank这个类,如果bank这个类发生了变化那么会对employee这个类造成影响。在java代码到javascript代码的转换中需要分析这种依赖关系,并在转换后的javascript代码中要保持原有的依赖关系。

所述javascript类型依赖,是指javascript类之间的依赖关系,以及javascript代码和java代码相互调用时与java类之间的依赖关系。javascript语言在早期不支持定义类,但是可以通过一些方法模拟类实现面向对象的编程,例如,用构造函数、原型方法等模拟实现一个类,javascript语言的ecmascript6规范开始引入了类,提供一个更简单和更清晰的语法创建对象并处理继承。在将java代码转换到javascript代码时需要注意类的实现及依赖关系的转换,需要说明的是,nashorn支持的ecmascript5.1规范中还没有引入类,需要模拟类。

所述java强类型,是指java语言是强类型语言,在java中变量类型有多种,例如intcharfloatbooleanstring等,声明变量时必须用相应的类型声明,不同类型之间一般不透明地隐式转换,不同类型相互转换时需要强制转换。例如需要一个字符串,必须使用string来声明而不能用其他的例如int,相互之间也没有隐式转换。

所述javascript弱类型,是指javascript语言中不对类型进行强制限定,为变量赋值时会自动判断类型并进行隐式转换。例如声明任何变量都用var,而不进行强制限定。

所谓上下文,是一种属性的有序序列,为驻留在环境内的对象定义环境,对于进程而言,上下文就是进程执行时的环境。所述spring上下文,是指应用启动时spring框架会读取一个配置文件将上下文装载到内存,提供其运行时环境,这些上下文信息包括了服务,例如电子邮件、校验和调度功能等。所谓spring框架是使用基本的javabean代替ejb(enterprisejavabean,javaee服务器端组件模型)的容器框架,提供了更多的企业应用功能,解决企业软件应用开发的复杂性。所述javascript运行时上下文,是指javascript代码在执行时的环境。由于应用启动时spring框架会读取它的配置文件装载上下文到内存,这构成java程序运行的当前环境部分信息,java代码转换到javascript代码时需要分析运行时上下文,将其对应到javascript替代java运行时的上下文环境。

具体举例如下:

将java代码的boolean对象转换为javascript布尔值;

所有java.lang.number包装对象转换为javascript数字,包括java的byte\short\integer和\long\float\double,以及java.math.biginteger和java.math.bigdouble;

java的character和string对象转换为javascript字符串;

java空值转换为javascript的空值;

通过java代码得到spring上下文,在javascript中执行call或apply或bind方法绑定运行时上下文,其中,spring上下文在运行时可以得到,启动容器时通过监听器获得上下文。

实际应用中,执行所述将java修复代码自动转换为所述javascript修复代码的步骤之前,包括:

针对java程序中包含的需要替换的特定java代码,生成替换所述需要替换的特定java代码的java修复代码;

下发转换命令,触发所述java修复代码自动转换为javascript修复代码的步骤。经过上述处理,得到用于替换所述特定java代码运行的所述javascript修复代码。

步骤s102,在java程序运行过程中,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行。

在完成用于修复bug的java修复代码转换成基于nashorn的javascript修复代码后,如果该bug的处理决策为在java业务系统运行过程中使用javascript修复代码替换相应的特定java代码运行进行相应业务处理,则java业务系统运行过程中,针对业务请求进行前置处理后,当进行到该业务处理时,获取此步骤中的javascript修复代码,采用下述任一种方式获取:

方式一:在java程序运行过程中,进行业务处理时从java程序的本地缓存空间获取所述javascript修复代码;

方式二:在java程序运行过程中,进行业务处理时请求下发所述javascrip修复代码。

本实施例中,采用方式一处理,节约系统运行的时间成本,提高处理效率。其中,java业务系统在其本地缓存空间缓存的所述javascript修复代码,是通过接入jar包定时同步并且缓存到所述java程序本地的javascript修复代码。

所述接入jar包集成在所述java程序中,是java业务系统中的一些类,本实施例中的jar包提供通信服务,用于传送javascript代码和运行决策信息。

另外,java业务系统在其本地缓存空间缓存的所述javascript修复代码,也可以通过配置将所述javascript修复代码同步到所述java程序,并且缓存在java程序的本地缓存空间。

所述本地缓存空间,是应用程序运行的本地的一块存储空间,一般内存或者固态硬盘或者机械硬盘均可以。本实施例中,所述本地缓存空间是java程序运行的jvm的内存中划出的一部分空间,具体的放在jvm的heap区域,将数据放到应用的本地缓存中,可以提升访问效率,减少网络消耗。

本申请实施例中,java业务系统的运行决策,包括接收根据所述java程序的运行或部署状况而作的外部人工决策。在作出运行决策后,通过配置触发将针对bug修改得到的java修复代码自动转换为javascript修复代码,与用于修复业务或者替换业务的替代特定java代码运行的javascript修复代码一样,该运行决策也会定时刷新到java业务系统的本地缓存空间,包括下述任一种方式:

方式一:通过接入jar包定时将所述运行决策同步到java程序,并且缓存在java程序的本地缓存空间;所述接入jar包集成在所述java程序中;

方式二:通过配置将所述运行决策同步到所述java程序,并且缓存在java程序的本地缓存空间。具体的,本实施例采用方式一,以减少java业务系统运行中和其他程序或者设备模块的交互,提升处理效率。

所述外部人工决策是根据人工运营作出的处理决策,所谓人工运营是指人员操控的运营,在未达到系统完全自运维、自修复的阶段,故障发现、定位、解决一般需要人员干预。

具体举例如下:

运维人员通过jdk性能监控发现用户使用某个线上功能存在内存占用缓慢升高问题,而在测试环境中并未出现此问题,运维人员经过分析发现访问某段java代码对应的url时由于线上环境和测试环境数据源不同而导致测试环境中未暴露问题,但是线上处理中某些情况下有对象虽然不再被使用,但仍然被引用导致异常;确认问题影响程度及修复方案后,确定需要进行紧急修复,首先修改对应的业务java代码,并通过脚本配置触发java修复代码转换成javascript修复代码,并将使用javascript修复代码代替该业务所对应的原部署的特定java代码运行的运行决策以及转换生成的javascript修复代码定时刷新到java业务系统并缓存在本地缓存空间,例如,每1小时刷一次,定时刷新能提高运行效率;当然对于非常紧急的情况,也可以人工下发运行决策及javascript修复代码;当java业务系统接收一个用户业务请求后,首先对该请求进行一些前置处理,如请求消息的解析、校验等,前置处理完成后,转入业务处理,业务处理过程中,首先请求运行决策,修复模块从本地缓存空间读取到本次执行的运行决策信息,根据运行决策判断下一步所运行的代码,如果是javascript修复代码,则再从本地缓存空间中读取并执行相应的javascript脚本;当异常造成的问题在未严重到需要热修复的情况下,决策信息是继续执行原部署的java代码时,则继续运行原来的java代码。

另外,java业务系统还可以通过下述方式获取所述运行决策:在java程序运行过程中,进行业务处理时请求下发所述运行决策。

由于nashorn在java8平台的有力支持,基于nashorn实现的服务端热修复技术,让紧急问题修复无需通过发布即可得到解决,并且可以避免现有的类热替换的修复技术中可能出现的应用程序短时间性能下降问题,类热替换由于jvm可能会在应用类重定义时执行完全的垃圾回收,导致应用程序短时间性能下降,而基于nashorn的javascript修复代码进行修复java业务时,脚本本身是在jvm虚拟机中执行的,不会触发完全的垃圾回收,不会影响性能。

以本申请提供的一种java服务端热修复方法的实施例为基础,本申请另外提供了一种java服务端热修复系统的实施例。由于系统实施例是以方法实施例为基础,所以描述得比较简单,相关的部分请参见方法实施例对应的说明。

图2所示的本申请提供的一种java服务端热修复系统的实施例,包括:管理模块201和修复模块202。具体实施时,修复模块是java业务系统的一个组成部分,当java业务系统所包含的某段运行中的java代码或者某个业务出现bug,例如,发现代码bug、逻辑错误、算法错误等,运维人员通过java业务监控告警分析、业务例行排查、用户投诉反馈业务异常等发现业务故障后,经过一系列手段定位问题并且发现问题需要在不中断业务的情况下进行线上紧急修复,修复模块和管理模块协同处理,在不重启、不重新部署的情况下完成bug修复。

所述管理模块201,用于将运行决策及运行代码下发到所述修复模块;所述运行代码包含用于替换特定java代码的相应的javascript修复代码;所述运行决策,包含是否在运行中使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行的相关信息;所述特定java代码,是java程序中包含的异常java代码或者是java程序所包含的待替换业务段对应的java代码。

所述修复模块202,用于在java业务系统运行过程中,根据所述运行决策,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行。

本实施例中,所述修复模块202在java业务系统运行过程中根据所述运行决策确定是否运行所述javascript修复代码;所述运行决策包含确定是否使用javascript修复代码代替相应的特定java代码运行的信息,若是,则所述java业务系统运行所述的javascript修复代码;若否,则保持运行原部署的所述特定java代码。

可选的,所述java服务端热修复系统包括代码转换模块203,用于将java修复代码自动转换为相应javascript修复代码并提供给所述管理模块;所述javascript修复代码通过所述管理模块提供给所述修复模块使用;所述java修复代码,是针对所述特定java代码生成的java代码。

具体的实现代码自动转换的方法已经在本申请提供的一种java服务端热修复方法中详细描述,此处不再赘述。

需要说明的是,所述java业务运行模块中已经部署的现有业务功能需要使用新业务功能进行替换时,所述新业务功能对应的java业务替换代码,也可以通过所述代码转换模块自动转换为javascript新业务代码,这些javascript新业务代码也统称为javascript修复代码,从而应用于对业务进行热替换的场景。

可选的,所述java服务端热修复系统包括配置模块204,用于向管理模块提供配置机制,所述管理模块通过所述配置机制触发所述代码转换模块将所述java修复代码转换为相应的javascript修复代码,所述管理模块还通过所述配置机制将所述运行决策和所述javascript修复代码同步到所述修复模块。

具体的,本申请提供的实施例中,所述管理模块是基于java的脚本管理后台,所述代码转换模块实际由javascript工厂完成代码转换功能,实际实施时还包括:配置模块,来提供配置通道;通过所述配置通道给javascript工厂下发转换命令,javascript工厂接收到所述转换命令后,将所述java修复代码转换生成所述javascript修复代码;另外,还通过所述配置通道将运行决策下发到java业务系统。

可选的,所述java服务端热修复系统包括代码仓库模块205,用于存放所述java修复代码供所述java修复代码提供给所述代码转换模块使用。

实际应用中,java服务端还包括代码仓库,用于存放java应用产品的代码,在发现java业务的问题后,java应用产品的开发或维护人员定位问题并修改,生成的用于修复存在异常的java业务的对应的java代码会存放在代码仓库中。另外,如果运行中的已部署java业务需要替换时,也会将代码仓库中的相应的java业务代码更新为用于替换该待替换业务的新业务所对应的java代码。一般情况下,所述代码仓库,还用于存放java业务系统对应的java代码。

可选的,所述java服务端热修复系统包括决策模块206,用于生成所述运行决策,包括接收根据所述java程序的运行或部署状况而作的外部人工决策,所述运行决策用于通过所述管理模块下发给所述修复模块使用。

所述运行决策及所述人工运营在本申请提供的一种java服务端热修复方法的实施例中已经详细描述,此处不再赘述。

具体的,运维人员通过java业务监控告警分析、业务例行排查、用户投诉反馈业务异常等发现业务故障后,经过一系列手段定位问题并且发现问题需要在不中断业务的情况下进行线上紧急修复时,制定紧急修复方案后,修改对应的业务java代码得到java修复代码(也可以说是补丁代码),并通过所述管理模块采用配置方式将java修复代码自动转换生成对应的javascript修复代码,通过所述决策模块指定该业务代码启用javascript修复代码。

可选的,所述java服务端热修复系统包括接入模块207,用于提供通信服务,所述管理模块通过所述接入模块将所述运行决策和所述javascript修复代码定时同步到所述修复模块。

本申请提供的实施例中,由所述管理模块输出近端接入jar包供java业务系统集成到本地,所述近端接入jar包,用于提供所述java业务系统和所述管理模块之间的通信服务。所述决策模块接收运维或者开发人员根据问题修复方案的外部决策生成所述运行决策,并通过所述管理模块及所述近端接入jar包将所述运行决策下发到所述修复模块;上述的转换生成的javascript修复代码也会在转换完成后通过所述近端接入jar包下发到所述修复模块。

可选的,所述java服务端热修复系统包括缓存模块208,用于将所述运行决策和所述javascript修复代码缓存到java业务系统的本地缓存空间。

具体而言,本申请提供的实施例中,所述java业务系统,通过集成所述接入模块提供的近端接入jar包来接入服务,并通过所述管理模块的远端服务获取到用于业务修复的javascript修复代码,缓存在java业务系统的近端,同时还通过远端服务获取所述运行决策,缓存在java业务系统的近端。在业务运行过程中,业务请求到达java业务系统经过一系列前置处理后,当进行到业务处理时请求运行决策确定当前是否运行javascript修复代码,从java业务系统的本地缓存获取到缓存的运行决策,如果是,则从本地缓存空间获取业务对应的javascript修复代码运行,完成系统bug的修复;如果不是,则仍然运行原部署的特定java代码,最后再经过后置处理完成业务输出。

此外,所述java业务系统,还可以采用下述运行机制:在运行过程中,根据业务请求进行处理业务时向所述管理模块请求所述javascript修复代码;或者,在运行过程中,根据业务请求进行处理业务时,向所述管理模块请求运行决策,这些实时请求、实时下发的机制也在本申请的保护范围之内。

与本申请提供的一种java服务端热修复方法的实施例相对应,本申请还提供了一种java服务端热修复装置。参照图3,其示出了本申请提供的一种java服务端热修复装置实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关的部分请参见方法实施例的对应说明即可。下述描述的装置实施例仅仅是示意性的。

本申请提供一种java服务端热修复装置,包括:

管理单元301,用于在java程序运行过程中,根据运行决策确定是否使用javascript修复代码替换特定java代码运行;若是,则进入下一步。

修复单元302,用于在java程序运行过程中,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行。

本申请提供的一种电子设备实施例如下:

与本申请提供的一种java服务端热修复方法的实施例相对应,本申请还提供了一种用于实现java服务端热修复方法的电子设备。

参照图4,其示出了根据本申请提供的一种用于实现java服务端热修复方法的电子设备示意图。由于电子设备实施例基本相似于方法实施例,所以描述得比较简单,相关的部分请参见方法实施例对应的说明即可。下述描述的电子设备实施例仅仅是示意性的。

本申请提供一种电子设备,包括:

存储器401,以及处理器402;

所述存储器401用于存储计算机可执行指令,所述处理器402用于执行所述计算机可执行指令:

在java程序运行过程中,根据运行决策确定是否使用javascript修复代码替换特定java代码运行;若是,则进入下一步;

在java程序运行过程中,使用对所述特定java代码生成的javascript修复代码替换所述特定java代码运行。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1