APP下载

基于国产操作系统对开源软件集成开发的研究与应用

2023-07-10陈吉宁黄季洋

计算机应用文摘·触控 2023年11期

陈吉宁 黄季洋

关键词:国产操作系統;开源软件;集成开发;JMeter

中图法分类号:TP316 文献标识码:A

近年来,越来越多的单位开始进行国产化替代,用户开始从Windows操作系统转向国产操作系统。但在用户使用过程中,一系列问题也开始暴露出来,如国产软件生态的系统不完善、应用程序不丰富、缺乏相应的软件体系和软件工程方法等。开源软件是一种版权持有人向公众公开软件源代码,并允许公众下载、编译的软件,在整个软件行业中占有重要地位,其开发模式成为技术创新和推动软件产业发展的主要方式。引入开源软件可以很好地增添当下国产软件生态的多样性,丰富用户的国产平台使用体验。通过对开源软件的二次开发,能更好地实现本地化功能,更有利于贴合用户使用场景,进而满足各种繁杂的工作需求。

1开源软件集成开发分析

1.1国产操作系统上搭建开发环境

经过国产操作系统不断的更新迭代,目前对开发环境的支持已经足够完善。即便是ARM架构的国产处理器平台也具备了和Windows平台相近的开发体验。以目前主流的统信UOS和银河麒麟Kylin为例,系统本身自带JDK11和Python2,Python3,故搭建环境就只需要安装集成开发环境(IDE)。截至目前,将统信UOS更新到最新版本1050,即可从应用商店中安装Java开发常用的Intellij idea的免费社区版、Python开发常用的PyCharm等开发环境。其实际上的使用与Windows平台并无太大区别,即可开始开发。

1.2依赖的管理

依赖(dependencies)是各种软件开发项目中不可或缺的一部分,依赖可以理解为开发者要调用的附加代码。现在的开发离不开各式各样的依赖支撑,我们对开源软件进行集成开发时碰到所需的依赖在项目中没有提供,则需要引入外部依赖到项目中。以Java和Python为例,分析二者的依赖管理方式。

(1) Java。

早期Java项目的依赖管理全靠开发者自己搜罗相关的依赖Jar包,然后导人本地项目中,随着Java开发的各种辅助插件工具的演变,现在的依赖管理工具已经可以从远程仓库中下载和安装对应依赖包。在Java开发的依赖管理中,较为知名的有Maven和Gradle等。

由Apache

Maven进行依赖管理的项目引入新依赖比较简单,前往mvnrepository.com或其他途径查询所需依赖的引入代码,找到项目根目录下的pom.xml文件,在的标签内添加所需依赖的代码,然后刷新项目即可自动下载安装。

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具,与Maven类似,前往mvnrepository.com或其他途径查询到所需依赖的引入代码,找到项目中的build. gradle文件或build.gradle.kts(Kotlin),粘贴到dependencies{}的花括号中,重新加载项目即可自动下载安装。

(2) Python。

pip(package installer for Python)是用于管理Python中包的默认工具。通过命令行执行pip install相关依赖来完成对依赖的引入。部分Python开源软件会提供一个requirements. txt文档来指导用户安装所需的依赖,使用pip install-r requirements.txt即可完成依赖的下载与安装。

Conda是一个通用的虚拟环境工具,在进行多个Python开源软件开发时,可以使用Conda生成多个虚拟环境来安装不同的依赖,以提高各个项目的独立性。

1.3代码结构的分析

若要对一款开源软件进行二次开发,则必须了解它的项目代码结构,才能针对功能需求下手。以JMeter 5.5的源码为例,src文件夹存放的是JMeter核心源代码,其中又分为众多的模块,如bom,bshclient,config,core,functions等。如图1所示,可以看到src下每个模块展开后的结构都是一个独立的小项目,有自己的src文件夹存放源代码,也有build文件夹存放编译后的class文件。部分功能模块有resouces文件夹存放资源文件,也有其单独的build.gradle.kts依赖管理文件。

JMeter对每个子模块进行单独管理,实现其极高的开放性和可再开发性。并非所有开源软件的代码结构都如JMeter复杂,小型的开源软件项目结构单一,代码文件较少,也存在代码复用性、可读性差的开源软件。

2基于JMeter的二次开发实例

本次JMeter二次开发实例采用的是JMeter5.5版本,涉及引入依赖、函数插件的开发、取样器插件的开发3个环节,均在国产桌面整机宝德PT620K上完成,该整机搭载了ARM架构的国产处理器鲲鹏920,操作系统则为统信UOSV20(1050)。

2.1引入所需外部依赖

本文在开发functions功能模块时,发现JMeter自带的Json相关依赖并不能满足需求,需要引入外部依赖org.json,该依赖提供了众多Json解析方法。第一步则是前往mvnrepository.com查询需要的依赖,并复制该依赖的Gradle引入代码,如implementation("org.json:json:20220924")。第二步是将复制的引入代码粘贴到functions下的build.gradle.kts文件中,如图2所示,然后重新加载Gradle项目即可自动下载和安装该依赖。

2.2函数插件的设计与开发

JMeter的函数插件是二次开发中广泛使用的模块,函数插件可以通过JMeter图形化中的工具→函教助手对话框进行调用,还可以嵌入性能测试脚本中进行调用。函数插件模块位于JMeter源码src文件夹下的functions,JMeter原生的函数插件都继承自AbstractFunction,这是JMeter提供的抽象类方法,其中规定了函数插件的4种重写方法。

鉴于目前Web应用系统大多使用加密算法对用户账号密码进行加密,自然性能测试中也会涉及对账号密码加密的流程,JMeter原生插件中并没有主流RSA算法的加解密插件,本文就对此进行二次开发。于functions下的src/main/java/org. apache.jmeter.funcitons新建Java类,部分代码如图3所示,通过setParameters()规定了仅接受2个人参,分别是明文和公钥,重写getReferenceKey(),告诉JMeter此函数在框架中的应用名称,重写getArgumentDesc()将人参名称集合List返回给JMeter,通过execute()实现了RSA中使用公钥对明文进行加密并输出密文的处理逻辑。

2.3取样器插件的设计与开发

取样器(Sampler)为JMeter性能测试中的一个重要组件,平时针对Web应用系统的性能测试需要先创建取样器中的HTTP请求。相较于函数插件,取样器插件的二次开发赋予开发者的自由度更高,能实现的功能也更多,不受性能测试的限制。取样器模块位于JMeter源码src文件夹下的protocol,protocol文件夹下还有许多以协议命名的子模块。

本文选取了java请求类型进行二次开发,设计了一个简单的验证输入数字是否存在反数的功能,于protocol/java/src/main/java/org. apache. jmeter.protocol.java.test下新建Java类,同样需要继承自JMeter提供的AbstractjavaSamplerClient。实现方式仍是重写父类中的实现方法来实现自己的逻辑。如图4所示,重写getDefaultParameters(),设置参数名为num,默认值为空字符串,重写setupTest(),让每个线程执行前获取人参赋予方法中的变量x。

如图5所示,核心逻辑方法需要重写runTest()来实现,使用SampleResult设置取样器在前台的回显,并可以通过setSuccessful规定本方法的调用成功与否,logger.info记录的日志会同步在JMeter前台显示。当人参数字不是反数时,该Java请求取样器会响应失败,反之则会响应成功。

最后,如图6所示,还可以重写teardownTest(),在整个取样器执行完毕后再执行个性化的逻辑,本文编制了一个返回测试结果的简单逻辑。

2.4开发功能展示

(1)新增的函數插件功能如图7所示,提供了明文和公钥2个入参,点击生成后即可输出经过RSA加密过后的密文,同时会生成函数字符串,可以直接在性能测试脚本中调用。

(2)新增的取样器插件功能如图8所示,需要先创建线程组,然后新建取样器中的Java请求,在右侧下拉选择新增的Java请求功能。当输入的num为反数时,执行该线程组后,在结果树中的输出为:请求成功,结果为0。当输入的num为负数时,结果树中的输出为:请求失败,结果为-1。

3结束语

本文针对不同开发语言的开源软件在国产操作系统上如何进行集成开发进行了归纳分析,以JMeter为例分析了其代码结构,完成了引入外部依赖和函数、取样器插件的开发。集成开发所增添的功能很好地丰富了JMeter的使用场景,与国产操作系统互补,给用户提供更多的便利。

本文的不足在于没有更广泛地研究、探索JMeter等大型开源软件的功能模块,如JMeter仍有众多值得集成开发的功能有待掌握。希望更多的开源软件能够拥抱国产平台,以及更多的开发者加入二次开发的行列中来,以降低用户的使用门槛、丰富信创软件生态。

作者简介:

陈吉宁(1980—),硕士,研究方向:计算机应用与网络安全。

黄季洋(1997—),本科,研究方向:Java编程与软件编译。