CN116257271B - 一种支持运行时动态更新的应用架构方法 - Google Patents

一种支持运行时动态更新的应用架构方法 Download PDF

Info

Publication number
CN116257271B
CN116257271B CN202310118500.4A CN202310118500A CN116257271B CN 116257271 B CN116257271 B CN 116257271B CN 202310118500 A CN202310118500 A CN 202310118500A CN 116257271 B CN116257271 B CN 116257271B
Authority
CN
China
Prior art keywords
module
virtual machine
service
main program
machine module
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202310118500.4A
Other languages
English (en)
Other versions
CN116257271A (zh
Inventor
靳伟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Seconds Technology Co ltd
Original Assignee
Beijing Seconds Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Seconds Technology Co ltd filed Critical Beijing Seconds Technology Co ltd
Priority to CN202310118500.4A priority Critical patent/CN116257271B/zh
Publication of CN116257271A publication Critical patent/CN116257271A/zh
Application granted granted Critical
Publication of CN116257271B publication Critical patent/CN116257271B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种支持运行时动态更新的应用架构方法,该方法包括以下步骤:通过主程序模块校验、启动及注册各个字节码虚拟机模块并完成初始化,同时建立内部消息总线;通过主程序模块将各个虚拟机服务能力注册至虚拟机服务发现模块;通过主程序模块对虚拟机模块进行监控;主程序模块根据策略对虚拟机模块进行替换;通过通信模块、配置模块、公共服务模块及数据持久化模块提供服务的描述;通过业务型虚拟机模块提供服务的描述。本发明轻松实现程序本身自更新,热更新,安全更新,按策略更新等等更高级的版本升级机制,业务不中断或者影响最小,且不受限于编程语言的种类。

Description

一种支持运行时动态更新的应用架构方法
技术领域
本发明涉及软件领域,具体来说,涉及一种支持运行时动态更新的应用架构方法。
背景技术
现代的各种高级编程语言一般都支持某些基础的模块化技术,比如C/C++的各种函数库,Java的package包,Go的package包等等。一个库或者package包能够把相同领域的API组织起来,为外界提供服务。系统级别的库和包往往精心构造,接口稳定,并且具备清晰的版本标识。
具备一定规模的应用程序不可能所有细分领域的代码都从头写起,引入大量系统级别甚至第三方库和package包成为必然,这大大缩短了应用构建时间。随着业务复杂度提升,应用本身的构建越来越具有挑战性,需要贯彻包括模块化在内的很多软件工程理念。一个应用往往是更高层次系统的一个组成部分,大型应用往往需要许多分布式组件通过网络进行通信,互相协作来完成一件事情。这些组件的相互协调非常重要,应用版本升级就是其中一种非常重要的现实需求。
普通的应用版本升级方法往往伴随着二进制程序文件的重新安装和替换,直接的结果通常就是业务中断;一些多组件的大型应用,组件版本升级就需要更复杂的逻辑和流程,一些所谓的动态迁移技术被设计出来,以免整个系统处于业务中断状态,这些迁移技术实质上依然需要组件的完整替换。也有一些编程语言相关的机制,可以支持更高级的模块升级替换技术,比如Java的OSGi。Java的包和库之间经常会产生依赖冲突,OSGi的bundle类加载器可以让某些包和库有多个版本同时运行在相同的JVM中,这解决了不同模块之间的包和类型相互干扰的问题,从而为应用模块化提供了更好的机制上的支持。这样一来,按照OSGi框架搭建起来的Java应用程序,因为模块之间可以互不依赖,可以实现相对动态且独立的bundle模块加载和卸载。
在微软的.NET应用框架下,应用程序域(AppDomain)是比进程的范围更小、用途广泛的应用程序的隔离单元。在一个进程中,可以有多个不同的应用程序域,每个应用程序域可以独立运行一个应用程序而不会相互影响,并且每一个AppDomain中的应用程序都可以独立地加载和卸载。.NET应用程序一般使用c#、F#、或者VB编程。普通的应用程序升级技术,本质上是二进制程序文件的重新安装和替换,不管版本之间变化了多少,二进制文件都将作为整体被替换。替换过程意味着不同程度的业务中断。
Java的OSGi机制提供了一种应用内模块之间解耦的方法,它主要解决了模块之间的依赖循环和冲突,其主要目的并非模块本身的加载、卸载和替换;且这种机制只存在于贯彻了OSGi理念的由Java语言构造的应用程序中。
.NET托管程序中有一个默认程序域,它是.NET托管程序启动后创建的第一个应用程序域,默认程序域无法开启影子拷贝(ShadowCopy)特性,这其实限制了部分应用程序的加载和卸载;和Java的OSGi机制一样,应用程序域(AppDomain)的概念受限于编程语言和运行环境。
针对相关技术中的问题,目前尚未提出有效的解决方案。
发明内容
针对相关技术中的问题,本发明提出一种支持运行时动态更新的应用架构方法,以克服现有相关技术所存在的上述技术问题。
为此,本发明采用的具体技术方案如下:
一种支持运行时动态更新的应用架构方法,该方法包括以下步骤:
S1、通过主程序模块校验、启动及注册各个字节码虚拟机模块并完成初始化,同时建立内部消息总线;
S2、通过主程序模块将各个虚拟机服务能力注册至虚拟机服务发现模块;
S3、通过主程序模块对虚拟机模块进行监控;
S4、主程序模块根据策略对虚拟机模块进行替换;
S5、通过通信模块、配置模块、公共服务模块及数据持久化模块提供服务的描述;
S6、通过业务型虚拟机模块提供服务的描述。
进一步的,所述通过主程序模块校验、启动及注册各个字节码虚拟机模块包括以下步骤:
将字节码文件、API描述文件、字节码文件以及API描述文件的哈希文件、哈希文件签名文件及其它资源文件组成虚拟机模块,且通过应用RunTime环境中的字节码解释器执行字节码文件;
将虚拟机模块分为服务型虚拟机模块及业务型虚拟机模块,且主程序模块在应用启动后,按顺序启动服务型虚拟机模块及业务型虚拟机模块;
每启动一个虚拟机模块,主程序模块标识并存储其运行状态及相关数据信息,并运行该虚拟机模块自身的初始化过程,且等待所有虚拟机模块完成初始化以后,再进行调用服务;
随着其它虚拟机模块的启动,服务型虚拟机模块中的虚拟机服务发现模块的注册信息被逐一添加进来。
进一步的,所述通过主程序模块启动及注册各个字节码虚拟机模块之前,对虚拟机模块进行校验,并通过签名文件校验字节码文件及其API描述文件。
进一步的,所述虚拟机模块启动之前,主程序模块建立内部消息总线,且消息总线包括两种总线,第一种总线用于应用内各模块之间通信,第二种总线用于通信功能模块与其它虚拟机模块之间的消息中转站;
其中,所述第二种总线用于通信功能模块与其它虚拟机模块之间的消息中转站包括以下步骤:
外部消息由通信功能模块接收并完成协议转换之后,发送至第二种总线,并由预先设定虚拟机模块接收;
任一虚拟机模块发送对外消息时,首先发送至第二种总线,并由通信功能模块进行转发。
进一步的,所述通过主程序模块将各个虚拟机服务能力注册至虚拟机服务发现模块包括以下步骤:
虚拟机模块启动后,将由虚拟机模块启动得到的可以直接引用该虚拟机模块并进行API调用的对象描述符信息注册至虚拟机服务发现模块;
通过主程序模块生成虚拟机ID,消息总线内的消息由虚拟机ID标识消息的发送方和接收方;
给予虚拟机服务发现模块固定的ID标识列表,且每个虚拟机模块在进行外部依赖API请求之前,从虚拟机服务发现模块获得ID标识列表,并进行本地缓存加速、定时或者事件触发更新;
主程序模块卸载任一虚拟机模块前,发送广播消息通知其它模块该虚拟机模块及其提供的服务失效,并执行相应的注销动作,同时将虚拟机服务发现模块中的相关数据进行清除或复位;
接收到某个虚拟机模块失效消息后,其它虚拟机模块根据自身提供的服务和业务特点,清除或复位失效的虚拟机模块相关的数据。
进一步的,所述通过主程序模块对虚拟机模块进行监控包括以下步骤:
主程序模块主动查询某个虚拟机模块的运行状态,或者操作某个虚拟机模块并使其状态发生迁移变化;
任一虚拟机模块运行状态自发发生变化时,主动发送广播通知,且主程序模块及时更新相关数据,同时和该虚拟机模块状态保持一致。
进一步的,所述主程序模块根据策略对虚拟机模块进行替换包括以下步骤:
在配置模块中设置版本升级策略,当任一虚拟机模块有新的版本可用时,选择静态更新或动态更新;
其中,动态更新为在运行过程中完成虚拟机模块的替换升级,且版本升级策略决定版本替换方式和触发版本升级的方式。
进一步的,所述虚拟机模块有新的版本可用时,若更新包含一组连续的虚拟机模块状态迁移动作,则主程序模块对新版虚拟机模块包的签名文件、哈希文件及新包版本号进行校验;
主程序模块广播通知所有虚拟机模块某一虚拟机模块即将进行升级动作,并注销旧版虚拟机的注册信息;
被升级模块接到通知后,若本模块业务数据有要求,则虚拟机模块先进入Paused状态并暂存业务数据后再进入Exited状态,若业务数据没有要求,则虚拟机模块直接进入Exited状态,且虚拟机模块进入Exited状态之前回复主程序模块其运行状态变化;
主程序模块重新进行新版虚拟机模块初始化并运行虚拟机模块,并重新进行虚拟机模块注册,标注其运行状态数据,同时广播虚拟机模块服务已经Available的消息,且其它相关方获得通知后,更新所有相关数据和服务。
进一步的,所述服务型虚拟机模块包括虚拟机服务发现模块、配置模块、公共服务模块,数据持久化模块及通信模块。
进一步的,所述业务型虚拟机模块为根据用户不同领域的需求而划分构造。
本发明的有益效果为:
(1)本发明提出了一种支持运行时动态更新的应用架构方法,定义了应用内各种功能模块的划分和交互过程,可以实现应用程序高层次的模块化,更好地实现了模块逻辑解耦,轻松实现程序本身自更新,热更新,安全更新,按策略更新等等更高级的版本升级机制,业务不中断或者影响最小,且不受限于编程语言的种类;该架构方法可以借助WebAssembly相关技术实现落地。
(2)本发明解决了应用版本动态升级的问题,从整体上看,以字节码VM(虚拟机模块)为基础构造模块化应用的整体设计,并不多见,且一个字节码VM的构建并不依赖特定的编程语言,而字节码解释器的选择正变得越来越多。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据本发明实施例的一种支持运行时动态更新的应用架构方法的流程图;
图2是应用内部架构图;
图3是VM状态迁移图。
具体实施方式
为进一步说明各实施例,本发明提供有附图,这些附图为本发明揭露内容的一部分,其主要用以说明实施例,并可配合说明书的相关描述来解释实施例的运作原理,配合参考这些内容,本领域普通技术人员应能理解其他可能的实施方式以及本发明的优点,图中的组件并未按比例绘制,而类似的组件符号通常用来表示类似的组件。
根据本发明的实施例,提供了一种支持运行时动态更新的应用架构方法。WebAssembly(简称Wasm)是一种起源于Web浏览器侧的字节码技术,本是为了解决JavaScript VM(支持JavaScript运行的虚拟机,比如Google Chrome的V8引擎)的性能问题而诞生,现在其应用已经扩展至各种Non-Web场景,支持Wasm运行的各种字节码解释器正在不断涌现。一个应用在运行过程中,可以借助字节码解释器加载Wasm VM,把特定工作委托给VM完成,获得输出结果后,应用可以卸载VM。
本发明提出,一个应用内部整体架构如下图2所示,除了主程序模块以外,其它模块都可以认为是一个字节码VM,例如Wasm VM。
应用内的模块主要有:
主程序模块:负责应用启动和初始化,加载各模块VM,监控VM状态,完成VM控制。根据策略,完成VM替换。另外,作为应用内各个模块通信机制的内部消息总线,也应由主程序模块创建并维护。
VM服务发现模块:每个VM完成内聚的特定功能,并通过API向外界提供服务。每个VM能够完成哪些特定功能,提供哪些服务,在VM启动时要向VM服务发现模块注册,其它VM可以查询,系统内有哪些其它VM服务可用。
通信模块:为系统内各个VM提供对外连接和数据交换服务。
配置模块:为系统内各个VM提供和应用本身以及业务相关的配置数据服务。
公共服务模块:为系统内各个VM提供诸如系统级日志,系统级事件触发器,事务锁等类似功能的公共服务。
数据持久化模块:为系统内各个业务模块VM提供和业务相关的数据持久化服务,如文件存储和本地数据库。
业务模块1~业务模块n:完成应用主要业务功能。
现结合附图和具体实施方式对本发明进一步说明,如图1-3所示,根据本发明实施例的支持运行时动态更新的应用架构方法,该方法包括以下步骤:
S1、通过主程序模块校验、启动及注册各个字节码虚拟机模块(VM)并完成初始化,同时建立内部消息总线;
在一个实施例中,所述通过主程序模块校验、启动及注册各个字节码虚拟机模块包括以下步骤:
将字节码文件、API描述文件(描述了本模块的提供者,版本号,提供服务的API列表以及需要依赖其它模块提供的API列表)、字节码文件以及API描述文件的哈希文件、哈希文件签名文件及其它资源文件组成虚拟机模块,它们应该处于一个目录下,且通过应用RunTime环境中的字节码解释器执行字节码文件;
将虚拟机模块分为服务型虚拟机模块及业务型虚拟机模块,且主程序模块在应用启动后,按顺序启动服务型虚拟机模块及业务型虚拟机模块;服务型虚拟机模块包括VM服务发现模块、配置模块、公共服务模块,数据持久化模块、通信模块等;
每启动一个虚拟机模块,主程序模块标识并存储其运行状态及相关数据信息,作为后续监控、更新VM的依据,并运行该虚拟机模块自身的初始化过程,由于VM被逐一顺序启动,因此,正在进行启动的VM,其初始化过程不能依赖还未启动的VM提供的服务,而要靠自身的能力完成模块初始化,必须依赖其它模块能力且无法协调启动顺序的部分,要有相应的延迟机制,等待整个系统,且等待所有虚拟机模块完成初始化以后,再进行调用服务;
由于VM服务发现模块是第一个被启动的模块,此时其维护的应用内VM注册信息除了自身以外应该是空的,随着其它虚拟机模块的启动,服务型虚拟机模块中的虚拟机服务发现模块的注册信息被逐一添加进来。一个VM模块的注册信息包括:VM名称,作者,VM ID(应用内全局唯一标识),字节码文件名和路径,API全量列表和描述信息,版本号等等。这些必要的信息反映了VM模块的身份、服务能力、依赖能力。
在一个实施例中,所述通过主程序模块启动及注册各个字节码虚拟机模块之前,对虚拟机模块进行校验,并通过签名文件校验字节码文件及其API描述文件,防止其被篡改。由此可见,一个VM模块完全可以由可信赖的第三方提供,这为VM安全检测,在线下载,应用商店之类的生态建设提供了坚实的技术基础。
而一个业务相关的VM启动过程可以描述如下:
VM模块包校验;
需要的话,从配置模块获取属于该VM的配置信息;
VM启动和初始化;
VM运行;
向VM服务发现模块注册本VM服务信息;
标识其运行状态,存储运行数据;
除了必须的服务型模块,一个应用需要启动哪些业务模块,可以基于配置模块中预置的策略信息来决定。后面描述配置模块时详述。
在一个实施例中,所述虚拟机模块启动之前,主程序模块建立内部消息总线,且消息总线包括两种总线,第一种总线用于应用内各模块之间通信,比如一个VM调用其它VM提供的公开API服务时,发送相应的目标VM ID,API,参数列表等必要信息至总线,接收方获取被调用API及参数数据,返回执行结果数据给发送方。再比如,一个VM发送单播或广播事件消息至总线,接收方获知以后根据具体情况决定是否回复;
第二种总线用于通信功能模块与其它虚拟机模块之间的消息中转站;
其中,所述第二种总线用于通信功能模块与其它虚拟机模块之间的消息中转站包括以下步骤:
外部消息由通信功能模块接收并完成协议转换之后,发送至第二种总线,并由预先设定虚拟机模块接收;
任一虚拟机模块发送对外消息时,首先发送至第二种总线,并由通信功能模块进行转发。可见,对外连接的建立,应该由通信模块代理VM完成,并建立连接和VM之间的绑定关系。后面描述通信功能模块时详述。
主程序模块完成的功能是确定的,在应用版本的进化过程中,这一部分应该是稳定且不易变化的,这为主程序模块更新其它的特别是业务相关的VM模块打下坚实基础。
后面会详述VM的监控、更新过程,这个功能也是由主程序模块完成的。
S2、通过主程序模块将各个虚拟机服务能力注册至虚拟机服务发现模块;其它虚拟机模块发现可用的虚拟机服务;
上面提到,VM在启动后,主程序模块依据其提供的原始信息,注册相关数据至VM服务发现模块。一个VM的注册信息应该包括:VM名称,作者,VM ID(应用内全局唯一标识),字节码文件名和路径,API全量列表和描述信息,版本号等等。
在一个实施例中,所述通过主程序模块将各个虚拟机服务能力注册至虚拟机服务发现模块包括以下步骤:
除了上述静态信息,由于虚拟机模块注册发生在其被启动之后,虚拟机模块启动后,将由虚拟机模块启动得到的可以直接引用该虚拟机模块并进行API调用的对象描述符信息注册至虚拟机服务发现模块;
通过主程序模块生成虚拟机ID,在整个应用内唯一标识某VM,消息总线内的消息由虚拟机ID标识消息的发送方和接收方;VM ID在这里起到了和网卡Mac地址类似的作用。应用内完整的VM ID列表,可以在VM服务发现模块获得。这个列表应当包含所有VM ID、名称和其对象描述符的绑定关系;
给予虚拟机服务发现模块固定的ID标识列表,且每个虚拟机模块在进行外部依赖API请求之前,从虚拟机服务发现模块获得ID标识列表,
并进行本地缓存加速、定时或者事件触发更新;
VM注册信息在VM的整个生命周期内维持不变,主程序模块卸载任一虚拟机模块前,发送广播消息通知其它模块该虚拟机模块及其提供的服务失效,并执行相应的注销动作,同时将虚拟机服务发现模块中的相关数据进行清除或复位;
接收到某个虚拟机模块失效消息后,其它虚拟机模块根据自身提供的服务和业务特点,清除或复位失效的虚拟机模块相关的数据。
S3、通过主程序模块对虚拟机模块进行监控;
上述提到,主程序模块启动一个VM的最后一步,是标识并存储该VM的运行状态和相关数据信息,作为后续监控、更新VM的依据。这并不复杂,只需以VM ID作为标识,建立数据结构记录其运行状态,由于VM服务发现模块的存在,主程序模块当然也能像其他模块一样,随时获得这个VM ID所对应的其它详细信息。
一个VM的生命周期应该包含创建(Created),启动及初始化(Starting andInitializing),运行(Running),暂停(Paused),退出(Exited),删除(Removed)等几个状态;
在一个实施例中,所述通过主程序模块对虚拟机模块进行监控包括以下步骤:
所谓监控,即主程序模块随时能够知道所有VM的运行状态;主程序模块主动查询某个虚拟机模块的运行状态,或者操作某个虚拟机模块并使其状态发生迁移变化;
任一虚拟机模块运行状态自发发生变化时,主动发送广播通知,且主程序模块及时更新相关数据,同时和该虚拟机模块状态保持一致。具体采取什么样的监控措施保证应用正确地运行,往往和业务类型是相关的。
如图3所示,一个VM完成注册后,其对应的状态信息应该是Running。当一个VM从其它状态迁移至Running(VM加载成功)以后,主程序模块应该发送广播消息,以便其它VM能够知晓,某个VM的服务已经Available。某个VM由Running状态迁移至其它状态(VM被卸载)之前,主程序模块应该发送广播消息,以便其它VM能够知晓,某个VM的服务即将Unavailable。值得强调的是,发送卸载消息和真正的卸载操作可以有一定的延迟,以便其它VM模块正确反应。时间延迟是一种比较简单的同步方法,还可以有更为复杂的同步方式。
S4、主程序模块根据策略对虚拟机模块进行替换;
当一个或多个VM模块有新的版本可用时,可以进行版本更新。当然可以进行和普通应用类似的静态更新,即终止应用运行,替换相应的二进制文件,然后重新启动应用。
在一个实施例中,所述主程序模块根据策略对虚拟机模块进行替换包括以下步骤:
在配置模块中设置版本升级策略,当任一虚拟机模块有新的版本可用时,选择静态更新或动态更新;
其中,动态更新为在运行过程中完成虚拟机模块的替换升级,且版本升级策略决定版本替换方式和触发版本升级的方式。比如,某个业务模块因为需求变更有了新的版本,而此时该VM模块对应的版本升级策略是动态更新、在确定的时间点自动更新,并指明了新版本VM包所在路径,则用户只需在该时间点来临之前,将新版VM包的相关二进制文件放入指定目录即可。
在一个实施例中,所述虚拟机模块有新的版本可用时,若更新包含一组连续的虚拟机模块状态迁移动作,则主程序模块对新版虚拟机模块包的签名文件、哈希文件(确定其合法性和完整性)及新包版本号(确定其符合升级策略)进行校验;
主程序模块广播通知所有虚拟机模块某一虚拟机模块即将进行升级动作,并注销旧版虚拟机的注册信息;
被升级模块接到通知后,若本模块业务数据有要求,则虚拟机模块先进入Paused状态并暂存业务数据后再进入Exited状态,若业务数据没有要求,则虚拟机模块直接进入Exited状态,且虚拟机模块进入Exited状态之前回复主程序模块其运行状态变化;其它依赖此VM的模块进行妥善处理,其提供的服务暂时失效;
主程序模块重新进行新版虚拟机模块初始化并运行虚拟机模块,并重新进行虚拟机模块注册,标注其运行状态数据,同时广播虚拟机模块服务已经Available的消息,且其它相关方获得通知后,更新所有相关数据和服务。
值得强调的是,其它相关的VM模块之所以能够恢复对一个新版VM的服务依赖,有一个前提是,新版的VM提供的服务API列表和旧版能够兼容,如果两者差异很大无法做到兼容,则说明,所有依赖此VM服务的模块都需要重新构造并进行更新了。
在上述第二步中,注销旧版VM,以及其它所有依赖模块收到注销通知,这两个动作应该做好同步,即注销应该发生在所有依赖模块妥善处理被注销服务的暂时失效以后才进行,主程序模块应该清楚所有的依赖关系,这可以通过查询VM服务发现模块的数据来实现。
S5、通过通信模块、配置模块、公共服务模块及数据持久化模块提供服务的描述;
S6、通过业务型虚拟机模块提供服务的描述。
在一个实施例中,所述服务型虚拟机模块包括虚拟机服务发现模块、配置模块、公共服务模块,数据持久化模块及通信模块等。他们提供的服务属于应用基础设施,是为业务型模块提供某个特定类别的API服务而存在,他们的功能相对内聚且稳定,版本升级的需求低。
在一个实施例中,所述业务型虚拟机模块为根据用户不同领域的需求而划分构造。业务型虚拟机模块千变万化,而且需求是不断变更的,这正是应用版本升级源源不断的原因所在。
本发明的关键点:
1.应用内模块以字节码VM为基础构造并清晰指出构成VM模块包的文件组成;
模块化是构建具有一定规模应用的必然要求,本发明创造性的提出了以字节码VM为主要组件的应用模块化方案,并提出以字节码文件,API描述文件(描述了本模块的提供者,版本号,提供服务的API列表以及需要依赖其它模块提供的API列表),字节码文件和API描述文件的哈希文件,哈希文件签名文件,其它资源文件等组成VM模块包的基本概念,这为后续的VM模块校验、注册、初始化、运行、升级替换打下坚实的物质基础。
2.一个应用的VM应该由哪些模块组成?本发明提出了一种普适方案;
单单指出以字节码VM为基础构造一个模块化应用还是不够的,本发明进一步提出了构成一个应用的VM模块类型,即服务型模块和业务型模块,并列举了足够且普适的服务型模块:VM服务发现模块、配置模块、公共服务模块,数据持久化模块、通信模块等等,并阐明了他们的功能。
3.由VM组成的应用之启动和运行过程;
更进一步地,本发明详细阐述了一个由VM组成的应用关键的启动和初始化过程,解释了他们在一起互相依赖协调工作的基本过程,这为本发明的实际落地实现提供了足够的原则指导。
4.VM模块动态更新的过程;
最终,水到渠成地,本发明详细阐述了由字节码VM模块化的应用带来的最大便利:动态VM模块更新。这种模块更新过程最大限度的减小了应用版本升级过程对业务持续性的影响,即业务不中断或者极短中断的情况下实现模块更新。
综上所述,本发明提出了一种支持运行时动态更新的应用架构方法,定义了应用内各种功能模块的划分和交互过程,可以实现应用程序高层次的模块化,更好地实现了模块逻辑解耦,轻松实现程序本身自更新,热更新,安全更新,按策略更新等等更高级的版本升级机制,业务不中断或者影响最小,且不受限于编程语言的种类;该架构方法可以借助WebAssembly相关技术实现落地。本发明解决了应用版本动态升级的问题,从整体上看,以字节码VM为基础构造模块化应用的整体设计,并不多见,且一个字节码VM的构建并不依赖特定的编程语言,而字节码解释器的选择正变得越来越多。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (9)

1.一种支持运行时动态更新的应用架构方法,其特征在于,该方法包括以下步骤:
S1、通过主程序模块校验、启动及注册各个字节码虚拟机模块并完成初始化,同时建立内部消息总线;
S2、通过主程序模块将各个虚拟机服务能力注册至虚拟机服务发现模块;
S3、通过主程序模块对虚拟机模块进行监控;
S4、主程序模块根据策略对虚拟机模块进行替换;
S5、通过通信模块、配置模块、公共服务模块及数据持久化模块提供服务的描述;
S6、通过业务型虚拟机模块提供服务的描述;
所述通过主程序模块校验、启动及注册各个字节码虚拟机模块包括以下步骤:
将字节码文件、API描述文件、字节码文件以及API描述文件的哈希文件、哈希文件签名文件及其它资源文件组成虚拟机模块,且通过应用RunTime环境中的字节码解释器执行字节码文件;
将虚拟机模块分为服务型虚拟机模块及业务型虚拟机模块,且主程序模块在应用启动后,按顺序启动服务型虚拟机模块及业务型虚拟机模块;
每启动一个虚拟机模块,主程序模块标识并存储其运行状态及相关数据信息,并运行该虚拟机模块自身的初始化过程,且等待所有虚拟机模块完成初始化以后,再进行调用服务;
随着其它虚拟机模块的启动,服务型虚拟机模块中的虚拟机服务发现模块的注册信息被逐一添加进来。
2.根据权利要求1所述的一种支持运行时动态更新的应用架构方法,其特征在于,所述通过主程序模块启动及注册各个字节码虚拟机模块之前,对虚拟机模块进行校验,并通过签名文件校验字节码文件及其API描述文件。
3.根据权利要求2所述的一种支持运行时动态更新的应用架构方法,其特征在于,所述虚拟机模块启动之前,主程序模块建立内部消息总线,且消息总线包括两种总线,第一种总线用于应用内各模块之间通信,第二种总线用于通信功能模块与其它虚拟机模块之间的消息中转站;
其中,所述第二种总线用于通信功能模块与其它虚拟机模块之间的消息中转站包括以下步骤:
外部消息由通信功能模块接收并完成协议转换之后,发送至第二种总线,并由预先设定虚拟机模块接收;
任一虚拟机模块发送对外消息时,首先发送至第二种总线,并由通信功能模块进行转发。
4.根据权利要求3所述的一种支持运行时动态更新的应用架构方法,其特征在于,所述通过主程序模块将各个虚拟机服务能力注册至虚拟机服务发现模块包括以下步骤:
虚拟机模块启动后,将由虚拟机模块启动得到的直接引用该虚拟机模块并进行API调用的对象描述符信息注册至虚拟机服务发现模块;
通过主程序模块生成虚拟机ID,消息总线内的消息由虚拟机ID标识消息的发送方和接收方;
给予虚拟机服务发现模块固定的ID标识列表,且每个虚拟机模块在进行外部依赖API请求之前,从虚拟机服务发现模块获得ID标识列表,并进行本地缓存加速、定时或者事件触发更新;
主程序模块卸载任一虚拟机模块前,发送广播消息通知其它模块该虚拟机模块及其提供的服务失效,并执行相应的注销动作,同时将虚拟机服务发现模块中的相关数据进行清除或复位;
接收到某个虚拟机模块失效消息后,其它虚拟机模块根据自身提供的服务和业务特点,清除或复位失效的虚拟机模块相关的数据。
5.根据权利要求4所述的一种支持运行时动态更新的应用架构方法,其特征在于,所述通过主程序模块对虚拟机模块进行监控包括以下步骤:
主程序模块主动查询某个虚拟机模块的运行状态,或者操作某个虚拟机模块并使其状态发生迁移变化;
任一虚拟机模块运行状态自发发生变化时,主动发送广播通知,且主程序模块及时更新相关数据,同时和该虚拟机模块状态保持一致。
6.根据权利要求1所述的一种支持运行时动态更新的应用架构方法,其特征在于,所述主程序模块根据策略对虚拟机模块进行替换包括以下步骤:
在配置模块中设置版本升级策略,当任一虚拟机模块有新的版本可用时,选择静态更新或动态更新;
其中,动态更新为在运行过程中完成虚拟机模块的替换升级,且版本升级策略决定版本替换方式和触发版本升级的方式。
7.根据权利要求6所述的一种支持运行时动态更新的应用架构方法,其特征在于,所述虚拟机模块有新的版本可用时,若更新包含一组连续的虚拟机模块状态迁移动作,则主程序模块对新版虚拟机模块包的签名文件、哈希文件及新包版本号进行校验;
主程序模块广播通知所有虚拟机模块某一虚拟机模块即将进行升级动作,并注销旧版虚拟机的注册信息;
被升级模块接到通知后,若本模块业务数据有要求,则虚拟机模块先进入Paused状态并暂存业务数据后再进入Exited状态,若业务数据没有要求,则虚拟机模块直接进入Exited状态,且虚拟机模块进入Exited状态之前回复主程序模块其运行状态变化;
主程序模块重新进行新版虚拟机模块初始化并运行虚拟机模块,并重新进行虚拟机模块注册,标注其运行状态数据,同时广播虚拟机模块服务已经Available的消息,且其它相关方获得通知后,更新所有相关数据和服务。
8.根据权利要求1所述的一种支持运行时动态更新的应用架构方法,其特征在于,所述服务型虚拟机模块包括虚拟机服务发现模块、配置模块、公共服务模块,数据持久化模块及通信模块。
9.根据权利要求1所述的一种支持运行时动态更新的应用架构方法,其特征在于,所述业务型虚拟机模块为根据用户不同领域的需求而划分构造。
CN202310118500.4A 2023-02-02 2023-02-02 一种支持运行时动态更新的应用架构方法 Active CN116257271B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310118500.4A CN116257271B (zh) 2023-02-02 2023-02-02 一种支持运行时动态更新的应用架构方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310118500.4A CN116257271B (zh) 2023-02-02 2023-02-02 一种支持运行时动态更新的应用架构方法

Publications (2)

Publication Number Publication Date
CN116257271A CN116257271A (zh) 2023-06-13
CN116257271B true CN116257271B (zh) 2023-11-28

Family

ID=86680401

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310118500.4A Active CN116257271B (zh) 2023-02-02 2023-02-02 一种支持运行时动态更新的应用架构方法

Country Status (1)

Country Link
CN (1) CN116257271B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105681060A (zh) * 2014-11-17 2016-06-15 中兴通讯股份有限公司 一种虚拟化网络功能管理升级方法、装置及服务器
CN106657173A (zh) * 2015-10-29 2017-05-10 华为技术有限公司 一种nfv架构下软件升级中的业务迁移方法、装置及服务器
CN109861839A (zh) * 2017-11-30 2019-06-07 华为技术有限公司 业务不中断的虚拟交换机升级方法以及相关设备

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8127288B2 (en) * 2006-01-17 2012-02-28 International Business Machines Corporation Installing and updating interpreted programming language applications using a designated virtual machine

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105681060A (zh) * 2014-11-17 2016-06-15 中兴通讯股份有限公司 一种虚拟化网络功能管理升级方法、装置及服务器
CN106657173A (zh) * 2015-10-29 2017-05-10 华为技术有限公司 一种nfv架构下软件升级中的业务迁移方法、装置及服务器
CN109861839A (zh) * 2017-11-30 2019-06-07 华为技术有限公司 业务不中断的虚拟交换机升级方法以及相关设备

Also Published As

Publication number Publication date
CN116257271A (zh) 2023-06-13

Similar Documents

Publication Publication Date Title
CN111596969B (zh) 一种基于微内核加插件式的软件架构方法
US6871345B1 (en) Self managing software agents with introspection
JP3573762B2 (ja) オブジェクト指向分散コンピューティング方法
US6938263B2 (en) System and method for facilitating dynamic loading of “stub” information to enable a program operating in one address space to invoke processing of a remote method or procedure in another address space
CA2425977C (en) Realtime configuration updates and software distribution to active client positions
US6430570B1 (en) Java application manager for embedded device
US7526771B2 (en) Method and apparatus for configuring an application while the application is running
AU2007304895A1 (en) Advanced contention detection
US20050086640A1 (en) Initiating execution of application programs on a data processing arrangement
CN108491216A (zh) 一种Android系统无感知应用安装升级的方法
CN107665302B (zh) 一种Android应用多开实现方法、移动终端及存储介质
US11726810B2 (en) Systemic extensible blockchain object model comprising a first-class object model and a distributed ledger technology
US20070094675A1 (en) Object mobility
CN110659045B (zh) 一种软件化雷达实时动态更新系统
US20040143654A1 (en) Node location management in a distributed computer system
CN107220074A (zh) 对支撑层软件功能的访问、升级方法及装置
CN116257271B (zh) 一种支持运行时动态更新的应用架构方法
AU775624B2 (en) Method and apparatus for dynamic command extensibility in an intelligent agent
CN115994004B (zh) 一种应用程序接口调用方法及装置
CN115658165A (zh) 用于启动租户插件以及实现进程内通信的方法和装置
CN110389791B (zh) 组件调度方法、装置、设备及存储介质
CN113296898A (zh) 异步任务处理方法、装置、电子设备和存储介质
CN116308360A (zh) 基于区块链的数据处理方法、装置、设备及系统
CN117632296A (zh) 插件加载方法、装置、存储介质以及电子设备
Gregersen et al. Towards dynamic plug-in replacement in Eclipse plug-in development

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant