陳吉寧 黃季洋
關(guān)鍵詞:國(guó)產(chǎn)操作系統(tǒng);開(kāi)源軟件;集成開(kāi)發(fā);JMeter
中圖法分類號(hào):TP316 文獻(xiàn)標(biāo)識(shí)碼:A
近年來(lái),越來(lái)越多的單位開(kāi)始進(jìn)行國(guó)產(chǎn)化替代,用戶開(kāi)始從Windows操作系統(tǒng)轉(zhuǎn)向國(guó)產(chǎn)操作系統(tǒng)。但在用戶使用過(guò)程中,一系列問(wèn)題也開(kāi)始暴露出來(lái),如國(guó)產(chǎn)軟件生態(tài)的系統(tǒng)不完善、應(yīng)用程序不豐富、缺乏相應(yīng)的軟件體系和軟件工程方法等。開(kāi)源軟件是一種版權(quán)持有人向公眾公開(kāi)軟件源代碼,并允許公眾下載、編譯的軟件,在整個(gè)軟件行業(yè)中占有重要地位,其開(kāi)發(fā)模式成為技術(shù)創(chuàng)新和推動(dòng)軟件產(chǎn)業(yè)發(fā)展的主要方式。引入開(kāi)源軟件可以很好地增添當(dāng)下國(guó)產(chǎn)軟件生態(tài)的多樣性,豐富用戶的國(guó)產(chǎn)平臺(tái)使用體驗(yàn)。通過(guò)對(duì)開(kāi)源軟件的二次開(kāi)發(fā),能更好地實(shí)現(xiàn)本地化功能,更有利于貼合用戶使用場(chǎng)景,進(jìn)而滿足各種繁雜的工作需求。
1開(kāi)源軟件集成開(kāi)發(fā)分析
1.1國(guó)產(chǎn)操作系統(tǒng)上搭建開(kāi)發(fā)環(huán)境
經(jīng)過(guò)國(guó)產(chǎn)操作系統(tǒng)不斷的更新迭代,目前對(duì)開(kāi)發(fā)環(huán)境的支持已經(jīng)足夠完善。即便是ARM架構(gòu)的國(guó)產(chǎn)處理器平臺(tái)也具備了和Windows平臺(tái)相近的開(kāi)發(fā)體驗(yàn)。以目前主流的統(tǒng)信UOS和銀河麒麟Kylin為例,系統(tǒng)本身自帶JDK11和Python2,Python3,故搭建環(huán)境就只需要安裝集成開(kāi)發(fā)環(huán)境(IDE)。截至目前,將統(tǒng)信UOS更新到最新版本1050,即可從應(yīng)用商店中安裝Java開(kāi)發(fā)常用的Intellij idea的免費(fèi)社區(qū)版、Python開(kāi)發(fā)常用的PyCharm等開(kāi)發(fā)環(huán)境。其實(shí)際上的使用與Windows平臺(tái)并無(wú)太大區(qū)別,即可開(kāi)始開(kāi)發(fā)。
1.2依賴的管理
依賴(dependencies)是各種軟件開(kāi)發(fā)項(xiàng)目中不可或缺的一部分,依賴可以理解為開(kāi)發(fā)者要調(diào)用的附加代碼?,F(xiàn)在的開(kāi)發(fā)離不開(kāi)各式各樣的依賴支撐,我們對(duì)開(kāi)源軟件進(jìn)行集成開(kāi)發(fā)時(shí)碰到所需的依賴在項(xiàng)目中沒(méi)有提供,則需要引入外部依賴到項(xiàng)目中。以Java和Python為例,分析二者的依賴管理方式。
(1) Java。
早期Java項(xiàng)目的依賴管理全靠開(kāi)發(fā)者自己搜羅相關(guān)的依賴Jar包,然后導(dǎo)人本地項(xiàng)目中,隨著Java開(kāi)發(fā)的各種輔助插件工具的演變,現(xiàn)在的依賴管理工具已經(jīng)可以從遠(yuǎn)程倉(cāng)庫(kù)中下載和安裝對(duì)應(yīng)依賴包。在Java開(kāi)發(fā)的依賴管理中,較為知名的有Maven和Gradle等。
由Apache
Maven進(jìn)行依賴管理的項(xiàng)目引入新依賴比較簡(jiǎn)單,前往mvnrepository.com或其他途徑查詢所需依賴的引入代碼,找到項(xiàng)目根目錄下的pom.xml文件,在的標(biāo)簽內(nèi)添加所需依賴的代碼,然后刷新項(xiàng)目即可自動(dòng)下載安裝。
Gradle是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化構(gòu)建開(kāi)源工具,與Maven類似,前往mvnrepository.com或其他途徑查詢到所需依賴的引入代碼,找到項(xiàng)目中的build. gradle文件或build.gradle.kts(Kotlin),粘貼到dependencies{}的花括號(hào)中,重新加載項(xiàng)目即可自動(dòng)下載安裝。
(2) Python。
pip(package installer for Python)是用于管理Python中包的默認(rèn)工具。通過(guò)命令行執(zhí)行pip install相關(guān)依賴來(lái)完成對(duì)依賴的引入。部分Python開(kāi)源軟件會(huì)提供一個(gè)requirements. txt文檔來(lái)指導(dǎo)用戶安裝所需的依賴,使用pip install-r requirements.txt即可完成依賴的下載與安裝。
Conda是一個(gè)通用的虛擬環(huán)境工具,在進(jìn)行多個(gè)Python開(kāi)源軟件開(kāi)發(fā)時(shí),可以使用Conda生成多個(gè)虛擬環(huán)境來(lái)安裝不同的依賴,以提高各個(gè)項(xiàng)目的獨(dú)立性。
1.3代碼結(jié)構(gòu)的分析
若要對(duì)一款開(kāi)源軟件進(jìn)行二次開(kāi)發(fā),則必須了解它的項(xiàng)目代碼結(jié)構(gòu),才能針對(duì)功能需求下手。以JMeter 5.5的源碼為例,src文件夾存放的是JMeter核心源代碼,其中又分為眾多的模塊,如bom,bshclient,config,core,functions等。如圖1所示,可以看到src下每個(gè)模塊展開(kāi)后的結(jié)構(gòu)都是一個(gè)獨(dú)立的小項(xiàng)目,有自己的src文件夾存放源代碼,也有build文件夾存放編譯后的class文件。部分功能模塊有resouces文件夾存放資源文件,也有其單獨(dú)的build.gradle.kts依賴管理文件。
JMeter對(duì)每個(gè)子模塊進(jìn)行單獨(dú)管理,實(shí)現(xiàn)其極高的開(kāi)放性和可再開(kāi)發(fā)性。并非所有開(kāi)源軟件的代碼結(jié)構(gòu)都如JMeter復(fù)雜,小型的開(kāi)源軟件項(xiàng)目結(jié)構(gòu)單一,代碼文件較少,也存在代碼復(fù)用性、可讀性差的開(kāi)源軟件。
2基于JMeter的二次開(kāi)發(fā)實(shí)例
本次JMeter二次開(kāi)發(fā)實(shí)例采用的是JMeter5.5版本,涉及引入依賴、函數(shù)插件的開(kāi)發(fā)、取樣器插件的開(kāi)發(fā)3個(gè)環(huán)節(jié),均在國(guó)產(chǎn)桌面整機(jī)寶德PT620K上完成,該整機(jī)搭載了ARM架構(gòu)的國(guó)產(chǎn)處理器鯤鵬920,操作系統(tǒng)則為統(tǒng)信UOSV20(1050)。
2.1引入所需外部依賴
本文在開(kāi)發(fā)functions功能模塊時(shí),發(fā)現(xiàn)JMeter自帶的Json相關(guān)依賴并不能滿足需求,需要引入外部依賴org.json,該依賴提供了眾多Json解析方法。第一步則是前往mvnrepository.com查詢需要的依賴,并復(fù)制該依賴的Gradle引入代碼,如implementation("org.json:json:20220924")。第二步是將復(fù)制的引入代碼粘貼到functions下的build.gradle.kts文件中,如圖2所示,然后重新加載Gradle項(xiàng)目即可自動(dòng)下載和安裝該依賴。
2.2函數(shù)插件的設(shè)計(jì)與開(kāi)發(fā)
JMeter的函數(shù)插件是二次開(kāi)發(fā)中廣泛使用的模塊,函數(shù)插件可以通過(guò)JMeter圖形化中的工具→函教助手對(duì)話框進(jìn)行調(diào)用,還可以嵌入性能測(cè)試腳本中進(jìn)行調(diào)用。函數(shù)插件模塊位于JMeter源碼src文件夾下的functions,JMeter原生的函數(shù)插件都繼承自AbstractFunction,這是JMeter提供的抽象類方法,其中規(guī)定了函數(shù)插件的4種重寫方法。
鑒于目前Web應(yīng)用系統(tǒng)大多使用加密算法對(duì)用戶賬號(hào)密碼進(jìn)行加密,自然性能測(cè)試中也會(huì)涉及對(duì)賬號(hào)密碼加密的流程,JMeter原生插件中并沒(méi)有主流RSA算法的加解密插件,本文就對(duì)此進(jìn)行二次開(kāi)發(fā)。于functions下的src/main/java/org. apache.jmeter.funcitons新建Java類,部分代碼如圖3所示,通過(guò)setParameters()規(guī)定了僅接受2個(gè)人參,分別是明文和公鑰,重寫getReferenceKey(),告訴JMeter此函數(shù)在框架中的應(yīng)用名稱,重寫getArgumentDesc()將人參名稱集合List返回給JMeter,通過(guò)execute()實(shí)現(xiàn)了RSA中使用公鑰對(duì)明文進(jìn)行加密并輸出密文的處理邏輯。
2.3取樣器插件的設(shè)計(jì)與開(kāi)發(fā)
取樣器(Sampler)為JMeter性能測(cè)試中的一個(gè)重要組件,平時(shí)針對(duì)Web應(yīng)用系統(tǒng)的性能測(cè)試需要先創(chuàng)建取樣器中的HTTP請(qǐng)求。相較于函數(shù)插件,取樣器插件的二次開(kāi)發(fā)賦予開(kāi)發(fā)者的自由度更高,能實(shí)現(xiàn)的功能也更多,不受性能測(cè)試的限制。取樣器模塊位于JMeter源碼src文件夾下的protocol,protocol文件夾下還有許多以協(xié)議命名的子模塊。
本文選取了java請(qǐng)求類型進(jìn)行二次開(kāi)發(fā),設(shè)計(jì)了一個(gè)簡(jiǎn)單的驗(yàn)證輸入數(shù)字是否存在反數(shù)的功能,于protocol/java/src/main/java/org. apache. jmeter.protocol.java.test下新建Java類,同樣需要繼承自JMeter提供的AbstractjavaSamplerClient。實(shí)現(xiàn)方式仍是重寫父類中的實(shí)現(xiàn)方法來(lái)實(shí)現(xiàn)自己的邏輯。如圖4所示,重寫getDefaultParameters(),設(shè)置參數(shù)名為num,默認(rèn)值為空字符串,重寫setupTest(),讓每個(gè)線程執(zhí)行前獲取人參賦予方法中的變量x。
如圖5所示,核心邏輯方法需要重寫runTest()來(lái)實(shí)現(xiàn),使用SampleResult設(shè)置取樣器在前臺(tái)的回顯,并可以通過(guò)setSuccessful規(guī)定本方法的調(diào)用成功與否,logger.info記錄的日志會(huì)同步在JMeter前臺(tái)顯示。當(dāng)人參數(shù)字不是反數(shù)時(shí),該Java請(qǐng)求取樣器會(huì)響應(yīng)失敗,反之則會(huì)響應(yīng)成功。
最后,如圖6所示,還可以重寫teardownTest(),在整個(gè)取樣器執(zhí)行完畢后再執(zhí)行個(gè)性化的邏輯,本文編制了一個(gè)返回測(cè)試結(jié)果的簡(jiǎn)單邏輯。
2.4開(kāi)發(fā)功能展示
(1)新增的函數(shù)插件功能如圖7所示,提供了明文和公鑰2個(gè)入?yún)?,點(diǎn)擊生成后即可輸出經(jīng)過(guò)RSA加密過(guò)后的密文,同時(shí)會(huì)生成函數(shù)字符串,可以直接在性能測(cè)試腳本中調(diào)用。
(2)新增的取樣器插件功能如圖8所示,需要先創(chuàng)建線程組,然后新建取樣器中的Java請(qǐng)求,在右側(cè)下拉選擇新增的Java請(qǐng)求功能。當(dāng)輸入的num為反數(shù)時(shí),執(zhí)行該線程組后,在結(jié)果樹(shù)中的輸出為:請(qǐng)求成功,結(jié)果為0。當(dāng)輸入的num為負(fù)數(shù)時(shí),結(jié)果樹(shù)中的輸出為:請(qǐng)求失敗,結(jié)果為-1。
3結(jié)束語(yǔ)
本文針對(duì)不同開(kāi)發(fā)語(yǔ)言的開(kāi)源軟件在國(guó)產(chǎn)操作系統(tǒng)上如何進(jìn)行集成開(kāi)發(fā)進(jìn)行了歸納分析,以JMeter為例分析了其代碼結(jié)構(gòu),完成了引入外部依賴和函數(shù)、取樣器插件的開(kāi)發(fā)。集成開(kāi)發(fā)所增添的功能很好地豐富了JMeter的使用場(chǎng)景,與國(guó)產(chǎn)操作系統(tǒng)互補(bǔ),給用戶提供更多的便利。
本文的不足在于沒(méi)有更廣泛地研究、探索JMeter等大型開(kāi)源軟件的功能模塊,如JMeter仍有眾多值得集成開(kāi)發(fā)的功能有待掌握。希望更多的開(kāi)源軟件能夠擁抱國(guó)產(chǎn)平臺(tái),以及更多的開(kāi)發(fā)者加入二次開(kāi)發(fā)的行列中來(lái),以降低用戶的使用門檻、豐富信創(chuàng)軟件生態(tài)。
作者簡(jiǎn)介:
陳吉寧(1980—),碩士,研究方向:計(jì)算機(jī)應(yīng)用與網(wǎng)絡(luò)安全。
黃季洋(1997—),本科,研究方向:Java編程與軟件編譯。