前言
隨著時代的發展,網路通訊已經成為人們日常生活中不可或缺的一部分。在5G時代背景下,傳統的網路通訊已經不能滿足工業側及企業強應用通訊的需求,出於安全性、穩定性的要求,專有網路通訊逐步成為通訊市場的一支重要力量。作為通訊運營商,我們更是應該在專網通訊領域展現出自身的通訊優勢。
除了通訊技術的發展之外,對應於CT通訊技術的發展需求,作為IT側的Web前端開發也需要順應時代發展構建出符合業務及產業模式的架構模型,為ICT融合提供技術方案支援。本文旨在通過專網通訊領域的業務實踐,從系統性、結構性、健壯性等幾個不同的維度來闡述前端架構設計過程中的考量與分析。
系統性
系統設計作為整個軟體工程專案的頂層設計,是根據系統分析的結果,運用系統科學的思想和方法,設計出能最大限度滿足所要求的目標的新系統的過程。在整個軟體架構中,系統性作為整體專案的先導及前驅,需要能夠貫穿整個專案時段,本章將通過設計理念、設計方法、設計模型、設計原則四個方面來闡述在系統性方面的思考。
設計理念
設計理念作為整個系統架構的指導方針,是整個系統架構的核心理念及設計哲學。在專網通訊領域中,結合業務需要及軟體工程中的設計方法,整體的設計理念是:
簡約、有效、解構、可控、擴充套件
簡約:以最簡單的方式實現,最大限度的保證當前粒度的複雜度最低。方便開發與驗證,提供簡單的設計模式,有利於系統內的所有人員達成一致,為有效且高效的組織提供可能。
有效:以合適的劃分粒度分拆問題,不進行過度設計,以避免引入不必要的複雜度到系統中;也不進行過少設計,避免冗餘。在精益中提升軟體質量,以最高價效比的方式解決問題,避免任何形式的冗雜。
解構:以明晰的邊界確定粒度與粒度之間的權責,本顆粒度下內部共融;本顆粒度外,需要暴露的對外共享,不需要不暴露的隔離封閉。
可控:以可靠的觀測方法輸入,以同一結果輸出,可觀測;問題出現,定位清晰,可追尋;臨時更改,及時應變,可容錯。
擴充套件:提供漸進的解決方案,提供完整生態,相容幷包,根據需求定製,可擴充套件、可插拔。
設計方法
設計方法作為一組按照架構領域的開發順序而排列的一套方法理論,是對複雜業務需求的梳理後做的全面方法總結。在前端開發過程中,結合對應常見不同的架構分類,對不同層次各個子集做對應的方法論總結。
業務架構
業務架構定義了符合業務產出的對應的能力或者功能矩陣,明確業務流程。對應於前端工程而言,則是要落地到業務時序、角色分配、許可權認證等。
資料架構
資料架構描述了組織的物理及邏輯資料資產,以及資料資源的結構。在前端工程中,則是對應最初的資料結構的設計,從方法論上可以參考不同的資料集合進行資料庫模式的設計與接入。
應用架構
應用架構提供了一個藍圖,涉及各個應用程式部署,它們之間的相互作用,以及它們的聯絡,該組織的核心業務流程等。對於前端領域而言,則是對於不同應用之間的聚合統一以及隔離呈現,包括但不限於跨端呈現以及上下游邏輯串聯。
技術架構
技術架構描述了需要支援的業務,資料和應用服務部署的邏輯軟體和硬體的能力;這包括IT基礎設施、中介軟體、網路等。對於前端而言,則是包含各種框架體系以及對應的生態延展,篩選更加符合業務的場景落地技術方案。
設計模型
軟體設計採用不同的視角來設計抽象軟體的系統,對需求進行分析而產生概念模型。常見的設計模型包含:物件導向模型(OOP)、面向領域模型(DDD)、六邊形模型(Hexagonal Architecture)、洋蔥模型(Onion Architecture)等。軟體設計最重要的過程就是抽象,對業務及領域進行建模,通過抽象化的手段將共性及元資訊抽離,通過不同的組合模式構建屬於自己業務及系統的模型。抽離設計模型是一個高度凝練和萃取的過程,需要考慮多方因素。抽象設計模型既要做頂層設計,又要做底層設計,視野要從上而下,拆解要從下而上。
設計原則
軟體設計過程中要符合軟體開發的特徵,通常來說需要符合以下幾大原則:
單一職責原則
單一職責原則是指每一個顆粒度都只專注於一件事情,從而可以降低單顆粒度的複雜度,簡化邏輯,職責簡單,提高可讀性及系統可維護性。在修改及變化過程中,可以減低對其他顆粒度的功能影響。
開放封閉原則
開放封閉原則是指面向擴充套件開放,面向修改關閉,這意味著在需求變化時,對程式碼變化所做的修改應該以擴充套件為主,而不是修改之前的程式碼,這就要求在設計顆粒度過程中保留擴充套件項,以應對變化。軟體需求總是變化的,因而在不對原有系統做修改的情況下,可以基於不同的設計模型構建不同的系統擴充套件。
里氏替換原則
里氏替換原則是指具象粒度可以替換抽象粒度,也就是抽象粒度的元資訊是完全抽離的具象內容,其也是開閉原則的重要驗證方式之一,滿足里氏替換原則表明其開閉性是可以保證的,在不同的設計模型中,可以運用不同的方法來實現抽象粒度與具象粒度之間的連結關係。
介面隔離原則
介面隔離原則是指顆粒度對外應該提供儘可能詳細的介面,而不是提供巨集觀的介面,對外暴露的行為應該越少越具體也好,這樣才能保證外部對內部的影響及侵害做到最小,儘量細化介面。通過分散定義多個介面,可以預防外來變更的擴散,提高系統的靈活性和可維護性,在隔離與外界的界限過程中,也能做到邊界的明晰與確立。
依賴倒置原則
依賴倒置原則是指實現應該儘量依賴抽象,不依賴具體實現。具體依賴抽象,上層依賴下層,可以減少顆粒度之間的耦合性,提高系統的穩定性,減少並行開發引發的風險,提高程式碼的可讀性和可維護性
迪米特原則
迪米特原則又叫最少知識原則,一個軟體架構實體應當儘可能少的與其他實體發生相互作用。顆粒度與顆粒度之間的關係越密切,耦合度也就越來越大,只有儘量降低顆粒度與顆粒度之間的耦合才符合軟體設計的模式。一個顆粒度對另一個顆粒度中引用或者使用越少越好,這樣可以避免發生變化時,相互之間產生關聯反應,如果必須進行相關的關聯操作,可以通過第三者進行相互的聯絡,後續變化只需對第三者進行相關的操作即可,方便維護。
組合/聚合複用原則
組合/聚合複用原則是指應儘可能多的進行復用,而不是複製,通過單一職責的顆粒度構建,在其他業務中可以儘可能多的複用相關的顆粒度組合,從而在發生變化時,只需要在內部修改對應的顆粒度內容,對外做到介面隔離而不影響外界的使用。
結構性
軟體系統作為一個有機的整體,其內部是由若干個不同的部分構成的,結構性則主要是從軟體組織結構的角度來衡量,它包含或關聯了一些不同層次的資訊。從最早的單體架構,到面向服務的SOA架構,再到後來的微服務架構,不同的軟體架構演變,都體現了結構性的重要性。對於前端工程而言,常見的分層設計是軟體系統結構化的一種有效實現方式,本章將從閘道器層、應用層、基礎層三個劃分層次來闡述專網專案中的架構設計的結構性特徵。
閘道器層
在傳統軟體開發過程中,不同的業務型別所對外界暴露的方法不盡相同。在網路通訊中,我們常常使用閘道器來作為內網與外網的通訊傳輸連線。在軟體開發過程中,我們也可以借鑑這樣的思路來對我們的軟體系統做對應的設計和處理。
對於專網領域的前端而言,對於各種應用的收斂和聚集就成為一個對外暴露的重要層級。閘道器層的出現,打破了框架及業務棧的束縛:對內部應用,可以提供服務序號產生器制用於各種應用的聚集和收集;對外部使用者,可以提供統一的服務地址,從而隔離開使用者與內部應用變化帶來的割裂感。
應用層
應用層作為各種業務的不同呈現形態,是真實落地到各種業務形態的子形態。對外部而言。各個應用之間的關聯及處理可以通過閘道器層做對應的服務分發和拉起;對內部而言,則可以選擇對應的框架形態來更好的處理所需要的業務,從而實現了高內聚、低耦合的軟體系統關聯與隔離。
對專網業務形態而言,需要提供專業的業務處理服務,也即通用化的中臺產品服務;同時也需要提供對應的視覺化產品服務,更好的展現業務資料資訊,從而將CT側的業務內容進行IT化的展現。應用層可以基於不同的業務需求,擴充套件不同的形態,跨端、互動等新的業務形態也可以外掛化的形式注入,從而對擴充套件開放,共建生態圈。
基礎層
基礎層為所有業務提供公共的基礎技術服務,避免單個業務應用各自為戰,形成各自的獨立技術煙囪;同時,也為業務的技術沉澱積累提供面向更多業務形態的技術支援,做到了技術能力的抽象通解。
對於專網業務形態而言,其基礎層主要提供了面向整個產研鏈路的基礎服務支援,方便產品、設計、前端、後端、測試、運維同學的全鏈路通路連線,一站式解決整體的前端上下游溝通屏障,打造高效、簡單的產研一體化解決方案。在產品側,提供了wiki文件化的支援;在設計側,提供了圖床、設計物料、設計元件庫的支撐;在前端側,提供了腳手架、監控等開發模板工具;在後端側,提供了靜態轉發、BFF轉化、介面聯調配置等技術設定;在測試側,提供了通用的測試套件,方便測試用例的設計及驗證;在運維側,提供了高效的CICD流水線處理,提供故事版等功能性處理方案。
健壯性
健壯性是指軟體系統在一定引數的攝動下,維持正常的特性。根據不同的系統級別的要求,通常要求軟體架構系統在設計的過程中考慮不同的健壯性要求。本章將通過高可用、高效能、高安全、高擴充套件來闡述系統的健壯性。
高可用
高可用主要目的是為了保障業務的連續性,即在使用者眼裡,業務永遠是正常對外提供服務的。要保證架構的高可用,就要保證架構中的所有顆粒度及其對外暴露的服務都能儘可能做到高可用。對於前端而言,通常需要在服務拉起的過程中保證高可用,那麼可以採用冗餘及自動故障轉移等方法來處理。
對於專網業務而言,在基礎層提供了雲化相關的基礎操作,利用雲化的一些高可用多副本做到服務可達,同時在運維釋出過程中基於不同的業務需求做到釋出的策略分化,從而更好的為業務及使用者資料收集等產品需求做到技術理論支撐,閉環整個鏈路。
高效能
高效能是指對於資源的最高利用,可以最大限度的發揮軟硬體的優勢。要保證架構的高效能,通常需要在不同業務形態中利用不同的效能瓶頸做對應的優化與改造。對於前端而言,由於更加貼近使用者側,其通常高效能包含網路、渲染、使用者體驗等幾個方面。
在專網業務中,由於網路層的特殊傳輸特點,其對於網路的優化通常都是基於雲原生相關的網路側優化,而對於渲染側的壓力,則可以基於不同的業務形態選擇諸如客戶端渲染(CSR)、服務端渲染(SSR)、原生渲染(NSR)、邊緣渲染(ESR)等不同的渲染模式或者混合渲染模式。
高安全
高安全是指對於系統的攻擊保證有效的防護及對於潛在危險的及時清除。要保證架構的高安全,除了要應對常見的攻擊手段之外,還需要對系統本身做到監控可控。對於前端而言,由於面向使用者更近,對於使用者的操作最可能攻擊到本身系統的安全,因而做好諸如XSS、CSRF等前端安全防護是十分重要的,同時也要對風險做到評估和監控。
在專網業務中,在基礎層對於不同應用層的應用做到了前端的監控,對於效能、錯誤等做到資料的收集與處理,對於金鑰及密碼的設定做到高階別防護,網路通訊採用加密傳輸等手段防護,同時對於中間訪問做到不同層級的攔截和鑑權驗證。
高擴充套件
高擴充套件是指在不改變系統整體核心架構下,為了支援不斷增長的需求而保證系統的快速響應。要保證架構的高擴充套件,通常需要對核心形態做到充分考量,明確可更改及不可更改的邊界。對於前端而言,通常需要考慮不同的產品需求變化對可抽離的部分儘可能抽離,對於不同的程式設計正規化,採用符合業務方法的程式設計方案,比如:在使用物件導向程式設計過程中,儘可能使用設計模式等來處理業務需求和正確編碼等。
對於專網業務而言,高擴充套件通過使用前端閘道器的服務發現及序號產生器制來拉起對應的微應用,做到前端的微服務化,對於單個應用中可以再進一步拆分,可以使用諸如類單頁形式、類iframe形式、類web元件形式、類容器化形式等的微前端方案來處理,從而實現整體的高擴充套件和相容處理。
總結
相較於後端發展的歷程,前端的發展過程則經歷了以下幾個時代變化:在上古時代,瀏覽器誕生,伴隨著第一點瀏覽器大戰,前端注重在靜態頁面的搭建;到了石器時代,ajax技術的出現,前端工作涉及到了一部分的資料互動工作,同時也進行著第二代瀏覽器大戰;而在農業時代,面對不同瀏覽器所提供的的各自api的相容性需求,前端第一次出現了基於庫的開發的模式,突現出了一批諸如jQuery、YUI、ExtJS等類庫;緊接著,隨著工業時代的到來,前端也承接了更多的資料互動工作,從之前的服務端渲染頁面,轉換到了瀏覽器客戶端來渲染頁面的時代,也在這個時代出現了前端框架的理念;到了更近一些的資訊時代,隨著不同終端的出現,前端出現了各種跨端體驗一致性的需求,從而帶來了不同渲染模式的方案;在當前的雲邊端時代,目前基於不同的業務形態和業務方向,前端呈現出更加多樣化和複雜化的形態,藉助其他軟體領域的發展,前端形態更加多元和泛化。
對於層出不窮的業務形態與需求,前端從單純的頁面切圖也漸漸演變到了整體軟體架構的治理。在軟體工程領域,所有的業務形態都可以通過不同的抽象組合架構拼接完成,但合理優雅的架構方式不僅要考慮全域性的排程與共生,也需要兼顧區域性的優化與權衡。道以明向,法以立本,術以立策,勢以立人,器以成事。