微服务业务体系内对复用的深度探讨
本文主要在微服務體系下重新探討復用,側重于討論不同層級的復用條件和要求,以及落地節奏。
復用是一種計算機軟件工程方法和理論。從表現上看,復用指對曾經編寫過的代碼加以利用,從而支撐新的功能或業務。提高復用度,不僅可以極大的節省研發資源,而且也能為系統帶來更好的穩定性和可維護性。更重要的是,它能提升項目質量,帶來技術進步,是驅動技術團隊實現技術和效能良性循環的極佳途徑。
根據維基百科,軟件復用的主要思想是,將軟件看成是由不同功能部分的組件所組成的有機體,每一個組件在設計編寫時可以被設計成完成同類工作的通用工具。這樣,如果完成各種工作的組件被創建起來后,編寫一特定軟件的工作就變成了將各種不同組件組織連接起來的簡單問題,這對軟件產品的最終質量和維護工作都有了本質性的改變。
從實踐上看,復用不僅是指通過拷貝或引用原有代碼來復用,而且更廣泛的是,通過復用原有設計、邏輯、框架、服務等,讓原有代碼的能力可以有效被擴展,從而支持新功能或新業務,這一擴展也包含在微服務的體系下,某一服務支持更廣泛的業務范疇。軟件設計的經驗、面向對象的原則,都可以作為方法論來指導復用的實踐。
依據復用的定義,復用的程度可以從使用方的的角度被度量。此處,我們定義為復用結構體在業務體系內對各種場景、功能或業務范疇的支持次數。復用度提高意味著效能的提高,也意味著被復用結構體的影響范圍擴大,對其代碼質量要求也會提升。
1復用的層次
復用有不同層次。我們依據可復用結構體的復雜性,從低到高依次劃分為:代碼復用、模塊復用、服務復用、產品復用。可復用結構體的復雜性是指內部組織數量、層級、關聯程度等特性。這一層次劃分可以類比蛋白質、細胞、器官、動物,其內部封裝的功能和復雜性隨層次升級而提高。不過,每一層級的界限并非十分清晰,可以相互跨越。
?代碼復用
代碼復用在此處窄化為函數、方法、或類的復用,代碼是復用的最低層次,也是服務質量的基石。復用的代碼通常無法脫離自身服務提供獨立完整的功能,不具有模塊的規模。
代碼復用有很多成熟的經驗和方法,如依賴設計原則、設計模式、分層等架構思想。比如實踐開閉原則指導我們應當在不修改原有代碼的前提下給程序擴展功能,原有的代碼都屬于被復用代碼的范疇;依賴倒置原則可以有效指導我們復用頂層設計及邏輯;設計模式更是提供了一整套可操作的方法和套路,讓我們更加方便簡單地復用成功的設計模式和結構。分層架構思想也指導我們,在服務開發內部,通過對業務的分層與模塊的正交分解后,底層的代碼應當具有一定的可復用性。例如,阿里的編碼規范里明確分層:Service 層,復用性較低,業務編排邏輯都得放進 service 中去做;Manager 層為通用業務處理層,是對 Service 層通用能力的下沉,如緩存方案、中間件通用處理,盡可能多的可復用業務邏輯層。
在微服務體系內,代碼層次的復用往往可以被限制在單一服務內,所以其對代碼質量的要求可以跟隨團隊的統一要求。但其對設計思想、設計能力的要求較高,應當成為團隊內部高級研發的基本功,而對于低階研發,這部分能力往往缺失,可以通過設計評審等方式來避免走偏。
?模塊復用
模塊復用,也叫組件復用,模塊是基于功能劃分的單位。模塊復用比代碼復用高一層級,這是因為它通常可以提供較為獨立的功能,模塊由代碼組成且由上層代碼關聯。
在系統開發中,把系統的各個功能模塊正交分解后,底層模塊在系統內被各種場景所使用,屬于復用的范疇。同一公司或團隊的業務體系內,業務相關性往往較大,業務相關的功能模塊,其復用范圍有一定概率突破本服務內,提供給其他服務使用,進一步提高其復用度。
業務無關的模塊復用,通常可以為各個微服務統一提供 SDK,如分布式事務框架、一系列的依賴注入框架,它并不能形成獨立的系統。這類復用的標志之一為較小規模的代碼,可以直接放到 Github 開源,供其他公司或者業務場景使用。
優質的可復用模塊,可以對單一微服務內部提供復用,來支持服務的各種擴展功能。也有可能脫離單一的微服務,在其他微服務間提供支持,模塊一旦開發完畢,其他使用者就可以花費很少的精力就能在自身服務中集成該模塊功能。脫離單一服務的可復用模塊,由于影響范圍的擴大,團隊對其對代碼和文檔的質量要求較高,模塊復用,應當成為團隊有計劃去追求的產物。
?服務復用
微服務體系運維體系的強大便利為模塊復用創造了一種變體,即服務復用。在微服務體系架構中,服務復用可以分為兩種:
-
一種是指將底層的功能模塊,直接抽離成微服務,單獨提供功能,如計數服務、音頻資源服務(包含加密等)、圖片服務(包含鑒黃等)。
-
另一種是被多種場景用到的業務能力,抽離為微服務支付、訂單、會員、進度、留言、優惠券等這類服務的復用,此類業務能力通常也屬于底層業務能力。
在公司業務體系中,服務的復用可以非常方便的擴展支持業務邊界,這是由于服務復用封裝度較好,通過接口與其他業務進行交互,對接操作往往簡單方便服務復用。還有一個現象是,如果業務場景在不同的公司也較為廣泛存在,往往會伴隨有公司以其為主營業務生存,有專業的團隊專注做此類產品,如直播消息服務,有融云等公司,日志統計服務,有友盟等公司。
服務復用和模塊復用有一定可轉換性,在對存儲瓶頸充分預估前提下,我們傾向于優先考慮微服務,理由如下:
-
微服務功能獨立,數據存儲通常獨立部署,封裝更為徹底;
-
服務復用直接依賴 HTTP 等協議進行通信,使用方完全依賴接口對接。微服務內部可以動態的進行演化升級,根據此優勢,我們也可以將傳統的經常容易變動的 SDK 改造為微服務形式;
-
微服務可以直接對客戶端或用戶提供服務,減少后端服務之間的相互對接過程,降低溝通成本及出錯成本;
-
根據康威定律,微服務的歸屬劃分往往會更為清晰,專人負責,有利于在長期的演化中團隊對邊界的把控,避免混淆進各種影響復用代碼。
但同時也需要注意,微服務數據存儲獨立,意味著存儲容量及性能可能成為整個系統的瓶頸,這需要充分預估;微服務封裝徹底,對外使用 HTTP 交互,意味著功能在業務體系內為單點,其發生故障后,整個系統可能癱瘓,要做好降級故障預案,避免成為服務體系的瓶頸。
服務復用的復用度,也容易辨識,如進度服務,支撐多少個業務功能,就可以認為其復用度為多少。一個服務承擔的職責越多,它被復用的可能性就越小服務復用應當恪守單一職責原則,服務復用和模塊復用類似,對團隊架構師及技術負責人要求較高,特別是要求架構師對和服務邊界劃分的能力較好,應當成為優秀團隊及優秀架構師追求的目標。
?產品復用
產品是對外交付的最終成果,研發為產品服務,產品復用是項目體系內,最大程度的復用,它需要來自產品團隊或管理團隊層面的支持。
-
低層次產品復用,需要產品團隊從不同的產品形態中尋找可統一產品模塊,如 U 模塊的統一。
-
中等層次的產品復用,可以直接設計出可組裝的產品模塊,來對模塊進行組裝成為不同形態的產品。
-
高層產品復用是從產品層面在業務體系內,對當前或未來內的業務功能進行統一,如廣告營銷平臺、SaaS、PaaS 平臺的復用等都屬于成熟的產品復用的范疇。高層次產品復用成功,也有可能催生相應領域里對應的技術服務公司。
產品復用對產品的多樣性會有一定的限制,中低層次產品復用對產品形態要求較高。高層次產品復用,往往需要對需求的根源進行分析,得出一整套有創造性的解決方案,它也更有可能創造性的從根源解決需求問題,如推動廣告營銷平臺,可以有效避免在產品各處侵入開發營銷邏輯。產品復用往往需要產品團隊的主導或介入,對技術團隊而言,需要有較好的產品意識和創新意識,并具備和產品團隊溝通并達成一致的領導力。
2收益
復用帶來的直接收益是溝通成本和研發成本的降低。可復用結構節約的資源量,大致等同于可復用結構的復用度,乘以原始設計、開發、測試人力的消耗。
更重要的是,由于復用帶來的集中維護也會大大降低維護成本,缺乏復用,會導致同樣的邏輯,實現各異,散落在業務體系隨著迭代不斷腐朽,將會對整個系統帶來無法維護的噩夢。
復用帶來的另一收益是穩定。部分服務實現復用后,已經基本上被歸檔,如音頻服務的復用、計數服務的復用等,都已經展現出了極強的穩定性。業務的多變性是永恒不變的話題,與業務變化無關的穩定性使得團隊可以集中力量應對變化需求。
復用是一個好的修行場所,它會帶來團隊、設計和認知能力的提升。每個復用組件的實現,需要其代碼可靠,更容易被他人理解,強迫團隊對好代碼的認知提升。可復用的結構,對測試覆蓋的要求、說明文檔的要求,都和日常代碼要求不一樣,可以有效鍛煉團隊的每一個參與者。每個層次的復用,都有對不同能力的修煉,如代碼的復用將提升對分層設計的能力提升,服務的復用直接單一職責認知的提升及封裝變化的認知提升。
無論何種程度的復用,都會提高整個團隊對軟件設計原則和高質量代碼的認知,這將使得團隊走上良性循環。
3落地節奏
復用的落地節奏中,有機會性的代碼復用和有計劃的代碼復用兩種,兩者都不可偏廢。
機會性的代碼復用是指,開發團隊在做需求或項目的過程中,通過自己的專業能力來判斷其要開發代碼或組件在其他業務需求中被復用的可能性,從而選擇是否進行代碼復用方式的開發,或者抽離為獨立模塊或服務。
有計劃的代碼復用,是指定期梳理業務開發團隊從戰略角度為了日后的開發能夠復用代碼而進行設計開發。這也包括對過往的存量代碼進行盤點,主動進行推動重構開發,在重構的過程中,對已經明顯表現出可復用的結構組織進行復用迭代。
開發團隊業務需求繁重,團隊進行復用度建設的初期,可以著力采用機會性的代碼復用,以更好的貼合業務實際需要。有計劃的代碼復用有利于降低團隊的負債和提高迅速應對變化的能力,需要團隊管理者定期盤點,避免負債拖慢效率。當然復用也伴隨有一定的代價,在業務快速迭代的過程中,如果處處著眼于未來開發,也將不可避免的增加當下成本,對其平衡的把控,是團隊領導和架構師需要具備的能力。復用的認知、代碼、知識、設計、文檔等,都會形成團隊內部所不可或缺的有形無形資產,有效支撐團隊效能。
?關于作者:
奇正,曾在奧多比 、百度任高級工程師,現任某互聯網公司后端業務線 Leader,先后從事過 C++、Android、Golang 的開發工作。
總結
以上是生活随笔為你收集整理的微服务业务体系内对复用的深度探讨的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试官:kill -9 进程杀不掉,怎么
- 下一篇: 35+的互联网人都哪去了