物聯網連線服務的模組化思路
在許多具有複雜系統的領域中,模組化都被證明是一個有用的概念,這樣一種在傳統設計基礎上發展起來的一種新的思想,現在已經成為一種新技術被廣泛的應用。在物聯網領域中,當現在有的程式碼結構使你無法很方便地新增新特性之時,如何通過優化程式碼,專案結構,做到專案的高可用,可維護性強,程式碼的高內聚、低耦合的產品需求效益?本文著力在程式碼重構的方向上,通過模組化的思路設計來講解如何重構一個低內聚、高耦合的專案,使其達到高度優化,完善設計,使專案架構更完善可用的目的。
什麼是模組化設計原則?
我們都知道Java面向物件最核心的就是封裝、繼承、多型,其中封裝就是模組化設計的基礎,通過對通用方法,特性的封裝,形成了一個個方法和類檔案,那麼通過對一些相同作用亦或者相互起作用來實現某一個作用的類和方法進行整理歸併到單獨的專案中,就形成了不同的模組,這也是程式碼設計的初衷體現:“Don’t repeat yourself”,通過封裝抽象程式碼共性,進行單一設計來達到模組化設計的原則,從而實現服務層面的複用,這裡我簡單總結一下模組化設計原則需要做到的幾點內容:
1、模組必須體現單一原則,做好單一的事情而不是做更多事情;
2、合理拆分,越核心、越底層的模組要追求穩定,更少的更改;
3、模組之間不要有太多依賴,特別要避免出現相互依賴;
4、提升每一個模組的完備性,減少模組缺陷;
為什麼要進行模組化設計?
模組化的程式碼設計最簡單的是可以實現按需載入,進而保證了我們不會把寶貴的頁面載入時間浪費在下載和解釋多餘的程式碼上,從而更高效地完成任務。我們來簡單的列舉一個例子,從團隊協調合作來講述模組化設計的重要性。
比如現在有一個電商專案,由三個團隊來進行開發,其中A團隊主要負責前端和UI設計。B團隊主要負責商品資料展示和下單服務,C團隊主要負責支付和物流服務,當然實際得到電商專案不能只是簡簡單單的這麼一點內容,這裡只是大概舉個例子,但是從上面我們已經可以看出,如果我們的電商專案不進行模組化設計的話,三個團隊之間的工作展開是會存在重疊關係的,其中BC團隊資料的互動呈現需要依賴A團隊的作業互動,而A團隊也需要BC團隊在資料上提供支撐,B團隊在商品下單進行支付和支付完後查詢物流進度等又需要依賴C團隊的支付功能,C團隊的物流展現也需要B團隊提供訂單資料,那麼在專案未進行模組化開發之前三個團隊勢必要花費大量時間在一些提前約定事件,比如說資料格式內容,介面簽名和響應等問題上消耗大量時間成本,在專案開發過程中,溝通成本太高往往是導致專案開發進度延期的主要問題之一,所以如果該電商專案進行模組化設計,前後端進行分離開發,A團隊先完成頁面設計和提供介面文件,BC團隊講後臺服務模組化,拆分為支付模組,物流模組,商品模組等,講耦合的工作進行單一化拆分,這樣彼此的工作就能並行的展開,各自維護起各自的模組也會更加高效、便捷。
簡單來說——模組化,將功能分解,降低之間的耦合性。 從而,為了替換某個模組達到質量或效率的提升,就不會改變整個結構,只需要改相應的模組,工作量就會明顯減少,所以模組化的應用,是每個行業的終極設計。
模組化的優缺點
在平時的工作任務中,歸納起來,模組化設計幾個功能:
一、達到業務功能隔離,實現專案的版本控制和跨團隊並行開發的可能;
二、實現了程式碼的高可用和可複用,減少冗餘程式碼,增強了可維護性;
三、分模組化可以實現分散式部署,減少專案癱瘓風險,提升了專案效能;
四、專案層次清晰明瞭,模組化設計也為微服務實現提供了可能。
任何事情都有其兩面性,當然模組化設計也不是萬能的,由於前期模組化設計需要花費時間,不同模組之間銜接存在風險,同樣也增加了專案開發的難度,前期無法做到快速開發;另外模組間通訊,模組間傳送訊息也會很耗效能。
模組化思路分解
以我們的“鎏雲·CMP”一個物聯網連線管理平臺為例,通過該平臺我們為物聯網絡卡及裝置提供了通訊管理元件、裝置管理元件、eSIM元件、資料服務元件於一體的服務,下面我將為大家講解如何對這樣一個平臺進行模組化拆分。
首先,解決前後端分離問題;將前端當成一個模組,後端也整體當成一個模組來進行開發。在實現前後端分離上這裡提供一個參考給大家,與其使用AngularJs來做前端路由控制不如使用Vue.js來實現,vue.js有更友好的中文文件支援,更輕便小巧易上手的特性,而且也是spa(single page web application)單頁web頁面開發的體現者,在使用vue.js分離前端之後,只需要使用nginx代理靜態頁面,就能實現頁面的部署,後端只需要提供跟前端人員約定好得到rest介面即可。
第二,後端的模組化上;模組化設計原則中提到過抽象模組儘量抽象更底層、更核心的業務,因為只有底層核心的業務才是驅動整個專案的關鍵,相對比而言,一些簡單的功能,例如登入,在長期來看程式碼不存在變動,不涉及第三方授權登入,需要做Oauth2認證的情況下,如果只是通過簡單的攔截器和區區百餘行程式碼就能解決的事情,去抽取出一個登入模組實屬沒必要。在物聯網連線管理服務中,圍繞著卡和裝置為核心的業務展開,通過分析業務功能我們可以發現,無論是卡還是裝置都需要進行流量充值和第三方介面呼叫這兩塊核心,那麼完全可以將拆分一個充值模組和內部API模組(這裡區別於對外提供的API,僅供專案模組之間呼叫),對外我們還可以提供一個API模組,以便第三方通過API能夠接入我方平臺,使用我方平臺提供的服務。
在核心業務模組之外,我們還需要做資料的快取,統計,更新等操作,並且該操作將會是頻繁而且費時的,為了保證資料載入的實時性,就必須摒棄懶載入的方式,通過某種任務排程的方式去非同步更新和快取資料,這就需要拆分專案的任務排程模組,在我看來這也是每一個專案所必須的一個模組。
通過前面簡單的舉例和講解,可以看出在進行模組化分解時並不是一時興起就進行拆分,而是在對功能點適用範圍,變更頻率,是否核心等多方面分析之後才能得出是否需要進行模組化拆分這麼一個結論的,只有合理的模組化設計才能真正的體現這樣去做所帶來的好處。
深圳鎏信科技有限公司是國內領先的物聯網智慧連線技術服務商,專注於通訊、網路、安全技術的研發與PaaS服務的提供,憑藉著裝置實時互聯、智慧化管理、預測性運維和安全態勢智慧感知的技術引領國內IoT雲生態,實現了海量裝置在不同應用場景的業務需求,有效地降低了客戶連線成本,提升了服務連線效率,使物聯網終端連線更容易、業務更智慧、體驗更流暢、資料更安全