? ? ? 架構(gòu)沒有絕對的最好,設(shè)計過度或者沒有設(shè)計都不是我們想要的。恰到好處,同時又能與時俱進是我們所追求的好架構(gòu)。pon終端產(chǎn)品從誕生到現(xiàn)在,已近十年,年發(fā)貨量千萬以上,期間經(jīng)歷過幾次代碼調(diào)整,不過總體架構(gòu)并未有大變化。在這里必須向我們的架構(gòu)師,開發(fā)和強大的測試團隊致敬,增加和修改了成百上千條需求,版本依然如此穩(wěn)定。
? ? pon終端是連接互聯(lián)網(wǎng)的光終端二三層交換小盒子,是萬物互聯(lián)的基礎(chǔ)設(shè)備之一。終端業(yè)務(wù)種類豐富,包括上網(wǎng)、電視、語音,無線,有線等。業(yè)務(wù)場景復雜,功能代碼更復雜。比如交換芯片的驅(qū)動程序,linux內(nèi)核橋路由轉(zhuǎn)發(fā)邏輯,地址控制協(xié)議,組播控制協(xié)議,防火墻,QoS,各種上層應(yīng)用。? (備注:此處應(yīng)有一個軟件架構(gòu)圖)。模塊之間關(guān)系復雜,只有經(jīng)驗豐富的研發(fā)人員才清楚一個業(yè)務(wù)開通時內(nèi)部究竟發(fā)生了什么。為了提高研發(fā)效率,梳理和優(yōu)化軟件結(jié)構(gòu)就很必要了。
? ? 這里想分享的是我們這一年對核心模塊做的梳理和優(yōu)化,主要是版本合一、配置與版本分離、平臺化,以及對抽象的思考。
1.版本合一
? ? 光終端細分為多種上行制式,gpon,epon,10g epon等。北向接口的控制協(xié)議不同,硬件實現(xiàn)上攜帶不同種類光模塊。之前從展現(xiàn)層到業(yè)務(wù)層,再到底層驅(qū)動層的代碼,多少都會涉及到上行方式,這樣帶來幾個問題,一是業(yè)務(wù)層或展現(xiàn)層代碼重復代碼很多,Gpon上行寫了一套,Epon上行又寫了相似的一套,重復代碼是萬惡之首,我們工程里的重復代碼確實帶來的不少的維護工作量。二是版本數(shù)量多,Gpon和Epon上行產(chǎn)品大概有90%是相同功能,之前我們的做法是共用一個主干基線,用宏控制分別做出Gpon的和Epon的版本,測試階段對2個版本分別做系統(tǒng)通用集測試,入網(wǎng)測試也是一樣。
? ? 如果做到1.對上層應(yīng)用隱藏住上行方式的差異,2.版本自適應(yīng)上行方法。那么一來減少部分重復代碼重,二來版本數(shù)減半。
? ? 我們的做法是增加一層上行方式適配層,將不同上行方式的接口統(tǒng)一,對上層業(yè)務(wù)隱藏上行方式的差異。這一層的主要函數(shù)包括(待補充函數(shù)列表,以及增加這一層之后的軟件架構(gòu)圖)。
? ? 這樣優(yōu)化之后的效果,一是網(wǎng)管控制協(xié)議模塊的參數(shù)節(jié)點樹展示層的代碼量減半,二是生成的版本數(shù)量減半。減少了開發(fā)人員維護工作,也減少測試工作。
2.配置和版本分離
? ? 我們發(fā)貨的版本一般由兩部分組成,一部分是預配置數(shù)據(jù),一部分是可執(zhí)行程序。不同省份的定制版本的差異主要由預配置數(shù)據(jù)控制。修改某個配置數(shù)據(jù),需要升級完整版本,這就意味著又要經(jīng)過一輪機關(guān)重重的現(xiàn)場入網(wǎng)測試。
? ? 針對于此,我們做了配置與版本可分別單獨升級的設(shè)計,調(diào)整了內(nèi)存數(shù)據(jù)庫的代碼結(jié)構(gòu),一是修改了數(shù)據(jù)配置文件的結(jié)構(gòu),增加配置文件的版本信息,二是增加一個配置文件升級管理模塊,負責加載配置的升級文件。(待補充:實現(xiàn)這個功能后內(nèi)存數(shù)據(jù)庫模塊的結(jié)構(gòu)圖、預配置文件設(shè)計圖)。
? ? 這樣優(yōu)化的效果是:當某些需求可以通過配置數(shù)據(jù)控制時,我們將只升級配置文件,版本不動,這樣就節(jié)省了原本耗費人力的新版本入網(wǎng)測試環(huán)節(jié)。
3.平臺化
? ? 國際國內(nèi)pon終端的需求千差萬別,即便是國內(nèi)幾大運營商的需求差異也很大。在交付的壓力下,經(jīng)常會通過拉分支基線來完成,再加上有時未及時回歸主干,久而久之基線就多起來。分久必合,合久必分,分分合合,合合分分,這樣帶來了不小的工作量。
? ? 如果能將基礎(chǔ)代碼平臺化,豐富的功能,良好的擴展性,可以共享的安全合規(guī)自檢等,都將成為快速實現(xiàn)產(chǎn)品的好幫手。
? ? 為了方便產(chǎn)品使用平臺,平臺的軟件目錄結(jié)構(gòu)實現(xiàn)如下 圖所示(待補充:平臺軟件目錄結(jié)構(gòu)圖)。目錄主要分為:1.平臺核心功能;2.組件包;3.產(chǎn)品代碼包。
? ? 平臺在設(shè)計之初曾爭論過平臺究竟是要做成大而全,還是小而靈活。目錄結(jié)構(gòu)究竟要不要區(qū)分產(chǎn)品包、核心包。
? ? 我們目前做法是平臺核心功能做的小而靈活,以dns為例,平臺核心代碼只實現(xiàn)rfc標準流程,在某些點上提供鉤子。而由產(chǎn)品實現(xiàn)定制需求。
? ? 另外,由于還有管理方面的考慮,目錄結(jié)構(gòu)設(shè)計上也會有一些管理的影子。
? ? 這樣做的效果是國內(nèi)多家運營商的pon終端使用用統(tǒng)一平臺,再加上各自的定制代碼,合起來出一個版本。
? ? 為保證質(zhì)量, 平臺團隊交付代碼給產(chǎn)品團隊時,還要給出單元測試代碼。
? 這是我們從去年底就開始的一項任務(wù),對于終端產(chǎn)品來說,理想的平臺究竟是什么樣的,我們還在摸索,也希望能有機會和高手探討這個話題。
4.對于抽象的思考
? ? 為了能讓開發(fā)人員將注意力集中在業(yè)務(wù)本身,而不是陷于某些相關(guān)性不太大的細節(jié)上,比如編程語言的細節(jié)上,我們嘗試抽出領(lǐng)域語言,并且使用DDD方法對各個領(lǐng)域建模。
? ? 比如網(wǎng)絡(luò)連接模塊,提供了如下一些服務(wù): wan連接創(chuàng)建、修改、刪除、查詢。網(wǎng)絡(luò)連接消息訂閱。(備注:提供一下接口列表)。不再向外界暴露地址協(xié)議交互過程等細節(jié)。
? ? 但在這樣做的過程中我們也有疑惑,我們的產(chǎn)品是嵌入式產(chǎn)品,主要編程語言是c語言。而前文也介紹了,終端的業(yè)務(wù)種類很多,如果大范圍推廣領(lǐng)域語言,開發(fā)人員的要求似乎更高了,需要理解領(lǐng)域語言,并且具備較好的業(yè)務(wù)抽象能力。
? ? 5.總結(jié)
? ? 以上是我們pon終端在過去一年對架構(gòu)方面做的優(yōu)化和思考,希望能有所幫助,更希望能和大家交流,相互學習,讓我們的軟件更符合可實現(xiàn),可擴展,可測試等好的架構(gòu)設(shè)計的標準。