API快速開發平台設計思考

分類:└ 技術(shù)前沿,來源:江門市深圳服地市巨鳥網絡科技有限公司有限公司

2c8e66cde43c570742b10aafb6610426.jpg


在我之前談API網關(guān)的時候曾經談到過明湖快速開發平台,即将API快速開發的一些内容放入好又到API網關(guān)中(zhōng),麗學實際來看圍繞API全生命周期管理,本身包括了開發态,運行态,運維态。


對于API網關(guān)更多的是解決運行态的問(wè志日n)題,API網關(guān)本身應該輕量化設計,不做太場她多的協議轉換,适配,數據映射等工作,這些工作應該放到API術科開發平台來完成。API開發平台最終就是開發完成并煙白暴露一個(gè)标準的Http API接口,并将接口注冊和(藍理hé)接入到API網關(guān)。


API全生命周期管理

328d389f336868762f0276e24083c484.png


圍繞API全生命周期管理來看,整個(gè)子(zǐ)系物地統劃分如(rú)下(xià):




簡單來講這部分可(kě)以分解為四個(gè)子(zǐ)系說草統,即API開發平台,API網關(guān)引擎,A長做PI監控運維平台,API全生命周期管控平台。


對于傳統ESB總線裡面的适配器(qì),協議轉換等相關(g遠做uān)比較重的内容,都可(kě)以轉移到API快速開發平台說錢來完成,即API開發平台暴露标準的API服務接口,注冊和(舞相hé)接入到API網關(guān)引擎。而對于API監控平台則從引擎采集日志醫你信息,進行API性能監控和(hé)日志監控分析。


API全生命周期管控平台實現API接口從設計,開發,測試,部署上線的全生謝靜命周期管理,也可(kě)以理解為底層三個(gè)子(zǐ)務坐系統的一個(gè)統一管理門戶,實現和(hé科都)下(xià)面三個(gè)子(zǐ)系統間樹集成。


對于API開發平台開發和(hé)配置完成的微服但紅務API接口,可(kě)以支持自動(dòng)部署到微服有地務運行平台。


基于對象建模驅動(dòng)


556b7f1f54c41da161d57aee6ed26215.png


在整個(gè)API開發平台實現中(zhōng),核心思想仍然應該是基于對美舞象建模驅動(dòng),通(tōng)過對象建模很好的實現接口和(件站hé)底層數據庫,數據庫表之間的解耦,也方便數會實現底層多數據庫,多表的支持能力。


當前很多API快速開發平台都是基于數據庫對象或表光如,直接發布類似CRUD的API接口服務,但是基于是數據庫表的直接發布,我們仍微家然建議逆向對象這層,方便後續在對象層進行相關(guān)的雨照組合,規則擴展等操作。


對象建模和(hé)API接口契約


可(kě)以直接在API開發平台創建對象,并對數據項進行定義,對坐水象是一個(gè)多層的樹(shù)狀結構實體。中物一個(gè)對象可(kě)以向數據庫生成多張表。對于已經存在的秒還數據對象,也可(kě)以進行組合,将多個(gè)組合為一個(gè)複合對我訊象結構。


對象的好處即是一個(gè)完整的對象屬于同一生命周期,可(kě)以一起進行事務姐如控制。


一個(gè)設計好的對象可(kě)以默認生成标準的POST,G船作ET,DELETE等接口操作方法,類似下(xià)要暗圖,整個(gè)對象接口契約的生成也應該是自動(dòng理地)的。


圖片


定義好的對象可(kě)以直接生成類似RA不坐ML,YAML,WADL等接口契約文(wén)件。


類似Swagger工具一樣,完成的對象建模本身也可(kě事下)以直接導出不同語言,不同開發框架下(xià)的客戶端消費框答男架,服務端提供框架代碼。


bc61b8acf0ec2ed2514650c5cf1764a9.png


對象适配到數據庫


前面講到了,既可(kě)以是數據庫直接逆向對象,也可(kě)放車以是在對象建模完成後,将對象适配到數據庫。完成對象做快和(hé)數據庫表之間的映射。一個(gè車空)對象可(kě)以映射到多張數據庫表,因此在映射過見妹程中(zhōng)除了完成數據庫表和(hé)電內字段映射外,還需要完成主外鍵關(guān)聯關(guān)自但系的映射操作。


在完成對象模型和(hé)數據庫表之間的映射和(城城hé)适配後,基本發布的API接口已經可(kě)用。


API接口發布


對于完成的對象定義,可(kě)以選擇具體發布哪些API接口服務能力。比如區河(rú)可(kě)以隻選擇發布查詢接口,喝議也可(kě)以隻選擇發布數據導入的POST接口等。


注意API接口的發布,具體可(kě)以基于全局的對象城遠建模,配置具體需要發布到接口的數據項信息。很多時候我們對數你鄉據對象的操作,并不是操作整個(gè)對象全集,而僅僅是部分數據項。


API接口模拟測試和(hé)驗證


可(kě)以對發布的API接口進行模拟測試和(hé)驗證,因此需要提供在線的A都視PI測試工具,能夠方便在線進行API接口公體的測試工作。同時可(kě)以對測試過的用例和(hé)測試數會輛據進行保存。


API接口文(wén)檔生成


支持自動(dòng)生成API接口文(wén)檔的能力。這個坐道(gè)地方可(kě)以直接對接類似開源Swagger等工但藍具來實現API接口文(wén)檔的自動(dòng)生成厭頻功能。


對象常用接口操作

e75011a10e62e0e568ee4fdc2506821e.png


當對象定義完成後,可(kě)以基于對象進校呢行相關(guān)API接口的自動(dòng)生成。在這裡簡單列下(x書樂ià)基于對象常用的接口方法,主要包括新山作增一條數據,基于主鍵更新,查詢,删除數據。其它的則通呢是基于條件查詢對數據進行查詢相關(guān)操作等。


在GtiHub裡面開源又一個(gè)xmysql的工樂大具,可(kě)以直接将整個(gè)MySQL數據庫中(zhōng)那術的數據庫表發布為RestAPI接口,具體可(kě)以安裝試用。

npm install -g xmysql

xmysql -h localhost -u作看 mysqlUsername -p mysqlPasswo器農rd -d databaseName

http://localhost:3000

注意需要提前安裝Node.js,部分接口方法著跳列表如(rú)下(xià):


圖片


由于生成的API接口都沒有相關(guān)的權限控制,因此該開源工具也僅厭林僅用于自己測試和(hé)驗證使用。但是生成的方法和(hé)API可(kě)以作廠道為API開發工具時候參考。


實際上對于API接口的生成,我們并不建議對于複電農雜查詢條件下(xià)的查詢都通(tōng)過G美文ET方法來實現,更好的思路(lù)還是通(tō司機ng)過POST方法,将查詢條件作為POST輸入進行處理。


複合對象一次生成


比如(rú)将訂單作為一個(gè)對象,實懂計際包括了訂單頭和(hé)訂單明細表,而在進行API生成時候可(kě)以一次些東生成基于訂單對象的插入操作,查詢操作。最終查詢出來答議的是一個(gè)訂單複合實體Json數據。而對于訂單插入,也是先準備好整個門刀(gè)訂單實體信息,一次調用API接口完成數據吧劇插入,也方便在API接口實現的時候進行事務控制。


複合對象生成的API接口更類似于領域對象暴露的API接口服器事務能力。


分頁支持


對于查詢API接口服務的生成,應該支持分頁能力,具體分頁章子的大小,本次查詢訪問(wèn)具體頁數等信息都可(林商kě)以作為API接口的查詢輸入參數進行設置。


直接定義API接口并發布

圖片


圖片


在前面談到了基于對象來發布API接口服務,但是農森還有一些業(yè)務規則邏輯類接口,複雜的管理暗人數據查詢類接口等并不能簡單的通(tōng)過對象來自動(dòng)生成。


因此還需要能夠實現基于方法來發布API接口服務。


即在API快速開發平台能夠進行API接口的自定義,詳細的定義API黃志接口的輸入參數和(hé)輸出參數信息。同時對于定義完成的接口實現和(h服舊é)後台方法的綁定。


實現和(hé)JAR包裡面的API接口的綁定


可(kě)以實現和(hé)一個(gè)JAR包裡但湖面方法或函數的綁定,将一個(gè)方法或函數發布為一個(gè)Htt的樹p API接口方法。在當前很多公有雲的雲服務總線産品上可(kě)以看到這個(g影金è)實現方式。


實現和(hé)動(dòng)态SQL的綁定


可(kě)以将定義的一個(gè)API接口方法和(hé)動(dò舊能ng)态SQL進行綁定。其中(zhōng)動(dòn河動g)态SQL本身具體動(dòng)态輸入參數,這些輸入參數和(hé)API接口術頻定義中(zhōng)的輸入進行數據映射。同時SQL語句查詢的輸出結果和(哥舊hé)API接口定義的輸出字段進行映射。


如(rú)果動(dòng)态SQL是插入或更新類,同樣也可(能匠kě)以通(tōng)過參數化變量方式進拿計行數據映射和(hé)綁定操作。


和(hé)存儲過程進行綁定


一個(gè)數據庫的存儲過程,實際即是一個(gè)說也方法函數,因此可(kě)以将API接口定義女裡的輸入和(hé)輸出和(hé)數據庫存儲過程的輸入和(hé)輸出進行映射綁定。動木


要注意的是針對不同的數據庫存儲過程schema信息綠鄉獲取和(hé)适配本身有差異,這也是在上圖中(zhōng)構建一個(司數gè)獨立的統一數據庫适配層的原因。


規則處理

圖片


在API接口開發過程中(zhōng),可(kě)以進行一些簡單的規則處理。具放討體如(rú)下(xià):


輸入數據完整性校(xiào)驗,對輸入數據進行完整性校(女玩xiào)驗,其中(zhōng)包括場景的數據類型,長度,範圍行日約束等,這些都是屬于比較容易通(tōng)過配置進行實現的内容。

數據項間規則處理,可(kě)以對多個(gè)數據項進行簡單規則處理,其中(zh科兵ōng)包括了場景的數據映射,數據豐富,數據截取等。這些本身聽數也是在主流的傳統ESB總線産品中(zhōng)都支持睡聽的内容。

自定義腳本語言,對于API快速開發平台本身可(kě吧男)以作為低代碼開發平台的一個(gè)子(zǐ)類,因此如(rú)果能夠支持自綠我定義腳本語言進行規則處理,那麼整體擴展性和(hé)靈活性什下也會得到大幅度提升。

消息頭和(hé)輸出預留,對于API開發平台發布的API舊笑接口,需要對輸入消息頭,輸出的異常類型,異常編碼,信息等字段進行提前約拍雜定。


在輸入的消息頭中(zhōng)往往包括了類似用戶名,Token等用于訪問(w機歌èn)安全校(xiào)驗的字段,也包括了類似路(lù)由,分頁等相關(g如了uān)擴展字段信息。對于輸出字段,需要對返回綠件的異常類型,編碼,異常信息等進行約定。特别是涉及到數據CUD操火年作的時候,需要按約定的輸出字段進行輸出。


服務組合和(hé)編排

圖片


對于API開發平台還可(kě)以進一步提供資靜服務組合和(hé)服務編排的能力。這個(gè)能力的實現也不适合放在AP費藍I網關(guān)來完成,而是應該規劃到API開發平台來實現。


圖片


服務組合編排是服務組合,服務組裝等,希望通(tōng)過服務編排能夠完成下場這些事情,而不是簡單的完成單一服務的設計和(hé)物司開發。即将多個(gè)原子(zǐ)服務組合或組裝在一起,校章最終形成一個(gè)新的服務并提供的能力。我們舉理森例來說明下(xià)。


比如(rú)存在A,B,C三個(gè)原子(zǐ)服務,我請低們通(tōng)過服務編排形成一個(gè)新的D服務。


三個(gè)原子(zǐ)服務全部是查詢服務,希望組裝商的一個(gè)新服務,一次返回A,B,C三個(gè)服務查詢結果


這個(gè)即我們說的服務組合能力,比如(rú)我們可(kě)以對合錯務同基本信息查詢,合同條款信息查詢,合同執行信嗎亮息查詢三個(gè)基本原子(zǐ)服務進行組合醫科,最終返回一個(gè)服務綜合信息查詢的服務,一次雪這返回三個(gè)查詢結果。


在這種場景下(xià)我們需要考慮查詢結果是并行返回還是按層次返回即可(kě就拍)。


二個(gè)查詢類的原子(zǐ)服務,最終需要返回兩個(gè)數據集關(gu西舞ān)聯查詢的結果集


這個(gè)在微服務架構做了底層數據庫拆分後經常會遇到,比如(r為人ú)對于物料基本信息查詢,和(hé)采購訂單明細查詢是在兩個(g微冷è)獨立的數據庫獨立服務提供。而我們希望返回的查詢結果集是物料關錢編碼,名稱,型号,單位,價格,采購數量的複合結果集。


這種場景下(xià)往往一般都是在前端功能開發的報嗎時候進行組裝,而實際上可(kě)以考慮是否可他花(kě)以在服務編排層解決這個(gè)問(w會還èn)題,該問(wèn)題寫代碼來解決容易,但是要長拍做為可(kě)視化服務編排組态方式來做實際上有一定的難度。


對單個(gè)已有服務進行裁剪和(hé)豐富并形成一個(書煙gè)新服務輸出


這個(gè)暫時也将其納入到服務編排的範疇,即仍然是輸入服務,但是輸出區雜是提供了一個(gè)新服務。


即對單個(gè)已有的服務進行服務裁剪和(hé靜鐵)豐富,比如(rú)對于輸出結果過濾掉一些數街房據項,對于輸入固定輸入一些數據項等。這些簡單的服務裁剪,豐富土報,或簡單的數據轉換可(kě)以在服務編排的時候完成,并提供一個師些(gè)新服務。


對多個(gè)原子(zǐ)服務進行流程式的前後串接并形成服務提供


這個(gè)是我們經常看到的一種服務編排場車讀景,即A,B,C三個(gè)服務直接進行編排,即A服黑行務的輸出直接變為B服務的輸入,B服務的輸出又變為C內吧服務的輸出。如(rú)果僅僅是上面假設的這樣,那麼這行水種流程式的服務編排仍然很簡單,也很容易去外友實現。


但是實際上的難點在于A服務的輸出本身也需要作為C服務的輸出,同時A,B服書是務的輸出也可(kě)能是整體輸出的一部分,這志術本身就加大了服務編排可(kě)視化設計的難度。


單一業(yè)務服務為主體服務,但是編排多個(gè)業(yè)務規則邏輯處理類姐道服務


這也是經常會遇到的場景,比如(rú)我們在進行合同信息導工機入的時候,首先要調用合同有效性校(xiào)驗服務,同時還有調用預微煙算信息檢查和(hé)扣減服務進行相關(guān)的完整性玩線和(hé)業(yè)務規則校(xiào)驗。在這些校(xiào)驗完你機成後再調用實際的合同信息導入服務,如(rú)果校(xiào)驗失敗則直接返回用機失敗結果。


這類服務編排往往也正是我們實際在進行前端功能開發時候服務進行組裝的邏輯。


多個(gè)導入服務組裝為一個(gè)導入服務合并導入并形成一個(gè)新服水飛務


這個(gè)場景實際上和(hé)場景1是對應的車光,既然多個(gè)服務可(kě)以組合後短舊形成組合結果返回,那麼自然可(kě)以将多個(gè)導入服務合并為一個(gè河火)導入服務,一次性的完成數據導入。


比如(rú)有項目信息導入和(hé)項目WBS信息導入兩個(gè)短嗎原子(zǐ)服務,那麼我們就可(kě)以提供一個(gè)新的項目信息導入火體服務,一次完成項目基本信息和(hé)項目WBS信息的導入。


80d289cad7e643020e65005ba43c4579.jpg


在這些場景裡面可(kě)以看到,實際上服務編排就是服務串聯,服務并聯下(xi行亮à)的輸入和(hé)輸出合并,服務内容豐到數富和(hé)裁剪等常見場景。在一個(gè)理想的場景姐頻下(xià),我們最希望實現的就是一個(事計gè)業(yè)務功能點的實現完全能夠通(tōng照睡)過服務編排可(kě)視化設計方式來完成。森問


關(guān)于服務編排詳細說明可(kě)以參考:https://www窗家.toutiao.com/i68603994501713門美76141/


源代碼導出

f79101d72035f74c82bc6e29ea8b4db7.png


對于API快速開發平台,很難去實現複雜的業(yè)務規則編碼。因此在存在複哥都雜業(yè)務規則實現的時候仍然是建議開發人員自己開發聽暗代碼來完成。因此整個(gè)平台應該提供源代碼導出功能視資,導出的源代碼應該直接能夠編譯通(tōng)過文務,脫離(lí)API開發平台部署和(hé)運行。


對于導出的源代碼,考慮到後續API接口變更的場景,建議是對擴展部請師分進行約定。


比如(rú)一個(gè)标準的API接口服務實現方法,可(kě)亮著以在前後增加擴展處理。

//BeforeDo();

//ProcessAPI();

//AfterDo();

這樣在接口實現前可(kě)以進行額外的業(y離東è)務規則處理和(hé)完整性校(xiào)驗,在接口車南返回數據前還可(kě)以對輸出的數據進一步進行處理和(hé)加工中內。


微服務應用


可(kě)以将多個(gè)對象或多個(gè)API接口服務打風章包到一個(gè)微服務應用再進行部署和(hé)發布。因此在這裡引入一市睡個(gè)微服務集的概念,對微服務API進行打包處理。


打包完成的微服務可(kě)以導出為獨立的學放JAR包進行部署,也可(kě)以直接在API開報習發平台進行托管部署。對于API開發平台本身應該對接到微服務運他子行平台。