随着Spring生态不断发展,越来越先进的部署方式降低了部署的复杂度,提高了不同环境下的部署效率,但是在预生产环境下,对频繁改动的热点代码,其部署效率不是很理想,一些简单的代码修改就会引发对所有依赖服务的重新编译部署,给项目部署、运维以及测试带来很多预期之外的影响。在线部署机制针对这个问题进行了改进,该机制使用自定义注解作为与外部应用通信的桥梁,使在线部署模块独立于外部应用。热点代码在编辑完成后注入到在线部署模块,进而完成其热点功能在预生产环境的在线部署。实验表明,相对于重新编译部署,该部署机制对原有代码侵入影响较小,减少了反复部署应用以及不同部门协调合作造成的时间浪费并提升了系统的部署效率,且成功应用于新型智慧城市评估系统的热点代码模块。研究结果将为迭代开发以及高效部署提供设计思路与技术支撑。
目录
4 性能测试与分析
4.1 实验环境
4.2 评价标准
4.3 实验结果
5 系统应用
6 结束语
4 性能测试与分析
4.1 实验环境
实验的硬件环境是Intel ( R) Corn ( TM ) i7 - 7700HQ CPU @ 2. 8 Hz 2. 81 GHz,内存为 8 GB,软件 环境为windows tomcat idea2022。
实验在Spring官网下生成空白的项目,添加相应的功能构建不同复杂度的系统,以便对比不同部署方式的部署效率。
4.2 评价标准
为了评估应用在不同软件复杂度下的在线部署方法与重新编译部署方法的效率,采用不同维度下的软件复杂度进行实验,衡量软件复杂度的常用度量方法, 包括代码行数度量法和Halstead度量法。其具体构建如下:
代码行数度量法在空白项目中写入100行代码形成一个请求单元,标识系统拥有100的复杂度,将代码请求单元扩增至10个请求单元,可以使代码行数复杂度增加 10 倍,变为 1000 的复杂度。同理,使用 Halstead 度量法构建不同复杂度的项目,向空白项目中写入定义好的度量单位为100的模块,以此为模板扩增,与代码行数复杂度一致,分别增加至10000和100000的复杂度。
度量单个单元复杂度的Halstead公式 :
Mcount = 0. 05(N + N1 )
其中,N为程序词汇表的长度,N1为程序长度,为了与代码行数度量法的对比更加直观,设定了0. 05的系数。
4.3 实验结果
对重新编译部署与在线部署两种方法在时间效率上进行对比,从程序开始编译计时,到实际应用部署为止,得出各自所需的时间。
实验中选择不同度量法下的不同系统复杂度,在进行10次相对独立的实验后取平均值。其中T1表示在线部署的时间, T2表示重新编译部署的时间,T1/T2是两种部署模式下的时间比值。
如表1和图7所示,随着代码行数复杂度的增加, 在线部署的时间明显小于重新编译部署的时间,并随 着代码行数复杂度的增加,时间比值在逐渐下降。
如表2和图8所示,Halstead复杂度和代码行数复杂度的结果基本一致。
结果表明,在线部署比重新编译部署效果更好,推广到现在大规模、复杂性高的系统中,运用该热部署方法部署代码更有利于节约时间和资源。
5 系统应用
该文提出的在线部署方法应用于新型智慧城市评估系统的评估体系构建模块。随着城市的不断发展, 城市评价的指标体系也在不断地进步,指标计算也越来越复杂。在系统业务开发的过程中,对城市评估的评估体系往往考虑得不够全面,所以在系统运行初期, 会不断地调整指标中的评估算法,与之相对应的测试 环境以及预生产环境的应用也需要频繁地部署。针对 这种情况,系统为其设计了可在线编辑的指标计算模块,该模块通过在线操作完成新指标的部署。
当用户对指标计算模块编辑时,先在指标编辑的模块中对指标计算的算法进行编辑,之后系统根据算 法的名称和配置构建元信息,将代码连同元信息一起传输到系统后台,并在后台对算法进行编译,然后将编译后的文件通过Spring注入到容器列表,即可完成对应指标的部署。在对城市评估的时候,评估系统使用元信息查找到对应的算法,完成指标的计算。该在线部署方法为在线评估系统的指标拓展计算提供了思路,同时很好地解决了频繁部署热点代码的问题。
6 结束语
研究了基于Spring的在线热点代码部署方法,并在新型智慧城市评估系统进行了验证。在系统部署的过程中,运维人员会将所有的代码拉取到服务器中,对应用重新部署。功能应用在频繁改动的时候,重复拉取代码后进行部署,很容易导致一些问题出现。该方法能够使应用系统集成的在线部署模块在不停机的状态下,稳定地增加功能,并以较快的速度部署,同时在应用必须停机时,卸载在线部署模块,零配置重新部署功能 。该文设计的在线部署方法有望在紧急上线、预生产环境调试等环境下发挥作用。
同时,该部署方案还有进一步完善的空间。在应用过程中热点的代码只能修改单独的类,只能在线单 独改变其中一个功能,这种方法免去了代码的整包构建,提升了速率。但是这种方案仅仅只能在热点代码中使用,不适合大范围的修改代码,此外对于复杂环境的分布式系统,还需要考虑各个层级的依赖问题。