方志寧,謝 華,張金營,曹亞南
(1.國電電力發(fā)展股份有限公司,北京 100101;2.國能信控互聯(lián)技術(shù)有限公司,北京 102209)
企業(yè)因受制于傳統(tǒng)IT技術(shù)的影響,多沿用傳統(tǒng)單體式架構(gòu)進(jìn)行一系列平臺構(gòu)建等開發(fā)工作[1],但是隨著工業(yè)技術(shù)的不斷發(fā)展和迭代,企業(yè)信息化建設(shè)愈發(fā)趨向一體化,傳統(tǒng)IT架構(gòu)無法應(yīng)對當(dāng)前業(yè)務(wù)數(shù)據(jù)幾何倍增長,應(yīng)用服務(wù)不斷延伸迭代的情況[2]。單體式架構(gòu)系統(tǒng)其拓展性低,開發(fā)工作重復(fù)嚴(yán)重,運維難度大,代碼耦合程度高等弊端日益顯著[3],前中期系統(tǒng)平臺的開發(fā)和后期運維工作難度急劇上升。
為改善現(xiàn)階段平臺系統(tǒng)開發(fā)工作和運維工作內(nèi)容重復(fù)、難度過大等問題,本文一改傳統(tǒng)使用單體式架構(gòu)中心化開發(fā)建設(shè)系統(tǒng)的理念,將復(fù)雜應(yīng)用細(xì)?;瘎澐址?wù)[4],提出基于微服務(wù)架構(gòu)搭建的統(tǒng)一應(yīng)用開發(fā)平臺。在平臺設(shè)計中,將一個復(fù)雜進(jìn)程拆分成數(shù)個甚至數(shù)十個相互之間具有獨立性的組件,相關(guān)功能組件封裝成單一業(yè)務(wù)服務(wù),在進(jìn)行拓展時只操作對應(yīng)功能的微服務(wù),而非類似單體式架構(gòu)需要將應(yīng)用程序堆棧進(jìn)行整體處理[5]。應(yīng)用組件化,組件服務(wù)化,將軟件產(chǎn)品開發(fā)中重復(fù)繁瑣的步驟抽離出來,讓開發(fā)更簡單、更快速。
國內(nèi)外企業(yè)越來越多采用新型微服務(wù)架構(gòu)搭建系統(tǒng)框架[6],國內(nèi)外成功代表案例諸如Alibaba、京東、Walmart、Amazon等。眾多國內(nèi)外企業(yè)成功案例表明,微服務(wù)架構(gòu)作為一種系統(tǒng)框架在解決如今復(fù)雜業(yè)務(wù)導(dǎo)致的諸多問題上具有極為強(qiáng)大的能力。
文獻(xiàn)[7,8]介紹了系統(tǒng)架構(gòu)的演變及微服務(wù)架構(gòu)的優(yōu)缺點,文獻(xiàn)[9-11]結(jié)合實踐案例進(jìn)行分析。本文提出了基于微服務(wù)架構(gòu)的統(tǒng)一應(yīng)用開發(fā)平臺,針對該平臺的開發(fā)可有效提高應(yīng)用開發(fā)效率,降低系統(tǒng)運維難度。
2012年3月類似最初版本的微服務(wù)架構(gòu)概念在Agile India中被Fred George描述,在演講中他描述了2005年~2009年間Fred George團(tuán)隊實踐分析一百萬行的傳統(tǒng)程序代碼,最終將其分解為兩百余個類似于微服務(wù)組件的經(jīng)歷。盡管演講中并未明確提出微服務(wù)架構(gòu)這一名詞概念,但是最初版本的微服務(wù)架構(gòu)概念在Fred George的經(jīng)歷中已現(xiàn)雛形。
微服務(wù)架構(gòu)總的來說是一種特殊的面向服務(wù)架構(gòu)(SOA),是指將復(fù)雜應(yīng)用進(jìn)程細(xì)?;瘎澐殖芍痪哂袉我还δ艿慕M件,根據(jù)組件的各自功能將其封裝成離散的、可獨立部署的微服務(wù),進(jìn)而實現(xiàn)服務(wù)間的解耦。開發(fā)時不同服務(wù)可選擇不同的開發(fā)技術(shù),服務(wù)邊界明確,不同服務(wù)間可以通過直接使用REST/JSON等輕量級通信協(xié)議進(jìn)行協(xié)調(diào)溝通,避免了使用企業(yè)服務(wù)總線(ESB)所帶來的上限問題。在實際生產(chǎn)中,業(yè)務(wù)進(jìn)程由一組服務(wù)相互配合而成,開發(fā)過程中將相關(guān)業(yè)務(wù)邏輯結(jié)合數(shù)據(jù)組合成獨立業(yè)務(wù)部署單元。
微服務(wù)架構(gòu)本質(zhì)是由多個服務(wù)組合成的分布式系統(tǒng),基于微服務(wù)架構(gòu)開發(fā)框架目的是在不影響其它應(yīng)用組件的情況下,更快地實現(xiàn)新功能的拓展和老功能的迭代,降低系統(tǒng)運維難度。
現(xiàn)對微服務(wù)架構(gòu)主要特性總結(jié)為以下6方面:
1)技術(shù)多元:微服務(wù)架構(gòu)下,團(tuán)隊開發(fā)服務(wù)時可以根據(jù)當(dāng)前技術(shù)員技術(shù)偏重以及行業(yè)發(fā)展情況,選擇合適的技術(shù)棧進(jìn)行開發(fā)。
2)粒度可控:將復(fù)雜應(yīng)用程序分解為應(yīng)用服務(wù)或者可獨立部署的組件時,根據(jù)劃分業(yè)務(wù)服務(wù)的復(fù)雜程度可以人為地控制微服務(wù)框架的粒度。
3)拓展強(qiáng)大:將服務(wù)組合成應(yīng)用后,將整個應(yīng)用完整地復(fù)制到不同的節(jié)點可實現(xiàn)應(yīng)用進(jìn)程的橫向拓展,每個應(yīng)用都可以根據(jù)實際生產(chǎn)需求進(jìn)行拓展。
4)去中心化:避免企業(yè)服務(wù)總線的瓶頸缺點,服務(wù)之間通過輕量化通信協(xié)議相互協(xié)調(diào),且各個服務(wù)可獨立部署。
5)快速開發(fā):根據(jù)應(yīng)用進(jìn)程所需業(yè)務(wù)功能將各個微服務(wù)接口連接,可實現(xiàn)快速地開發(fā)應(yīng)用進(jìn)程。
6)自治應(yīng)用:服務(wù)的邊界確定,暴露固定接口,每個微服務(wù)可獨立封裝業(yè)務(wù)邏輯,以獨立進(jìn)程運行,所以具備可獨立開發(fā)、測試和部署的能力。平臺開發(fā)應(yīng)用高內(nèi)聚,低耦合,應(yīng)用間具備一定的自治能力。
統(tǒng)一應(yīng)用開發(fā)平臺構(gòu)架于國電電力大數(shù)據(jù)(Hadoop)下的一個應(yīng)用快速開發(fā)平臺。此平臺在設(shè)計過程中總結(jié)各方面的應(yīng)用案例,結(jié)合研究人員多年開發(fā)經(jīng)驗,推翻了以往的傳統(tǒng)架構(gòu)。在對平臺的設(shè)計中采用了微服務(wù)架構(gòu),同時將平臺定位為低代碼開發(fā)平臺,極大地提升了開發(fā)效率。該應(yīng)用開發(fā)平臺全面支持應(yīng)用監(jiān)控與追蹤、服務(wù)治理、配置管理、去中心化的服務(wù)組件、負(fù)載均衡可靠性保障等多種特性。
統(tǒng)一應(yīng)用開發(fā)平臺微服務(wù)架構(gòu)如圖1。平臺開發(fā)設(shè)計定位于后臺開發(fā)框架和企業(yè)級快速開發(fā)解決方案,在數(shù)字化高速發(fā)展的今天,供需兩側(cè)程序員數(shù)量及質(zhì)量不對等,需大于供,因此平臺的開發(fā)方式選用了低代碼開發(fā),易于開發(fā)設(shè)計應(yīng)用進(jìn)程。平臺支持分布式部署,采用松耦合設(shè)計,微內(nèi)核和插件架構(gòu),去中心化管理。平臺整體設(shè)計與開發(fā)遵循了Spring Cloud的技術(shù)開發(fā)路線,從功能上涵蓋了統(tǒng)一身份認(rèn)證、電子表單、工作流引擎、組態(tài)工具等應(yīng)用開發(fā)組件;平臺集成了數(shù)字化應(yīng)用商店和工程項目開發(fā)的全生命周期的管理。在平臺的設(shè)計過程中也針對平臺的安全方面做了對應(yīng)設(shè)計,例如平臺采取統(tǒng)一身份認(rèn)證,設(shè)置密碼策略、安全審計、日志收集等眾多安全選項,極大地降低了微服務(wù)系統(tǒng)架構(gòu)分布式部署這種模式所帶來的安全風(fēng)險。
圖1 統(tǒng)一應(yīng)用開發(fā)平臺微服務(wù)架構(gòu)Fig.1 Microservice architecture of unified application development platform
統(tǒng)一應(yīng)用開發(fā)平臺核心功能體現(xiàn)在如下8個方面:
1)低代碼開發(fā)
平臺的低代碼開發(fā)是基于對象模型驅(qū)動的,其中包括了對象建模、權(quán)限建模、流程建模、上層表單建模、報表建模、擴(kuò)展規(guī)則建模6種建模能力,通過API接口驅(qū)動前后端進(jìn)行整合,體現(xiàn)出SOA分層架構(gòu)。低代碼開發(fā)中在對核心的對象建模驅(qū)動完成后,繼續(xù)向下層生成了數(shù)據(jù)庫表和數(shù)據(jù)對象,同時向上打開了標(biāo)準(zhǔn)的API接口服務(wù),從而推動上層的自定義和表單建模。在此過程中可以綁定底層對象開放的API接口,也可以集成拓展規(guī)則建模能力,在建模結(jié)束后提供拓展相應(yīng)的報表建模能力。
2)流程引擎
流程引擎是低代碼開發(fā)的核心,是將業(yè)務(wù)服務(wù)按照設(shè)定的固定路徑進(jìn)行流轉(zhuǎn),將服務(wù)應(yīng)用步驟轉(zhuǎn)換成計算機(jī)能理解的形式。在開發(fā)過程中,通過拖拽進(jìn)行流程設(shè)計,流程服務(wù)化,獨立部署。通過連接服務(wù)節(jié)點實現(xiàn)應(yīng)用鏈?zhǔn)浇Y(jié)構(gòu),每個連接節(jié)點作為當(dāng)前鏈頭節(jié)點,服務(wù)內(nèi)包含下層連接節(jié)點索引,實現(xiàn)應(yīng)用進(jìn)程流程可視化。
3)統(tǒng)一認(rèn)證
統(tǒng)一認(rèn)證模式通過統(tǒng)一身份認(rèn)證實現(xiàn)。平臺統(tǒng)一身份認(rèn)證采用層次式結(jié)構(gòu),將平臺統(tǒng)一認(rèn)證分為三層次的層級結(jié)構(gòu),分別為數(shù)據(jù)層、認(rèn)證通道層、認(rèn)證接口層。在平臺中,統(tǒng)一身份認(rèn)證的主要功能模塊有兩種,分別為用于進(jìn)行統(tǒng)一認(rèn)證的身份認(rèn)證模塊和應(yīng)用內(nèi)進(jìn)行權(quán)限設(shè)定的權(quán)限管理模塊,通過調(diào)用兩個功能模塊隔離異常登錄行為,確保平臺身份安全。建立自動化的賬號同步體系,達(dá)到在平臺中單點登錄后可跨應(yīng)用認(rèn)證的賬號同步體系,同時在不同業(yè)務(wù)進(jìn)程內(nèi)自行設(shè)定權(quán)限控制,以實現(xiàn)對用戶的權(quán)限管理。
4)組態(tài)能力
平臺中的組態(tài)能力是指與硬部件組裝類似的,通過在系統(tǒng)中預(yù)設(shè)封裝好的“軟部件”,應(yīng)用中通過拖動對應(yīng)的2D圖像進(jìn)行對業(yè)務(wù)框架的一個搭建,搭建好框架后只需設(shè)置好軟部件參數(shù)即可將搭建的程序投入使用。組態(tài)能力提供了平臺無代碼開發(fā)的功能,同時組態(tài)軟件也提供了相應(yīng)的編程手段,可實現(xiàn)無代碼開發(fā)與常規(guī)代碼開發(fā)的協(xié)調(diào)合作。同時平臺對接了不同的數(shù)據(jù)源,在大屏以及監(jiān)控方面可以實現(xiàn)廣泛的應(yīng)用。
5)定時任務(wù)管理
平臺在采取基于數(shù)據(jù)庫動態(tài)配置的方法對任務(wù)實行動態(tài)管理。平臺對任務(wù)進(jìn)行管理時,摒棄了傳統(tǒng)方法中在代碼程序明確固定表達(dá)式的方法,采用了基于數(shù)據(jù)庫讀取定時任務(wù)的設(shè)定執(zhí)行時間的方法。在對任務(wù)進(jìn)行修改時,無需對系統(tǒng)進(jìn)行重啟,降低了運維和追蹤的難度。平臺統(tǒng)一管理定時任務(wù),提供了統(tǒng)一的開發(fā)標(biāo)準(zhǔn),提供了可視化界面,系統(tǒng)在開發(fā)應(yīng)用時的效率得到大幅度提升,相關(guān)工作步驟得到有效優(yōu)化。
6)文檔儲存組件
平臺提供了高性能、分布式的對象儲存能力。平臺將數(shù)據(jù)儲存在一組分布式獨立部署的服務(wù)器中,通過獨立服務(wù)器分擔(dān)系統(tǒng)數(shù)據(jù)儲存負(fù)荷,因此系統(tǒng)結(jié)構(gòu)具備強(qiáng)拓展性。平臺通過查詢服務(wù)器的位置信息定位所需的儲存信息,根據(jù)不同場所部署相應(yīng)功能的服務(wù)器,再通過軟件將服務(wù)器連接成高性能邏輯池。平臺所使用文件儲存架構(gòu)具備高度可靠性,支持多種儲存服務(wù),例如支持Hadoop組件HDFS。
7)工程項目管理
針對平臺開發(fā)的項目進(jìn)行項目生命周期管理,制定為國電電力業(yè)務(wù)軟件開發(fā)的規(guī)范編制。其中包括:應(yīng)用開發(fā)統(tǒng)一規(guī)范、應(yīng)用開發(fā)UI設(shè)計規(guī)范、應(yīng)用開發(fā)編碼規(guī)范、應(yīng)用開發(fā)數(shù)據(jù)庫設(shè)計規(guī)范、應(yīng)用開發(fā)集成規(guī)范、應(yīng)用分類標(biāo)識規(guī)范、應(yīng)用功能與權(quán)限標(biāo)識規(guī)范。對業(yè)務(wù)軟件的開發(fā)制定出一整套全方位的標(biāo)準(zhǔn),統(tǒng)一代碼風(fēng)格,提供開發(fā)約束,降低服務(wù)開發(fā)團(tuán)隊間的交流成本。
8)應(yīng)用商店
平臺開發(fā)團(tuán)隊通過Html、JavaScript、CSS等技術(shù)開發(fā)出應(yīng)用商店體系。通過將平臺開發(fā)的應(yīng)用以及公共業(yè)務(wù)應(yīng)用等進(jìn)行收納,通過統(tǒng)一標(biāo)準(zhǔn)進(jìn)行管理,形成應(yīng)用商店體系,方便用戶下載使用各類業(yè)務(wù)應(yīng)用。應(yīng)用商店提供給用戶統(tǒng)一入口,通過用戶統(tǒng)一身份認(rèn)證可快速接入入口,找到應(yīng)用后無需再次登入,即用即取。
圖2 平臺總體服務(wù)架構(gòu)設(shè)計Fig.2 Overall service architecture design of the platform
統(tǒng)一應(yīng)用開發(fā)平臺開發(fā)設(shè)計遵循Spring Cloud的技術(shù)開發(fā)路線,平臺核心功能作為公共組件,可封裝組成微服務(wù),組件服務(wù)化。
微服務(wù)的核心是將進(jìn)程劃分成多個獨立服務(wù),并要求服務(wù)之間具備松耦合等特性,要求整體架構(gòu)更徹底地去中心化。Spring Cloud是分布式微服務(wù)架構(gòu)的一站式解決方案[10],Spring Cloud提供了一套十分通俗易懂、應(yīng)用方便的編程模型,Spring Cloud在總體架構(gòu)設(shè)計中基于Spring Boot的基礎(chǔ)上可以輕松構(gòu)建微服務(wù)。
平臺基于Spring Boot提供微服務(wù)開發(fā)組件,客戶端發(fā)送Restful風(fēng)格的Web請求。請求通過Nginx服務(wù)端負(fù)載均衡器分配節(jié)點向網(wǎng)關(guān)發(fā)送API調(diào)用,Spring Cloud Gateway收到調(diào)用請求后對信息進(jìn)行二次處理,完成后向Nacos注冊中心查詢微服務(wù)地址。注冊中心返回微服務(wù)HTTP地址后,Spring Cloud Gateway對其進(jìn)行服務(wù)調(diào)用,根據(jù)調(diào)用微服務(wù)所需數(shù)據(jù),從數(shù)據(jù)總線中獲取對應(yīng)數(shù)據(jù)。
在去中心化的架構(gòu)中,對于注冊發(fā)現(xiàn)還是中心化的。平臺通過將注冊中心集群化處理,在微服務(wù)端設(shè)置微服務(wù)目錄和微服務(wù)列表的緩存,避免注冊中心宕機(jī)后整個微服務(wù)調(diào)用失敗的發(fā)生。
平臺使用了Spring Boot Admin、Sleuth Zipjkin、Hystrix、Sentinel實現(xiàn)對平臺的監(jiān)控保護(hù):
1)Spring Boot Admin作為當(dāng)前的主流開源項目,應(yīng)用程序端的Admin Client通過基于HTTP實現(xiàn)的RESTful協(xié)議使用注冊中心,或者通過Admin Server注冊實現(xiàn)監(jiān)控管理應(yīng)用程序的功能。
2)Sleuth Zipjkin通過將分布式請求還原成調(diào)用鏈路,同時在鏈路上生成Trace ID和Span ID進(jìn)行日志記錄,以達(dá)到展現(xiàn)原分布式請求調(diào)用信息的目的,并且提供API供客戶端查詢追蹤數(shù)據(jù)。同時提供UI組件,使客戶端便捷實現(xiàn)對請求的搜索跟蹤、分析分布式請求,調(diào)用鏈路日志明細(xì)等服務(wù)。
3)Hystrix(斷路器)使用基于異常比率的熔斷降級策略,通過線程池或者信號量隔離的隔離策略隔離訪問遠(yuǎn)程系統(tǒng)、服務(wù)和第三方庫。
4)Sentinel使用基于響應(yīng)時間、異常比率和異常數(shù)的熔斷降級策略,通過信號量隔離進(jìn)行限流功能。
Nacos Config配置中心提供Serve端和Client端,Serve端提供配置文件儲存,并通過HTTP向與開發(fā)段分離的配置中心提供基于微服務(wù)的API。Client端設(shè)置在各個微服務(wù)端,通過接口接收配置修改數(shù)據(jù)后,依據(jù)接收到的數(shù)據(jù)初始化對應(yīng)微服務(wù)應(yīng)用,并向數(shù)據(jù)庫發(fā)送修改的配置屬性記錄。在使用Spring Cloud開發(fā)框架引用管控、治理方面內(nèi)容時,傳統(tǒng)的開發(fā)方式為在開發(fā)階段就考慮實現(xiàn)相應(yīng)接口并且組建相應(yīng)的配置文件,但到服務(wù)治理開發(fā)階段時,開發(fā)端和服務(wù)的管控治理端嚴(yán)重耦合,想要修改就需修改開發(fā)源碼并對服務(wù)重新部署。微服務(wù)在開發(fā)端的重點為實現(xiàn)微服務(wù)必備的業(yè)務(wù)功能,同時暴露相應(yīng)接口,對于微服務(wù)組件以及API服務(wù)接口的管控治理方面的能力應(yīng)在去中心化的服務(wù)治理端實現(xiàn),與開發(fā)端主要職能分離。平臺采用運行態(tài)的配置模式,可以動態(tài)地調(diào)整配置參數(shù),對管控治理端的修改也無需再對服務(wù)重新部署。
平臺通過在微服務(wù)組件端下發(fā)一個代理,通過對流量的攔截,達(dá)到良好的相關(guān)管控和治理能力。例如微服務(wù)A調(diào)用微服務(wù)B時,應(yīng)靈活可配置,通過配置調(diào)用過程中相關(guān)日志的審計與記錄、配置具體熔斷規(guī)則等方式,達(dá)到“訪問安全,數(shù)據(jù)安全”的目標(biāo),后期不需要對微服務(wù)本身再做修改。
本文提出的統(tǒng)一應(yīng)用開發(fā)平臺是基于微服務(wù)架構(gòu)相關(guān)技術(shù)來設(shè)計和實現(xiàn)的,旨在解決單體式架構(gòu)拓展性低,部分開發(fā)工作重復(fù)嚴(yán)重,運維難度大,代碼耦合程度高等問題,可以有效地支撐業(yè)務(wù)開發(fā)團(tuán)隊快速地構(gòu)建微服務(wù);提出了統(tǒng)一的開發(fā)標(biāo)準(zhǔn),增強(qiáng)了系統(tǒng)的安全與穩(wěn)定,具有良好的拓展性。