1. 微服務(wù)的發(fā)展史

1. 概述

我們需要科學(xué)的學(xué)習(xí)方法个盆,從一個(gè)技術(shù)出現(xiàn)的背景脖岛,解決的問題、優(yōu)勢和局限去思考砾省,從技術(shù)的本質(zhì)來理解鸡岗,才不至于深陷各種眼花繚亂名詞中混槐。

復(fù)雜的應(yīng)用架構(gòu)不是一蹴而就的编兄,是不斷的演化而來的。

在業(yè)務(wù)的發(fā)展初期声登,系統(tǒng)功能相對初級狠鸳,三五個(gè)人,十來?xiàng)l槍悯嗓,基礎(chǔ)設(shè)施薄弱件舵,甚至都不配備專業(yè)的運(yùn)維,追求的是簡單脯厨、高效铅祸,快速迭代和上線。這個(gè)時(shí)候往往采用單體式架構(gòu),一個(gè)war包或者fat jar包含所有功能和代碼(前后端分離是另外一個(gè)故事临梗,不在本文考慮范圍內(nèi))涡扼。

1.1 單體架構(gòu)
image.png

所有代碼都在一個(gè)工程內(nèi),原型驗(yàn)證階段往往采用這種架構(gòu)盟庞,適用前提:

  1. 流量小吃沪,一個(gè)節(jié)點(diǎn)就足夠應(yīng)付
  2. 業(yè)務(wù)邏輯簡單,單個(gè)人能理解全局
  3. 員工數(shù)量少什猖,同時(shí)修改沖突少

原型驗(yàn)證初見成效時(shí)票彪,單個(gè)后端節(jié)點(diǎn)可能不足以支撐用戶快速響應(yīng)的要求,但是有不想花太高的成本不狮,負(fù)載均衡和集群是這個(gè)時(shí)候最自然而然的選擇

1.2 集群和負(fù)載均衡
image.png

所有代碼仍然在一個(gè)工程內(nèi)降铸,不帶來額外的開發(fā)工作,只是引入反向代理做負(fù)載均衡摇零。適用常見原型驗(yàn)證初見成效的時(shí)候垮耳。很多互聯(lián)網(wǎng)公司后臺管理系統(tǒng)可能也會停留在這個(gè)節(jié)點(diǎn),他不會有很大PV遂黍,對QPS和響應(yīng)時(shí)間也沒有多大要求终佛。

引入了負(fù)載均衡后,如果后端是無狀態(tài)的雾家,配合DNS解析和Nginx反向代理铃彰,理論上后端能支撐無限大的流量,支撐能力不足時(shí)只需要簡單的增加Nginx芯咧、Fat-Jar的部署即可牙捉。

現(xiàn)實(shí)世界中,后端幾乎不可能是無狀態(tài)的敬飒。流量增長到一定階段邪铲,系統(tǒng)的瓶頸會變成后端對應(yīng)的狀態(tài)存儲,比如數(shù)據(jù)庫无拗。要想提高數(shù)據(jù)庫的擴(kuò)展能力带到,主流的方法是緩存、讀寫分離英染、垂直拆分揽惹、水平拆分。難度依次遞進(jìn)四康。緩存和讀寫在單體架構(gòu)階段就能引入搪搏,能幫助我們支撐一定的流量。早早晚晚闪金,最終我們會走到數(shù)據(jù)庫的垂直拆分疯溺,并伴隨著部分大表的水平拆分。

1.2 垂直拆分
image.png

數(shù)據(jù)庫垂直拆分后,數(shù)據(jù)庫QPS瓶頸就解決了囱嫩,隨著后端節(jié)點(diǎn)的增加嗅辣,每個(gè)后端節(jié)點(diǎn)都需要和每個(gè)拆分后的數(shù)據(jù)庫建立連接,數(shù)據(jù)庫連接會成為新的瓶頸挠说。

這個(gè)時(shí)候澡谭,業(yè)務(wù)可能已經(jīng)復(fù)雜到一定程度了,開發(fā)團(tuán)隊(duì)規(guī)模開始增長损俭,新員工理解完整的系統(tǒng)層本高昂蛙奖。

為了解決數(shù)據(jù)庫連接瓶頸、降低開發(fā)者對系統(tǒng)的理解層本杆兵,會開始將系統(tǒng)劃分為不同的子系統(tǒng)雁仲,這就是垂直切分。

1.3 SOA

垂直拆分后的系統(tǒng)肯定不是孤立的琐脏,比如訂單服務(wù)攒砖,我可能需要知道用戶的VIP等級,給予不同的優(yōu)惠日裙;同時(shí)產(chǎn)品服務(wù)吹艇,也需要知道用戶的VIP等級展示不同的價(jià)格;等等昂拂。導(dǎo)致的新問題是:

  1. 查詢用戶VIP等級的邏輯散落在各個(gè)子系統(tǒng)中受神,很難保證一致
  2. 各個(gè)子系統(tǒng)需要了解用戶Schema定義,任意升級都需要考慮老代碼兼容格侯,如果不兼容鼻听,需要關(guān)聯(lián)子系統(tǒng)同時(shí)上線。
  3. 各個(gè)子系統(tǒng)在直連用戶數(shù)據(jù)庫联四,用戶數(shù)據(jù)庫連接依然不堪重負(fù)

通過對外提供UserService的jar包依賴能解決上面的問題1撑碴,前提每次發(fā)布jar包后關(guān)聯(lián)子系統(tǒng)都升級上線;部分解決問題2朝墩,他們不要關(guān)心UserService的實(shí)現(xiàn)邏輯醉拓,但是依然要上線。但是無助于解決問題3鱼辙。同時(shí)自身的邏輯變更都依然其他子系統(tǒng)的升級版本和上線耦合太過嚴(yán)重廉嚼。

SOA是為了解決上面的問題誕生的玫镐。接上面的例子來說倒戏,訂單服務(wù)和產(chǎn)品服務(wù)想要獲取用戶VIP等級,并不直接連接用戶數(shù)據(jù)庫恐似,也不引用UserService的jar包杜跷,而是通過RPC請求從UserService的服務(wù)端獲取。

早期的SOA特別簡單,可以退化為只提供RPC服務(wù)葛闷。

image.png

這種方式存在明顯的問題是UserService單點(diǎn)憋槐,在高可用的系統(tǒng)里邊是不可接受的。于是出現(xiàn)了改進(jìn)版:

image.png

通過Nginx轉(zhuǎn)發(fā)一定程度上實(shí)現(xiàn)了高可用淑趾,Nginx基于心跳剔除不可用的后端節(jié)點(diǎn)阳仔。早期并沒有OpenResty的存在,多數(shù)公司也沒有基于Nginx二次開發(fā)的能力扣泊,所以每添加一個(gè)UserService節(jié)點(diǎn)都伴隨著一次手動修改Nginx配置的操作近范,對運(yùn)維造成層本。同時(shí)客戶端請求經(jīng)過一次轉(zhuǎn)發(fā)延蟹,性能略有損耗评矩。

為了解決上面的問題,進(jìn)一步改進(jìn)就是現(xiàn)代的SOA框架了阱飘,1號店的Hedwig斥杜、微博的Motan、阿里的dubbo沥匈,無一例外都屬于這種:

image.png

服務(wù)提供者通過將自己注冊到服務(wù)注冊中心(常見的解決方案是Zookeeper蔗喂、Nacos),客戶端調(diào)用時(shí)高帖,先根據(jù)服務(wù)名稱(可能還有機(jī)房弱恒、分組、版本號等)信息棋恼,找到服務(wù)調(diào)用地址(服務(wù)提供者注冊是提供)返弹,再根據(jù)服務(wù)調(diào)用地址調(diào)用。

服務(wù)提供者將自己注冊為Zookeeper的臨時(shí)節(jié)點(diǎn)爪飘,宕機(jī)后臨時(shí)節(jié)點(diǎn)會消息义起,客戶端通過Watch監(jiān)聽Zookeeper臨時(shí)節(jié)點(diǎn)的變化,通過感知變化將不可用的節(jié)點(diǎn)從調(diào)用列表里摘除师崎。

1.4 微服務(wù)

SOA解決了業(yè)務(wù)重用默终、資源鏈接瓶頸的問題,架構(gòu)師們總有對服務(wù)進(jìn)一步拆分的沖動:

  1. 解耦犁罩,比如用戶服務(wù)齐蔽,不希望用戶積分影響到用戶登錄
  2. 熱點(diǎn)獨(dú)享資源和故障隔離,比如秒殺我們希望給它更多資源床估,秒殺導(dǎo)致系統(tǒng)崩潰時(shí)不影響普通購買

微服務(wù)可以理解為SOA的服務(wù)拆分粒度的最佳實(shí)踐含滴。

2. 微服務(wù)架構(gòu)的挑戰(zhàn)

2.1 微服務(wù)架構(gòu)的優(yōu)點(diǎn)
1. 功能重用、邏輯一致性

同一邏輯不需要重復(fù)實(shí)現(xiàn)丐巫,避免了重復(fù)代碼谈况,也避免了相同邏輯多個(gè)實(shí)現(xiàn)的不一致勺美。可以通過jar包重用功能碑韵,但邏輯變更后會導(dǎo)致關(guān)聯(lián)上線赡茸。

2. 資源連接瓶頸

不許系統(tǒng)內(nèi)的任意系統(tǒng)都連接給定資源(如數(shù)據(jù)庫),而是有給定服務(wù)的集群連接資源祝闻,其他系統(tǒng)通過調(diào)用服務(wù)獲取數(shù)據(jù)占卧。

3. 降低復(fù)雜度

聚焦,開發(fā)者只需要關(guān)注部分联喘,而不需要關(guān)注全局屉栓,降低理解成本。

4. 可擴(kuò)展性

可以根據(jù)業(yè)務(wù)特點(diǎn)和性能要求耸袜,針對特定服務(wù)增加集群規(guī)挠讯啵或提升系統(tǒng)硬件配置。

5. 解耦堤框、故障隔離

只要保證接口穩(wěn)定域滥,系統(tǒng)直接的發(fā)布上線就不存在強(qiáng)依賴。獨(dú)立進(jìn)程蜈抓,單個(gè)服務(wù)的崩潰不會影響全局启绰。

6. 容錯(cuò)、動態(tài)擴(kuò)容

服務(wù)集群里的部分節(jié)點(diǎn)宕機(jī)不影響整體服務(wù)沟使,整個(gè)服務(wù)崩潰通過重試委可、服務(wù)降級依然能對外服務(wù)。服務(wù)注冊與發(fā)現(xiàn)腊嗡。

2.2 微服務(wù)架構(gòu)的挑戰(zhàn)

微服務(wù)不是銀彈着倾,采用微服務(wù)的過程中,往往需要我們完成數(shù)據(jù)庫拆分燕少,這時(shí)候會帶來分布式事務(wù)的問題卡者;一個(gè)正常的業(yè)務(wù)被拆分了多個(gè)微服務(wù)的調(diào)用鏈;大量的服務(wù)客们,對構(gòu)建崇决、發(fā)布、運(yùn)維都提出了更高的要求底挫。

1. 故障排查

一次請求可能會涉及多個(gè)服務(wù)的多次調(diào)用恒傻,而每個(gè)服務(wù)本身又是一個(gè)集群,調(diào)用可能是其中任意一個(gè)節(jié)點(diǎn)建邓,如果通過傳統(tǒng)的方式直接到文件查看日志盈厘,怎么找這次請求關(guān)聯(lián)的日志會是一個(gè)挑戰(zhàn)。這也是全鏈路監(jiān)控出現(xiàn)的原因涝缝。

2. 服務(wù)監(jiān)控

成百上千個(gè)微服務(wù)如果都是點(diǎn)狀式的監(jiān)控扑庞,單純的將每個(gè)服務(wù)當(dāng)一個(gè)進(jìn)程監(jiān)控譬重,很難直觀的查看哪些服務(wù)故障拒逮,影響范圍是多少罐氨。服務(wù)治理就變得極其的重要,服務(wù)的全局依賴圖可能對我們有所幫助滩援。

3. 分布式架構(gòu)本身帶來的復(fù)雜性

網(wǎng)絡(luò)通信的延遲和故障栅隐,已經(jīng)不預(yù)測的調(diào)用失敗帶來的數(shù)據(jù)一致性保障問題。

4. 運(yùn)維成本

運(yùn)維的本質(zhì)是保證機(jī)器玩徊、系統(tǒng)租悄、網(wǎng)絡(luò)、進(jìn)程和服務(wù)的正常運(yùn)行恩袱,大量拆分的服務(wù)泣棋,在故障率恒定的前提下,故障的頻次會明顯增加(這又是一個(gè)權(quán)衡了畔塔,故障次數(shù)增加潭辈,但是每次故障范圍減少)。大量服務(wù)的快速部署澈吨、統(tǒng)一管理把敢、擴(kuò)容都對運(yùn)維提出了更高的要求。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谅辣,一起剝皮案震驚了整個(gè)濱河市修赞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桑阶,老刑警劉巖柏副,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚣录,居然都是意外死亡搓扯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門包归,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锨推,“玉大人,你說我怎么就攤上這事公壤』豢桑” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵厦幅,是天一觀的道長沾鳄。 經(jīng)常有香客問我,道長确憨,這世上最難降的妖魔是什么译荞? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任瓤的,我火速辦了婚禮,結(jié)果婚禮上吞歼,老公的妹妹穿的比我還像新娘圈膏。我一直安慰自己,他們只是感情好篙骡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布稽坤。 她就那樣靜靜地躺著,像睡著了一般糯俗。 火紅的嫁衣襯著肌膚如雪尿褪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天得湘,我揣著相機(jī)與錄音杖玲,去河邊找鬼。 笑死淘正,一個(gè)胖子當(dāng)著我的面吹牛摆马,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跪帝,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼今膊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伞剑?” 一聲冷哼從身側(cè)響起斑唬,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黎泣,沒想到半個(gè)月后恕刘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抒倚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年褐着,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片托呕。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡含蓉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出项郊,到底是詐尸還是另有隱情馅扣,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布着降,位于F島的核電站差油,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏任洞。R本人自食惡果不足惜蓄喇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一发侵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妆偏,春花似錦刃鳄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熊尉。三九已至罐柳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狰住,已是汗流浹背张吉。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留催植,地道東北人肮蛹。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像创南,于是被迫代替她去往敵國和親伦忠。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354