




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 進(jìn)行微服務(wù)治理,先要對(duì)微服務(wù)進(jìn)行度量 要管得到,必須先看得到!要對(duì)微服務(wù)進(jìn)行治理,先要對(duì)微服務(wù)進(jìn)行度量。根據(jù)微服務(wù)的生命周期,可以將服務(wù)度量分為服務(wù)開發(fā)質(zhì)量度量、服務(wù)測(cè)試質(zhì)量度量、服務(wù)運(yùn)維質(zhì)量度量和服務(wù)線上性能度量四大部分。服務(wù)開發(fā)質(zhì)量度量通過開發(fā)過程管理指標(biāo)來衡量過程效率及質(zhì)量在微服務(wù)架構(gòu)下通常會(huì)采用小團(tuán)隊(duì)、敏捷的開發(fā)模式,使用特定的需求和研發(fā)過程管理工具對(duì)業(yè)務(wù)需求、研發(fā)用例及研發(fā)進(jìn)度進(jìn)行全程管理。因此,從開發(fā)階段的過程管理和成果管理中,可以獲得很多相關(guān)度量指標(biāo)。目前流行的敏捷過程管理工具很多,Jira便是其中的典型代表。圖2.9是筆者所在團(tuán)隊(duì)使用Jira進(jìn)行敏捷迭代管理的一個(gè)功能截圖。圖
2、2.9使用Jira做研發(fā)敏捷過程管理Jira提供API接口,可以獲取非常豐富的研發(fā)過程度量指標(biāo),包括一個(gè)研發(fā)團(tuán)隊(duì)開發(fā)一批業(yè)務(wù)需求所投入的人力資源和各個(gè)環(huán)節(jié)所耗費(fèi)的時(shí)間等信息。以下是Jira提供的一些典型接口。1.獲取所有項(xiàng)目信息通過API接口http:/jiraserver:port/rest/api/2/project可以獲取Jira中的所有項(xiàng)目的詳細(xì)信息,包括項(xiàng)目ID、項(xiàng)目key、項(xiàng)目名稱、項(xiàng)目負(fù)責(zé)人和項(xiàng)目類比/類型等信息。2.獲取單個(gè)項(xiàng)目信息通過API接口http:/jiraserver:port/rest/api/2/project/projectId可以獲取某個(gè)項(xiàng)目ID對(duì)應(yīng)項(xiàng)目的詳細(xì)
3、信息,包括項(xiàng)目組件列表、版本列表及項(xiàng)目相關(guān)角色列表等信息。3.獲取項(xiàng)目某個(gè)敏捷迭代(Sprint)中的所有issue(UserStory、Task、需求、Bug)http:/jiraserver:port/rest/api/2/search?jql=project=projectKeyAND sprint=sprintKey通過如上Jira提供的針對(duì)issue的API查詢接口,利用帶JQL的查詢接口調(diào)用,可以查詢某個(gè)項(xiàng)目下某個(gè)迭代周期中的所有UserStory及Task詳情。4.獲取某個(gè)issue的詳細(xì)信息通過API接口http:/jiraserver:port/rest/api/2/issu
4、e/issueId/issueKey可以獲取某個(gè)issue(用戶故事、任務(wù)、需求、Bug)的詳細(xì)信息,包括創(chuàng)建時(shí)間、狀態(tài)(及變更)、創(chuàng)建人、負(fù)責(zé)人、子任務(wù)等信息。通過以上接口,定期收集敏捷過程中每個(gè)UserStory及對(duì)應(yīng)Task的相關(guān)狀態(tài)信息、變更時(shí)間信息、負(fù)責(zé)人員信息(開發(fā)人員、測(cè)試人員和驗(yàn)收人員)、對(duì)應(yīng)服務(wù)信息(可通過自定義字段維護(hù)issue所關(guān)聯(lián)的微服務(wù))。基于時(shí)間軸將這些信息進(jìn)行橫向和縱向的組織及比對(duì),再結(jié)合精益看板,即可從不同維度對(duì)微服務(wù)的開發(fā)過程進(jìn)行全方位審核和把控。整個(gè)過程如圖2.10所示。圖2.10通過研發(fā)過程信息采集做微服務(wù)研發(fā)過程分析但是,這樣就夠了嗎?不!我們還有一個(gè)龐
5、大的“寶庫(kù)”沒有挖掘,那就是研發(fā)成果的最終歸檔物源代碼。用代碼“讀懂”代碼:衡量開發(fā)交付質(zhì)量回顧軟件開發(fā)的流程,從前期的業(yè)務(wù)需求分析,到產(chǎn)品設(shè)計(jì),再到架構(gòu)設(shè)計(jì),通過層層迭代,讓所有關(guān)于業(yè)務(wù)及系統(tǒng)的思考、意圖和策略最終都通過開發(fā)人員的代碼表述出來。代碼成了這些活動(dòng)的最終產(chǎn)出物??梢哉f,一個(gè)系統(tǒng)的源代碼就是一本“書”,讀懂這本“書”,我們就知道這個(gè)系統(tǒng)的“前世今生”。當(dāng)然,深入(自動(dòng)化)分析源代碼也可以衡量服務(wù)的開發(fā)和設(shè)計(jì)質(zhì)量。在實(shí)際的開發(fā)工作中,大都采用面向?qū)ο蟮木幊谭绞健N覀儼颜鎸?shí)世界的業(yè)務(wù)實(shí)體映射成軟件中的對(duì)象,實(shí)體間的關(guān)系就演變成了對(duì)象間的繼承、實(shí)現(xiàn)和引用關(guān)系。因此通過對(duì)源代碼的分析,可以
6、知道軟件系統(tǒng)的一系列關(guān)系邏輯,包括系統(tǒng)的調(diào)用入口在哪,以及系統(tǒng)API的實(shí)現(xiàn)和繼承關(guān)系、類方法之間的引用關(guān)系等。如圖2.11所示,如果將圖左邊的代碼關(guān)系用圖形化的方式呈現(xiàn)出來,就可以獲得圖右邊的調(diào)用鏈路關(guān)系圖。這類關(guān)系圖對(duì)我們快速梳理和理解系統(tǒng)的邏輯非常有幫助,在此基礎(chǔ)上也可以對(duì)微服務(wù)的調(diào)用質(zhì)量進(jìn)行優(yōu)化。源碼是一個(gè)寶庫(kù),包含了很多的內(nèi)容。假如有個(gè)“超人”能夠記住所有的源碼并理解透徹,那么很多治理的難題都能迎刃而解。問題一出來,超人就能快速地定位問題所在。奈何現(xiàn)實(shí)中沒有超人,全盤讀懂源碼既是腦力活也是體力活,將成千上萬個(gè)核心類的調(diào)用關(guān)系梳理出來并畫出關(guān)系圖,沒有核心程序員好幾周的辛苦努力是搞不定的
7、。圖2.11代碼邏輯關(guān)系的梳理“人力有窮時(shí)”,最好的辦法是通過某種自動(dòng)化手段,自動(dòng)提取源碼中的元素,自動(dòng)梳理這些元素之間的關(guān)系,簡(jiǎn)言之就是“通過代碼去理解代碼”。所幸,現(xiàn)在已經(jīng)有一些能夠?qū)υ创a進(jìn)行解析的工具和組件,JDT就是其中的典型代表。JDT的全稱是Java Development Tools,是Eclipse的核心組件,主要用于Java程序的組織、編譯、調(diào)試和運(yùn)行等。在Java源碼解析上,JDT提供了一個(gè)AST組件(Abstract Syntax Tree,抽象語(yǔ)法樹)來做Java程序分析。通過AST,編譯器會(huì)把代碼轉(zhuǎn)化成一棵抽象“語(yǔ)法樹”,樹上的每個(gè)節(jié)點(diǎn)代表一個(gè)代碼元素(變量、方法、邏
8、輯塊等),同時(shí)針對(duì)節(jié)點(diǎn)的類型和屬性解析提供完整的能力。利用JDT-AST解析Java源碼的基本能力展示如下所示。01./獲取Java源碼02.String content =read(javaFilePath);03./創(chuàng)建語(yǔ)法解析器04.ASTParser parsert = ASTParser.newParser(AST.JLS4);05./設(shè)定解析器的源代碼字符06.parsert.setSource(content.toCharArray();07./使用解析器進(jìn)行解析并返回AST上下文結(jié)果(CompilationUnit為根節(jié)點(diǎn))08.CompilationUnit result =
9、(CompilationUnit)parsert.createAST(null);09./獲取類型10.List types = result.types();11./取得類型聲明(可能有多個(gè)類定義)12.TypeDeclaration typeDec =(TypeDeclaration)types.get(0);13./取得包名14.PackageDeclaration packetDec = result.getPackage();15./取得類名16.String className = typeDec.getName().toString();17./取得函數(shù)(Method)聲明列表1
10、8.MethodDeclaration methodDec = typeDec.getMethods();19./取得函數(shù)(Field)聲明列表20.FieldDeclaration fieldDec = typeDec.getFields();21./繼承的類或者實(shí)現(xiàn)的接口22.for(Object obj :typeDec.superInterfaceTypes()23.System.out.println(interface: + obj);24.25.System.out.println(extends: + typeDec.getSuperclassType();26./輸出包名27
11、.System.out.println(包名: + packetDec.getName();28./輸出類名29.System.out.println(類名: + className);30./輸出引用import31.System.out.println(引用import:);32.for(Object obj :result.imports()33.ImportDeclaration importDec =(ImportDeclaration)obj;34.System.out.println( + importDec.getName();35.36.37./循環(huán)輸出變量38.for(Fi
12、eldDeclaration fieldDecEle :fieldDec)39.for(Object obj :fieldDecEle.fragments()40.System.out.println(類變量:+fieldDecEle.getType()+ +(VariableDeclarationFragment)obj).getName();41.42.43.for(MethodDeclaration method :methodDec)44.System.out.println(方法: + method.getName();45./遍歷方法內(nèi)變量46.ListmParams = meth
13、od.parameters();47.if(mParams !=null)48.for(inti = 0;i mParams.size();i+)49.SingleVariableDeclaration sVar = mParams.get(i);50.System.out.println(方法變量: + sVar. getType().toString()+ + sVar.getName().toString();51.52.53./遍歷方法內(nèi)邏輯塊54.Block body = method.getBody();55.if(body =null)56.continue;57.58.List
14、 statements = body.statements();59.Iterator iter = statements.iterator();60.while(iter.hasNext()61.Statement stmt =(Statement)iter.next();62.System.out.println(邏輯塊類型: + stmt.getClass().getSimpleName();63.64.通過JDT-AST可以解析出某個(gè)類所有引用的其他類(import)列表、類變量列表、類函數(shù)列表、函數(shù)內(nèi)變量列表和函數(shù)內(nèi)邏輯塊。有了這些基礎(chǔ)信息之后,再遍歷每個(gè)方法中的每一行,通過正則表達(dá)
15、式可以獲取此代碼行所調(diào)用的變量及其方法。比如,針對(duì)下面的代碼:params.put(isAdded, remind.getIsAdded());通過正則表達(dá)式:a-zA-Z0-9_$+ |r|n*. |r|n*a-zA-Z0-9_$+(可以識(shí)別出如下兩個(gè)子串:1params.put(2remind.getIsAdded(對(duì)上面的結(jié)果稍加處理,可知上述代碼分別調(diào)用了變量params的put方法和變量remind的getIsAdded方法。基于這個(gè)結(jié)論,再根據(jù)類變量列表及函數(shù)內(nèi)變量列表匹配到對(duì)應(yīng)的類上,即可獲得某個(gè)類方法調(diào)用其他類方法的情況。微服務(wù)本身即以類方法(或接口)的形式存在,因此,通過這種
16、方式可以獲得微服務(wù)之間的調(diào)用關(guān)系,具體解析過程如圖2.12所示。圖2.12通過JDT-AST解析Java文件獲取方法間的調(diào)用關(guān)系有了這些信息,就可以逐個(gè)遍歷方法,掃描方法的每一行代碼,通過前面識(shí)別出的類變量及方法變量,找出這些變量的對(duì)外調(diào)用,從而構(gòu)建出某個(gè)類方法對(duì)其他類方法的調(diào)用關(guān)系。如果把源碼庫(kù)中所有微服務(wù)工程的源碼都進(jìn)行掃描,可以獲得一個(gè)Map/string,list對(duì)象集合,Map的key是某個(gè)類方法,Value是其調(diào)用的其他類方法的集合(為了程序處理方便,可能還需要構(gòu)建一個(gè)類似的被調(diào)用關(guān)系集合Map)。在此基礎(chǔ)上對(duì)這個(gè)Map進(jìn)行遞歸遍歷,就可以找出所有這些類方法的調(diào)用鏈路關(guān)系,如圖2.
17、13所示。圖中的F#Func1和K#Func1是微服務(wù)的調(diào)用入口,一般都作為調(diào)用契約以接口的形式存在。在進(jìn)行代碼掃描時(shí),要注意將其與實(shí)現(xiàn)類做關(guān)聯(lián)(接口和實(shí)現(xiàn)類的關(guān)聯(lián)關(guān)系可以通過AST獲得。圖2.13微服務(wù)內(nèi)部及微服務(wù)間的方法級(jí)別的調(diào)用鏈路關(guān)系把如圖2.13所示的這些調(diào)用鏈路關(guān)系合并,可以構(gòu)建一個(gè)如圖2.11右邊所示的完整的方法級(jí)別的調(diào)用矩陣,微服務(wù)間的調(diào)用是這個(gè)調(diào)用矩陣的一個(gè)子集。圖2.14是一個(gè)真實(shí)靜態(tài)調(diào)用鏈的示例,以一個(gè)類方法為起點(diǎn),找到它調(diào)用的所有其他方法,逐層遍歷后,就能得到圖中所顯示的調(diào)用層級(jí)關(guān)系。圖2.14-是這種調(diào)用關(guān)系的文本描述,從圖中可以清晰地看到方法間調(diào)用的先后和層級(jí)關(guān)系。
18、要注意的是類的實(shí)現(xiàn)和繼承關(guān)系。接口類方法或者抽象類方法是沒有具體實(shí)現(xiàn)邏輯的,所以在程序掃描時(shí),還需維護(hù)類直接的繼承和實(shí)現(xiàn)關(guān)系。接口方法往往用具體的實(shí)現(xiàn)類方法來代替,這樣就能順利地找到它的下一層引用關(guān)系。如果引入諸如mxGraph這類圖形化展示組件,可以將圖2.14-中類方法間的調(diào)用關(guān)系用一棵從上至下、從左至右的調(diào)用樹圖來展示,如圖2.14-所示。調(diào)用樹上每一個(gè)節(jié)點(diǎn)就是一個(gè)類方法,節(jié)點(diǎn)間的箭頭連線就是一個(gè)調(diào)用關(guān)系。通過JDT能夠識(shí)別出方法注釋,還可以將方法注釋在每一個(gè)類方法節(jié)點(diǎn)的右邊列出。如果系統(tǒng)注釋完整,那么通過一張圖就可以基本讀清楚一個(gè)微服務(wù)入口方法的完整實(shí)現(xiàn)細(xì)節(jié)。如果一個(gè)方法類的結(jié)構(gòu)比較復(fù)
19、雜,例如它有IFELSE關(guān)系或者FOR循環(huán)等嵌套調(diào)用關(guān)系,也可以用JDT識(shí)別,將這種關(guān)系在調(diào)用線條上列出。這樣就能清楚地知道這是一種分支調(diào)用關(guān)系還是一種循環(huán)調(diào)用關(guān)系。圖2.14靜態(tài)調(diào)用鏈的文本展示形式和圖形展示形式的對(duì)照由于掃描的是所有相關(guān)工程的代碼,一張圖上就包含了所有層級(jí)的服務(wù)或系統(tǒng)之間的RPC調(diào)用關(guān)系。通過包名來對(duì)不同的業(yè)務(wù)層級(jí)(前臺(tái)、中臺(tái)、后臺(tái))進(jìn)行識(shí)別,并為不同包名的圖形單元賦予不同的顏色,通過顏色的區(qū)分可以清楚地知道一個(gè)方法的調(diào)用究竟涉及多少個(gè)系統(tǒng),在每個(gè)系統(tǒng)中的入口是什么、出口又是什么等。這里存在一個(gè)問題,就是如何將源碼掃描獲取到的類方法(微服務(wù)的API)與需求/開發(fā)任務(wù)管理系統(tǒng)中的UserStory和Task關(guān)聯(lián)上?可以強(qiáng)制要求在微服務(wù)API入口方法(或者微服務(wù)類聲明)的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳媒公司協(xié)議合同范本
- 制作簡(jiǎn)易合同范本
- 農(nóng)戶貸款保證合同范本
- 農(nóng)村住宅設(shè)計(jì)合同范本
- 上海植物租擺合同范本
- 公積金租房合同范本
- 五人合伙合同范本
- 二手公寓房購(gòu)買合同范本
- 正規(guī)合同范本買賣
- 倉(cāng)庫(kù)貨品保管合同范本
- GB/T 3452.2-2007液壓氣動(dòng)用O形橡膠密封圈第2部分:外觀質(zhì)量檢驗(yàn)規(guī)范
- GB/T 30797-2014食品用洗滌劑試驗(yàn)方法總砷的測(cè)定
- GB/T 20057-2012滾動(dòng)軸承圓柱滾子軸承平擋圈和套圈無擋邊端倒角尺寸
- GB/T 19808-2005塑料管材和管件公稱外徑大于或等于90mm的聚乙烯電熔組件的拉伸剝離試驗(yàn)
- GB/T 12771-2019流體輸送用不銹鋼焊接鋼管
- 工程驗(yàn)收及移交管理方案
- 班組建設(shè)工作體系課件
- 圖片編輯概述課件
- 第章交通調(diào)查與數(shù)據(jù)分析課件
- 2023年岳陽(yáng)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試筆試題庫(kù)及答案解析
- 北師大版八年級(jí)數(shù)學(xué)上冊(cè)《認(rèn)識(shí)無理數(shù)(第2課時(shí))》參考課件2
評(píng)論
0/150
提交評(píng)論