大主線
細(xì)說移動開發(fā)中網(wǎng)絡(luò)通信架構(gòu)
前言
本文閱讀需要6分鐘袭灯。
你可能的收獲:
??理解網(wǎng)絡(luò)層架構(gòu)和設(shè)計(jì)的基線和主線
? 學(xué)會網(wǎng)絡(luò)通信各方案各技術(shù)的細(xì)枝末葉
? 希望能給讀者開發(fā)項(xiàng)目有點(diǎn)啟發(fā)和思索
正文
有江湖的地方就有愛恨情仇,有代碼的地方就有風(fēng)花雪月
我們一般談網(wǎng)絡(luò)層杖小,也就是說的業(yè)務(wù)數(shù)據(jù)通信層,其主要鏈接客戶端和服務(wù)端業(yè)務(wù)間的數(shù)據(jù)交互,因此其一般處于項(xiàng)目的核心地位贞盯,在架構(gòu)層面來說雖然是處于底層架構(gòu)那塊,但其在項(xiàng)目開始階段就深冰般存在沪饺,雖為上層提供服務(wù)看其像一個簡簡單單的接口方法躏敢,但是其地位還是起到承上啟下的功效,從而保證各業(yè)務(wù)數(shù)據(jù)的安全和穩(wěn)定整葡。
雖說項(xiàng)目開始階段網(wǎng)絡(luò)層就存在件余,但是一般公司初期在人員不足和業(yè)務(wù)快速迭代情況基本都是簡單引入第三方的網(wǎng)絡(luò)庫作為網(wǎng)絡(luò)層快速提供服務(wù),例如市面上的httpURLconnection,httpclient啼器,okhttp旬渠,volley等第三方網(wǎng)絡(luò)庫簡單提供一層薄薄的封裝,完美支持當(dāng)前業(yè)務(wù)和需求端壳,皆大歡喜告丢。隨著業(yè)務(wù)量的爆發(fā)和,stop,停轻局,請先講講市面上各個網(wǎng)絡(luò)庫的對比以及你的評價(jià)才沧?說真的去google檢索出一大堆,但從我的角度來對比評價(jià)看觅捆,可簡單從三個維度來說:
第一個維度從基本性能和穩(wěn)定這塊來看市面上第三方庫都處于同一個水平點(diǎn);
第二個維度從好不好使的話麻敌,簡單封裝后都好使栅炒,所以這塊也沒有很大的高低之區(qū)分;
第三個維度若從新特性這塊來看术羔,因業(yè)務(wù)而異赢赊。
所以說項(xiàng)目初期你隨便選個第三方庫加上簡單封裝提供網(wǎng)絡(luò)服務(wù)都是滿足公司現(xiàn)狀的。
但是隨著公司業(yè)務(wù)的上升和市場快速推進(jìn)级历,業(yè)務(wù)量的爆發(fā)和用戶量的增加释移,網(wǎng)絡(luò)層此刻肯定慢慢滿足不了當(dāng)前業(yè)務(wù),例如高性能寥殖,高穩(wěn)定玩讳,安全以及滿足個性化需求支持。這個時候就有點(diǎn)吃力不討好的狀態(tài)嚼贡,所以就需要對網(wǎng)絡(luò)層進(jìn)行一次架構(gòu)熏纯,從而來滿足高性能穩(wěn)定以及高擴(kuò)展性看齊。這個時候就需要全員一起梳理各個考慮點(diǎn)和需求點(diǎn)進(jìn)行一次性架構(gòu)粤策;此時的網(wǎng)絡(luò)架構(gòu)基本能滿足中小企業(yè)各個階段的發(fā)展需求樟澜;(說白點(diǎn)網(wǎng)絡(luò)層設(shè)計(jì)架構(gòu)生命周期就是兩三次大換血,其他時候不可能沒事就去動一動叮盘,這是底層庫弄不好都變成aar秩贰,修改說不定都需要申請公司權(quán)限了)。
因此大體歸納總結(jié)架構(gòu)設(shè)計(jì)上至少滿足:
1/提供簡單易用的多線程并發(fā)訪問(線程熊户,隊(duì)列等)
2/提供對業(yè)務(wù)層的訪問代碼保持不變(否則全組人員干死你的心都有)
3/提供自定義網(wǎng)絡(luò)庫或第三方網(wǎng)絡(luò)庫的切換和更新
4/提供網(wǎng)絡(luò)層的日志統(tǒng)計(jì)萍膛,實(shí)現(xiàn)無縫對接服務(wù)端的日志系統(tǒng)
5/支持https以及簽名證明等
6/提供業(yè)務(wù)層的自定義特色需求
7/提供高性能訪問機(jī)制(DNS解析,長短鏈接以及重傳機(jī)制等實(shí)現(xiàn))
8/支持響應(yīng)數(shù)據(jù)的緩存嚷堡,根據(jù)緩存類型實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)緩存
9/支持?jǐn)r截器和過濾器功能
10/提供擴(kuò)展性對外接口用于滿足后續(xù)特殊業(yè)務(wù)需求
有人看到這些點(diǎn)外懵圈蝗罗,怎么沒看到和http協(xié)議本身的功能如實(shí)現(xiàn)http1和http2艇棕,GZIP以及keepAlive等特性的實(shí)現(xiàn)?不好意思串塑,這些都是底層網(wǎng)絡(luò)服務(wù)庫的功能沼琉,你只需要通過條件3的方案去替換或者更新這塊的底層http協(xié)議庫即可。
回到剛上面歸納出的多個條件上來桩匪,其實(shí)這些條件都是從大局觀上去思考總結(jié)打瘪,從業(yè)務(wù)需求層面上著手以及公司現(xiàn)狀及未來發(fā)展上分析得來的。
其實(shí)細(xì)細(xì)分析傻昙,網(wǎng)絡(luò)層如果從產(chǎn)品類型來區(qū)分闺骚,無外乎兩個大類著手,社交通訊類(IM)和其他類妆档;因?yàn)镮M類的網(wǎng)絡(luò)僻爽,其業(yè)務(wù)性質(zhì)比較特殊,著重在信令認(rèn)證贾惦,超時和重試機(jī)制以及數(shù)據(jù)可靠性安全性等要求極高胸梆,其設(shè)計(jì)架構(gòu)上和側(cè)重點(diǎn)肯定不一樣,這塊可以去看騰訊開源的mars庫须板;其他大部分公司業(yè)務(wù)就是網(wǎng)絡(luò)數(shù)據(jù)通信碰镜,大體就是滿足各種奇葩業(yè)務(wù)需求和提供可控的性能和可靠的安全等等,所以對于此類網(wǎng)絡(luò)因人而異進(jìn)行設(shè)計(jì)和架構(gòu)习瑰。中小企業(yè)開始改造網(wǎng)絡(luò)層架構(gòu)時绪颖,首先作為程序員通病,先看下是否有現(xiàn)成框架甜奄,根據(jù)以上條件丟進(jìn)去google百度后啥都沒有菠发,哈,那肯定搜索不到贺嫂,不過等我講完本篇就有現(xiàn)成的庫了哦,如果猴急就直接拉到最后可以看到myhttp的GitHub開源地址(覺得名字俗氣可以評論反饋雁乡,不過我是不會修改的第喳,俗才親民,名字俗但是內(nèi)容不俗即可踱稍,雅俗共賞)曲饱。
到了這里基本準(zhǔn)備結(jié)尾,接下來就上面幾個條件進(jìn)行簡單說明珠月,其詳細(xì)架構(gòu)和使用說明請查看github的readme扩淀,作為程序員我還是推薦readthe fucking source code。
其一關(guān)于多線程并發(fā)訪問支持啤挎,本庫通過自己實(shí)現(xiàn)了一套滿足業(yè)務(wù)線和經(jīng)驗(yàn)值爆表的線程并發(fā)體系框架驻谆,經(jīng)得起現(xiàn)網(wǎng)業(yè)務(wù)的考驗(yàn)和ISO標(biāo)準(zhǔn)卵凑,^_^。然后在此基礎(chǔ)上自己添加了各種特色線程功能以及輔助服務(wù)如日志打樁以及統(tǒng)計(jì)等功能胜臊。作為一個完備的app勺卢,其線程池配套設(shè)施必須統(tǒng)一管理,所以本框架提供了線程池并發(fā)統(tǒng)一訪問功能象对,通過自己實(shí)現(xiàn)一套簡化的響應(yīng)式編程方式訪問線程黑忱,提供多種線程調(diào)度器如main線程調(diào)度器,IO線程調(diào)度器勒魔,http線程調(diào)度器以及立即線程調(diào)度器和后臺線程調(diào)度器甫煞。基本滿足極大部分用戶冠绢;
其二網(wǎng)絡(luò)庫的切換本庫可以實(shí)現(xiàn)無縫對接抚吠,不管是自己實(shí)現(xiàn)一套(如公司中后期就安全等問題通過c++實(shí)現(xiàn)一套網(wǎng)絡(luò)層訪問)還是市面上第三方網(wǎng)絡(luò)庫統(tǒng)統(tǒng)滿足,切換起來非常簡單對接也快捷唐全。
其三提供一套極高擴(kuò)展性的DNS解析器配合安卓網(wǎng)絡(luò)特性埃跷,完美實(shí)現(xiàn)高性能訪問等功能;可以擴(kuò)展市面上所有的DNS庫邮利,例如騰訊的httpDNS+弥雹,阿里的DNS庫等等。
其四關(guān)于網(wǎng)絡(luò)超時重試機(jī)制目前只弄了初步的功能延届,后續(xù)根據(jù)微信終端跨平臺組件 mars 系列的設(shè)計(jì)和方案進(jìn)行編碼和優(yōu)化剪勿;具體可先參考騰訊微信關(guān)于這塊的實(shí)驗(yàn)和設(shè)計(jì)。
當(dāng)當(dāng)當(dāng)方庭,下班了厕吉,若自己需要擴(kuò)展其他功能,請download源碼后自己改造械念,其源碼分層明確易懂头朱,代碼注釋詳細(xì),代碼關(guān)系層統(tǒng)一龄减。就這個問題不得不鄙視下那些牛逼框架的源碼项钮,基本不給人看的那種,要看也得去一頭的頭皮屑希停。hi man烁巫,fuck。
MyHttp(GitHub地址:https://github.com/wenzhonghu/myhttp)宠能,pls star it
有問題或者建議郵亚隙,wenzhonghu@qq.com