戲說移動江湖--網路通訊架構
大主線
細說移動開發中網路通訊架構
前言
本文閱讀需要6分鐘。
你可能的收穫:
理解網路層架構和設計的基線和主線
學會網路通訊各方案 各技術的細枝末葉
希望能給讀者開發專案有點啟發和思索
正文
有江湖的地方就有愛恨情仇,有程式碼的地方就有風花雪月
我們一般談網路層,也就是說的業務資料通訊層,其主要連結客戶端和服務端業務間的資料互動,因此其一般處於專案的核心地位,在架構層面來說雖然是處於底層架構那塊,但其在專案開始階段就深冰般存在,雖為上層提供服務看其像一個簡簡單單的介面方法,但是其地位還是起到承上啟下的功效,從而保證各業務資料的安全和穩定。

分割線
雖說專案開始階段網路層就存在,但是一般公司初期在人員不足和業務快速迭代情況基本都是簡單引入第三方的網路庫作為網路層快速提供服務,例如市面上的httpURLconnection,httpclient,okhttp,volley等第三方網路庫簡單提供一層薄薄的封裝,完美支援當前業務和需求,皆大歡喜。隨著業務量的爆發和,stop,停,請先講講市面上各個網路庫的對比以及你的評價?說真的去google檢索出一大堆,但從我的角度來對比評價看,可簡單從三個維度來說:
第一個維度從基本效能和穩定這塊來看市面上第三方庫都處於同一個水平點;
第二個維度從好不好使的話,簡單封裝後都好使,所以這塊也沒有很大的高低之區分;
第三個維度若從新特性這塊來看,因業務而異。
所以說專案初期你隨便選個第三方庫加上簡單封裝提供網路服務都是滿足公司現狀的。

分割線
但是隨著公司業務的上升和市場快速推進,業務量的爆發和使用者量的增加,網路層此刻肯定慢慢滿足不了當前業務,例如高效能,高穩定,安全以及滿足個性化需求支援。這個時候就有點吃力不討好的狀態,所以就需要對網路層進行一次架構,從而來滿足高效能穩定以及高擴充套件性看齊。這個時候就需要全員一起梳理各個考慮點和需求點進行一次性架構;此時的網路架構基本能滿足中小企業各個階段的發展需求;(說白點網路層設計架構生命週期就是兩三次大換血,其他時候不可能沒事就去動一動,這是底層庫弄不好都變成aar,修改說不定都需要申請公司許可權了)。
因此大體歸納總結架構設計上至少滿足:
1/提供簡單易用的多執行緒併發訪問(執行緒,佇列等) 2/提供對業務層的訪問程式碼保持不變(否則全組人員乾死你的心都有) 3/提供自定義網路庫或第三方網路庫的切換和更新 4/提供網路層的日誌統計,實現無縫對接服務端的日誌系統 5/支援https以及簽名證明等 6/提供業務層的自定義特色需求 7/提供高效能訪問機制(DNS解析,長短連結以及重傳機制等實現) 8/支援響應資料的快取,根據快取型別實現各種複雜的資料快取 9/支援攔截器和過濾器功能 10/提供擴充套件性對外介面用於滿足後續特殊業務需求

分割線
有人看到這些點外懵圈,怎麼沒看到和http協議本身的功能如實現http1和http2,GZIP以及keepAlive等特性的實現?不好意思,這些都是底層網路服務庫的功能,你只需要通過條件3的方案去替換或者更新這塊的底層http協議庫即可。
回到剛上面歸納出的多個條件上來,其實這些條件都是從大局觀上去思考總結,從業務需求層面上著手以及公司現狀及未來發展上分析得來的。
其實細細分析,網路層如果從產品型別來區分,無外乎兩個大類著手,社交通訊類(IM)和其他類;因為IM類的網路,其業務性質比較特殊,著重在信令認證,超時和重試機制以及資料可靠性安全性等要求極高,其設計架構上和側重點肯定不一樣,這塊可以去看騰訊開源的mars庫;其他大部分公司業務就是網路資料通訊,大體就是滿足各種奇葩業務需求和提供可控的效能和可靠的安全等等,所以對於此類網路因人而異進行設計和架構。中小企業開始改造網路層架構時,首先作為程式設計師通病,先看下是否有現成框架,根據以上條件丟進去google百度後啥都沒有,哈,那肯定搜尋不到,不過等我講完本篇就有現成的庫了哦,如果猴急就直接拉到最後可以看到myhttp的GitHub開源地址(覺得名字俗氣可以評論反饋,不過我是不會修改的,俗才親民,名字俗但是內容不俗即可,雅俗共賞)。

分割線
到了這裡基本準備結尾,接下來就上面幾個條件進行簡單說明,其詳細架構和使用說明請檢視github的readme,作為程式設計師我還是推薦readthe fucking source code。
其一關於多執行緒併發訪問支援,本庫通過自己實現了一套滿足業務線和經驗值爆表的執行緒併發體系框架,經得起現網業務的考驗和ISO標準,^_^。然後在此基礎上自己添加了各種特色執行緒功能以及輔助服務如日誌打樁以及統計等功能。作為一個完備的app,其執行緒池配套設施必須統一管理,所以本框架提供了執行緒池併發統一訪問功能,通過自己實現一套簡化的響應式程式設計方式訪問執行緒,提供多種執行緒排程器如main執行緒排程器,IO執行緒排程器,http執行緒排程器以及立即執行緒排程器和後臺執行緒排程器。基本滿足極大部分使用者;
其二網路庫的切換本庫可以實現無縫對接,不管是自己實現一套(如公司中後期就安全等問題通過c++實現一套網路層訪問)還是市面上第三方網路庫統統滿足,切換起來非常簡單對接也快捷。
其三提供一套極高擴充套件性的DNS解析器配合安卓網路特性,完美實現高效能訪問等功能;可以擴充套件市面上所有的DNS庫,例如騰訊的httpDNS+,阿里的DNS庫等等。
其四關於網路超時重試機制目前只弄了初步的功能,後續根據微信終端跨平臺元件 mars 系列的設計和方案進行編碼和優化;具體可先參考騰訊微信關於這塊的實驗和設計。

分割線
噹噹噹,下班了,若自己需要擴充套件其他功能,請download原始碼後自己改造,其原始碼分層明確易懂,程式碼註釋詳細,程式碼關係層統一。就這個問題不得不鄙視下那些牛逼框架的原始碼,基本不給人看的那種,要看也得去一頭的頭皮屑。hi man,fuck。
myHttp (GitHub地址: https://github.com/wenzhonghu/myhttp ),
pls star it
有問題或者建議郵,[email protected]