這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Swift在GAIA平臺(tái)云端一體化的探索是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)是一家專業(yè)提供碌曲企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、HTML5、小程序制作等業(yè)務(wù)。10年已為碌曲眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
S1 階段在使用 SwiftUI 編寫集團(tuán)內(nèi)部使用的 SOT APP 時(shí),有幸參與到 GAIA (FaaS)平臺(tái)云端一體化的探索,從頭到尾實(shí)現(xiàn)了一套基于 Swift 語(yǔ)言實(shí)現(xiàn)的遵守 GAIA Funtion 標(biāo)準(zhǔn)的 Runtime Framework,并完成了從客戶端到后端使用統(tǒng)一的語(yǔ)言棧完成一體化鏈路的探索。
作為一個(gè)純 iOS Native 端開發(fā)者,對(duì)于后端的技術(shù)體感,大部分還遺留在上學(xué)期間做的論壇管理系統(tǒng),加之 FaaS Serverless 等都是一些后端領(lǐng)域較前沿的技術(shù)點(diǎn),尤其是在后端還算是初生牛犢的 Swift 語(yǔ)言,期間走過(guò)無(wú)數(shù)的彎路,但也學(xué)到了很多新的知識(shí)。
下面是對(duì) Swift On GAIA 的階段性總結(jié)和思考。由于此次技術(shù)探索有較多跨端知識(shí),作為一個(gè)移動(dòng)端工程師的視角理解可能非常片面和有誤,如讀者發(fā)現(xiàn)對(duì)概念有解釋不對(duì),歡迎大家留言區(qū)多多指正。由于在技術(shù)棧上前端生態(tài)已有較多探索, Native 端上的探索和技術(shù)儲(chǔ)備落后與前端,有些實(shí)現(xiàn)會(huì)隨著云端一體化得探索而改變,并不是一個(gè)已經(jīng)完備的解決方案,歡迎各位開發(fā)愛好者積極討論,造福生態(tài)。
Serverless
Serverless 起始是一個(gè)比較早的名詞,早到 2012年,彼時(shí)的我才剛背起小書包走進(jìn)大學(xué)里,但是早期的理論基礎(chǔ)已經(jīng)被提出。
隨著 2014年 AWS 的 Lambda 產(chǎn)品出現(xiàn), Serverless 為云中的應(yīng)用提供了一種全新的架構(gòu)體系, Serverless 開始大火,之后各大云計(jì)算廠商的加入,Google Cloud Functions, Azure Funcions, IBM OpenWhisk Aliyun 以及其他國(guó)內(nèi)的云計(jì)算廠商,如 華為云,騰訊云,百度云,短短數(shù)年時(shí)間 Serverless產(chǎn)品已遍地開花。
隨著容器技術(shù),IoT,5G,技術(shù)的快速發(fā)展, 技術(shù)上對(duì)去中心化,輕量虛擬化,細(xì)粒度計(jì)算等技術(shù)需求愈發(fā)強(qiáng)烈,而 Serverless 必將借勢(shì)迅速發(fā)展,對(duì)將來(lái)的富客戶端的研發(fā)模式的改變,則需要我們這些技術(shù)人持續(xù)的去探索和創(chuàng)造了。
我們?cè)诶斫?Serverless 的過(guò)程中先來(lái)看一看云服務(wù)的進(jìn)化史,云計(jì)算經(jīng)歷了物理機(jī)房 -> IaaS -> PaaS -> SaaS -> FaaS/BaaS 。
? IaaS
IaaS(Infrastructure as a Service)基礎(chǔ)設(shè)施即服務(wù)。指把 IT 基礎(chǔ)設(shè)施作為一種服務(wù)通過(guò)網(wǎng)絡(luò)對(duì)外提供。在這種服務(wù)模型中,用戶不用自己構(gòu)建一個(gè)數(shù)據(jù)中心,而是通過(guò)租用的方式來(lái)使用基礎(chǔ)設(shè)施服務(wù),包括服務(wù)器、存儲(chǔ)和網(wǎng)絡(luò)等。在這層公司通常購(gòu)買的是存儲(chǔ),網(wǎng)絡(luò)的基礎(chǔ)服務(wù)。
? PaaS
PaaS(Platform as a Service) 平臺(tái)即服務(wù),服務(wù)商提供基礎(chǔ)設(shè)施底層服務(wù),提供操作系統(tǒng)(Windows,Linux)、數(shù)據(jù)庫(kù)服務(wù)器、Web服務(wù)器、負(fù)載均衡器和其他中間件,相對(duì)于 Iaas 客戶僅僅需要自己控制上層的應(yīng)用程序部署與應(yīng)用托管的環(huán)境。通常在這層用戶一般購(gòu)買的是操作系統(tǒng)。
? SaaS
SaaS(Software as a Service) 軟件即服務(wù),SaaS 是一種通過(guò) Internet 提供軟件的模式,用戶不用再購(gòu)買軟件,而改用向提供商租用基于 Web 的軟件,來(lái)管理企業(yè)經(jīng)營(yíng)活動(dòng),且無(wú)需對(duì)軟件進(jìn)行維護(hù),服務(wù)提供商會(huì)全權(quán)管理和維護(hù)軟件,通常這些常用的軟件有 數(shù)據(jù)庫(kù),網(wǎng)絡(luò)服務(wù),等。
可以通過(guò) Microsoft Azure 服務(wù)的一張圖來(lái)直觀感受下
GAIA 平臺(tái)大大縮短了后端的研發(fā)鏈路,提高了交付成本,屏蔽了運(yùn)維細(xì)節(jié),這對(duì)于一個(gè)跨棧的開發(fā)者也能簡(jiǎn)單理解。
GAIA容器架構(gòu)
看過(guò) GAIA 的概念,有必要簡(jiǎn)單的了解一下 GAIA 容器架構(gòu)。
作為一個(gè)端上開發(fā)者,恰逢使用 SwiftUI 構(gòu)建 SOT APP 移動(dòng)版,在滿足需求的同時(shí),有探索新技術(shù)。
但是作為一款數(shù)據(jù)大盤的 APP,數(shù)據(jù)從哪里來(lái)?從后端數(shù)據(jù)庫(kù),由于之前從未有過(guò)移動(dòng)端APP,后端同學(xué)并未對(duì)外提供 MTOP 的接口供移動(dòng)端使用,了解到可以在 FaaS 平臺(tái)調(diào)用已有的 HSF 服務(wù),返回領(lǐng)域內(nèi)的模型,GAIA 平臺(tái)可以對(duì)外發(fā)布為 MTOP 接口,剛好滿足需求。
前期的調(diào)研中,發(fā)現(xiàn) GAIA 的平臺(tái)語(yǔ)言棧選擇了后端的王牌語(yǔ)言 Java,F(xiàn)unction Runtime Framework 最早版本只支持Java,后期隨著前端棧的探索和 閑魚團(tuán)隊(duì)的 Flutter 探索,目前平臺(tái)已經(jīng)支持 Dart Runtime, Node.js Runtime。
作為一個(gè) iOS Native 開發(fā)者,沒有自己熟悉的語(yǔ)言怎么辦?Swift 于 2019年 WWDC 宣布 發(fā)布 5.x 版本,Swift5.x 版本 ABI 穩(wěn)定,標(biāo)志著 Swift 正式進(jìn)入成熟語(yǔ)言行列,加上 Swift 誕生之初就是一門跨平臺(tái)的語(yǔ)言,并且也有開源的 Server side workgroup推進(jìn)著 Swift 在后端領(lǐng)域的探索,也涌現(xiàn)出一些 知名的庫(kù) Kitura Vapor Perfect Zewo。
于是我們嘗試用 Swift 構(gòu)建一套 Function Runtime Framework,先來(lái)了解下 Runtime Framework 是為了完成什么?
Swift Runtime Framework 需要完成如下操作
Swift 運(yùn)行時(shí)初始化。
日志監(jiān)控
通信協(xié)議
集團(tuán)已有中間件調(diào)用
Function 調(diào)度
發(fā)布系統(tǒng)構(gòu)建
在后端部署的服務(wù)都是可彈性的,GAIA 也不例外,Swift Function Runtime, Swift Function 交付都是制作成 Docker Image 統(tǒng)一交付。簡(jiǎn)化如圖所示。
正式上線
Funtion Runtime Framework 完成后,就可以通過(guò) GAIA 的發(fā)布平臺(tái)創(chuàng)建函數(shù),編寫自己的業(yè)務(wù)代碼里,這里就不分享如何操作了,直接上示例代碼和效果圖。
// File.swift // // // Created by nero on 2019/9/12. // import GAIA import HSF import Foundation struct EventResult: GAIA.EventResult { var isSuccess: Bool = true var code: String = "200" var message: String = "SOT Test" var payLoad: TestContent init(payLoad: String) { self.payLoad = TestContent(content: payLoad) } } struct MtopUserQuery: Codable { let pageNo: String let pageSize: String let appName: String } struct PageQuery: HSFModel { let javaClassName = "com.xx.PageQuery" let request: PageQueryRequest let pageNo: Int let pageSize: Int init(pageNo: Int, pageSize: Int, appName: String) { self.pageNo = pageNo self.pageSize = pageSize self.request = PageQueryRequest(appName: appName) } let apiConsumer = PageQueryAPIConsumer() } struct PageQueryAPIConsumer: HSFModel { let javaClassName = "com.xx.ApiConsumer" let clientName = "SOT-APP" let token = "xxx" } struct PageQueryRequest: HSFModel { let javaClassName = "com.xx.AppQueryRequest" let appName: String } class Handler: GAIA.FunctionHandler { init(){} var consume: ConsumerService func handle(when event: Event, context: FunctionContext) throws -> AnyEventResult { switch event.payLoad { case .mtop(body: let mtopRequest): do { let query = try JSONDecoder().decode(MtopUserQuery.self, from: mtopRequest.data) let sotQuery = PageQuery(pageNo: query.pageNo, pageSize: query.pageSize, appName: query.appName) let jsonStr = try consume.invoke(methodName: "queryApp", args: [sotQuery]) return EventResult(payLoad: jsonStr).erasedEventResult } catch { } default: break; } return EmptyEventResult().erasedEventResult } func active(when context: FunctionContext) { } func destroy(when context: FunctionContext) { } func isHealth(when context: FunctionContext) -> Bool { return true } }
Swift On GAIA 在云端一體化的探索一期圓滿結(jié)束,一個(gè) iOSer 也可以同時(shí)開發(fā)前后端程序,這對(duì)研發(fā)模式也創(chuàng)造了一些新的可能,最近也多次聽大佬們的一些分享,如閑魚團(tuán)隊(duì)使用 Dart+flutter 在云端一體化研發(fā)模式的探索,有一些不成熟的視角,暫且記錄一下。
技術(shù)棧日常研發(fā)調(diào)試的困難?
在研發(fā)模式交流和一些實(shí)際探索的體驗(yàn)中發(fā)現(xiàn),端上的研發(fā)風(fēng)格和后端的研發(fā)風(fēng)格差異較大,端上的同學(xué)傾向于打斷調(diào)試,實(shí)時(shí)預(yù)覽效果,背后的原力是因?yàn)槎松弦斓慕桓?,端上的環(huán)境更容易構(gòu)建,但是后端的同學(xué)更傾向于日志系統(tǒng),鏈路追蹤。但其實(shí)無(wú)論是斷點(diǎn)調(diào)試還是日志系統(tǒng),本質(zhì)上需要一個(gè)有效排查問題的系統(tǒng),不然在實(shí)際開發(fā)中,由于跨技術(shù)棧會(huì)讓調(diào)試的成本變大, 系統(tǒng)一旦復(fù)雜起來(lái)反而會(huì)拖慢效率。
工程結(jié)構(gòu)的升級(jí)
在 Swift On GAIA 的實(shí)際體驗(yàn)中,使用的開發(fā)工具,應(yīng)用交付方式,都不統(tǒng)一,各個(gè)語(yǔ)言棧都有自己的研發(fā)風(fēng)格,工具鏈支撐,研發(fā)模式和工具鏈體系也需要對(duì)應(yīng)的升級(jí),避免鏈路過(guò)長(zhǎng),工具鏈割裂。
領(lǐng)域的邊界是什么?
目前閑魚的大佬在 GAIA 完成了 Dart Function 環(huán)境的支持,可以讓客戶端同學(xué)向前更進(jìn)一步,自己完成后端的能力,實(shí)現(xiàn)無(wú)上下游依賴的業(yè)務(wù)閉環(huán),并且屏蔽后端的細(xì)節(jié)。
不過(guò)在一些細(xì)節(jié)上的分析,發(fā)現(xiàn)不同的業(yè)務(wù)場(chǎng)景碰見的挑戰(zhàn)還是不同,如果一個(gè) Function 只使用已有的基礎(chǔ)設(shè)施,如接口聚合,簡(jiǎn)單的邏輯處理是比較合適的,但如果這個(gè)業(yè)務(wù)連數(shù)據(jù)的生產(chǎn)者也由客戶端的同學(xué)來(lái)寫復(fù)雜度就變大了,因?yàn)榭缍说乃季S方式不同,大前端同學(xué)可能不會(huì)思考更多存儲(chǔ)的設(shè)計(jì),未來(lái)在業(yè)務(wù)擴(kuò)大時(shí)就可能不容易擴(kuò)展。
那么在實(shí)現(xiàn)業(yè)務(wù)的的時(shí)候,如何界定一些領(lǐng)域的邊界是一個(gè)值得思考的點(diǎn),需要一些方法論或者指導(dǎo)原則,來(lái)幫助 Function 同學(xué)決策這款技術(shù)選型的可擴(kuò)展性。
人員組織架構(gòu)升級(jí)
如果研發(fā)模式大升級(jí),傳統(tǒng)的后端 API 發(fā)布,各端接入的人員上下游關(guān)系勢(shì)必會(huì)發(fā)聲比較大的變化,如何找到人員組織的方式也是需要重新定義和調(diào)整的。往小了說(shuō)干的活分配不一樣了,往大了說(shuō) 組織架構(gòu)也需要適應(yīng)時(shí)代調(diào)整。
中間件語(yǔ)言中立,平臺(tái)中立
目前后端大部分的語(yǔ)言棧都是 Java ,其中集團(tuán)部分團(tuán)隊(duì)使用 CPP,涌現(xiàn)了多個(gè) CPP 版本的 SDK 用來(lái)調(diào)用 Java 的生態(tài)框架,如 HSF CPP 版本 Tail CPP 版本 ,隨著 GAIA 平臺(tái)接入語(yǔ)言棧的變多,加上富客戶端 Swift/Kotlin/Java/Javascript,要不要做一些類似 Protobuffer 這種通過(guò)中立的 DSL 定義解決語(yǔ)言差異性。
這里作者是不太認(rèn)可一套語(yǔ)言解決所有環(huán)境的,一是目前手淘的生態(tài)分為 Native+Weex+H5+小程序,本身就難以聚合,二是單拿 iOS 端,在蘋果限制下的跨平臺(tái)總是有部分取舍的,不能解決全部問題。
領(lǐng)域特定/通用
未來(lái) Swift 在 FaaS 平臺(tái)上是朝著解決通用能力去前進(jìn)還是構(gòu)建領(lǐng)域模型,構(gòu)建領(lǐng)域特征可以構(gòu)建領(lǐng)域生態(tài)的 API,定義業(yè)務(wù)的模式,類似星環(huán)的風(fēng)格,如果構(gòu)建的是通用能力,解法可能是另外一種。
上述就是小編為大家分享的Swift在GAIA平臺(tái)云端一體化的探索是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。