學(xué)習(xí)筆記 - 微服務(wù)

引子

隨著領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)、持續(xù)交付习霹、按需虛擬化、基礎(chǔ)設(shè)施自動(dòng)化炫隶、小型自治團(tuán)隊(duì)淋叶、大型集群系統(tǒng)這些實(shí)踐的流行,微服務(wù)也應(yīng)運(yùn)而生——微服務(wù)不是被發(fā)明出來(lái)的等限,而是從現(xiàn)實(shí)世界中總結(jié)出來(lái)的一種趨勢(shì)爸吮。

微服務(wù)的第一步——高內(nèi)聚低耦合

低耦合:修改一個(gè)服務(wù)不需要修改另外一個(gè)服務(wù)。

能夠獨(dú)立修改及部署單個(gè)服務(wù)而不需要修改系統(tǒng)的其他部分望门,這是使用微服務(wù)最重要的一點(diǎn)形娇。一個(gè)松耦合的服務(wù)應(yīng)該盡可能少地知道與之協(xié)作的那些服務(wù)的信息,意味著應(yīng)該限制兩個(gè)服務(wù)之間不同調(diào)用形式的數(shù)量筹误,因?yàn)槌藵撛诘男阅軉?wèn)題之外桐早,過(guò)度的通信可能會(huì)導(dǎo)致高耦合。

高內(nèi)聚:把相關(guān)行為聚集在一起厨剪,把不相關(guān)行為放在別處哄酝。

如果我們要改變某個(gè)行為的話,最好能夠只在一個(gè)地方進(jìn)行修改祷膳,然后就可以盡快地發(fā)布陶衅。如果需要在很多不同的地方做修改,那么可能就需要同時(shí)發(fā)布多個(gè)微服務(wù)才能交付這個(gè)功能直晨。在多個(gè)不同的地方進(jìn)行修改會(huì)降低速度搀军,同時(shí)部署多個(gè)服務(wù)風(fēng)險(xiǎn)也很高,這兩者都是我們想要避免的勇皇。

所以罩句,找到問(wèn)題域的邊界就可以確保相關(guān)的行為放在同一個(gè)地方,并且它們會(huì)和其他邊界以盡量低耦合的形式進(jìn)行通信敛摘。

持續(xù)集成

什么是CI? 我們可以引用Jez Humble(《持續(xù)交付》的作者门烂,持續(xù)交付的書(shū)名來(lái)源于敏捷宣言的第一條原則:“我們的首要任務(wù)是盡早持續(xù)交付有價(jià)值的軟件并讓客戶滿意。”)提出的三個(gè)問(wèn)題用來(lái)測(cè)試我們是否真正理解CI屯远。

我們是否每天簽入代碼到主線蔓姚?

我們應(yīng)該保證代碼能夠與已有代碼進(jìn)行集成。如果我們的代碼和其他人的代碼沒(méi)被頻繁地放在一起慨丐,那么將來(lái)的集成就會(huì)非常困難赂乐。即使我們只使用生命周期很短的分支來(lái)管理這些修改,也要盡可能頻繁地把代碼撿入到單個(gè)主線分支中咖气。

我們是否有一組測(cè)試來(lái)驗(yàn)證修改?

如果沒(méi)有測(cè)試挖滤,我們只能知道集成后沒(méi)有語(yǔ)法錯(cuò)誤崩溪,但無(wú)法知道系統(tǒng)的行為是否已經(jīng)被破壞。沒(méi)有對(duì)代碼進(jìn)行驗(yàn)證的CI不是真正的CI斩松。

當(dāng)構(gòu)建失敗后伶唯,我們是否把修復(fù)CI當(dāng)作第一優(yōu)先級(jí)的事情來(lái)做?

綠色的構(gòu)建意味著惧盹,我們的修改已經(jīng)安全地和已有代碼集成在一起乳幸。紅色的構(gòu)建意味著,最后一次修改很可能有問(wèn)題钧椰,這時(shí)只能提交修復(fù)構(gòu)建的代碼粹断。如果我們?cè)试S別人在構(gòu)建失敗時(shí)提交更多的修改,用于修復(fù)構(gòu)建的時(shí)間就會(huì)大大增加嫡霞。

ThoughtWorks武漢辦公室

將持續(xù)集成映射到微服務(wù)瓶埋,每個(gè)微服務(wù)都會(huì)有自己的代碼庫(kù)和構(gòu)建流程。

持續(xù)集成

契約測(cè)試

契約測(cè)試最開(kāi)始的概念由Martin Fowler(ThoughtWorks首席科學(xué)家) 提出诊沪, 它又被稱之為消費(fèi)者驅(qū)動(dòng)的契約測(cè)試(CDC:Consumer Driven Contracts)养筒。這里的契約是指軟件系統(tǒng)中各個(gè)服務(wù)間交互的數(shù)據(jù)標(biāo)準(zhǔn)格式,更多的指消費(fèi)端(client)和提供端(server)之間交互的數(shù)據(jù)接口的格式端姚。

系統(tǒng)工程中存在這樣的理論:線性系統(tǒng)(即復(fù)雜性隨規(guī)模線性增長(zhǎng)的系統(tǒng))的可靠性等于組成它的各個(gè)組件的可靠性之乘積晕粪。這容易理解,因?yàn)檎麄€(gè)系統(tǒng)正常工作的條件是必須每個(gè)組件都同時(shí)正常工作渐裸。

線性系統(tǒng)的可靠性

如上圖表述的由三個(gè)組件共同支撐的系統(tǒng)巫湘。如果每個(gè)組件的可靠性是90%,那么整個(gè)系統(tǒng)的可靠性就是?90%×90%×90%=72.9%橄仆,我們可以看到系統(tǒng)整體的可靠度是低于任一組件的可靠性的剩膘。如果一個(gè)系統(tǒng)由100個(gè)組件組成,每個(gè)組件即使能達(dá)到99%的可靠性盆顾,那么整個(gè)系統(tǒng)的可靠性也會(huì)降到36.6%左右怠褐。

我們常說(shuō)復(fù)雜性是軟件工程的最重要的特性,一個(gè)完善的軟件系統(tǒng)必然是由很多的子系統(tǒng)您宪、組件共同撐起來(lái)的奈懒。隨著業(yè)務(wù)的復(fù)雜度越來(lái)越高奠涌,整個(gè)系統(tǒng)也變得越來(lái)越龐大和錯(cuò)綜復(fù)雜,在微服務(wù)的架構(gòu)下通常一個(gè)消費(fèi)端會(huì)與多個(gè)服務(wù)端相互交互磷杏,可以想象一下如果某一個(gè)服務(wù)的接口發(fā)生變化將會(huì)影響整個(gè)系統(tǒng)的運(yùn)行溜畅。

在微服務(wù)模式下如何保證各個(gè)服務(wù)端與消費(fèi)端之間以及服務(wù)與服務(wù)之間能夠可靠的交互呢?在服務(wù)端接口發(fā)生變化的情況下通過(guò)契約測(cè)試可以很容易的測(cè)試出契約不匹配极祸,在集成測(cè)試之前發(fā)現(xiàn)問(wèn)題慈格,盡早解決。(一般契約測(cè)試是在單元測(cè)試之后遥金,集成測(cè)試之前進(jìn)行的浴捆,首先在保證各自功能正確的前提下測(cè)試消費(fèi)者和提供者的契約是否相匹配,然后再進(jìn)一步的測(cè)試功能的完備性和整個(gè)業(yè)務(wù)流的正確性稿械。)

契約測(cè)試

所以选泻,契約測(cè)試能解決這樣的問(wèn)題:

可以使得消費(fèi)端和提供端之間測(cè)試解耦,不再需要客戶端和服務(wù)端聯(lián)調(diào)才能發(fā)現(xiàn)問(wèn)題美莫。

完全由消費(fèi)者驅(qū)動(dòng)的方式页眯,消費(fèi)者需要什么數(shù)據(jù),服務(wù)端就提供什么樣的數(shù)據(jù)厢呵,數(shù)據(jù)契約也是由消費(fèi)者來(lái)決定的窝撵。

測(cè)試前移,越早的發(fā)現(xiàn)問(wèn)題述吸,保證后續(xù)測(cè)試的完整性忿族。

通過(guò)契約測(cè)試,團(tuán)隊(duì)能以一種離線的方式(不需要消費(fèi)者蝌矛、提供者同時(shí)在線)道批,通過(guò)契約作為中間的標(biāo)準(zhǔn),驗(yàn)證提供者提供的內(nèi)容是否滿足消費(fèi)者的期望入撒。

后記

去中心化與微服務(wù)——為了最大化微服務(wù)能帶來(lái)的自治性隆豹,我們需要持續(xù)尋找機(jī)會(huì),給擁有服務(wù)的團(tuán)隊(duì)委派決策和控制權(quán)茅逮。讓團(tuán)隊(duì)與組織保持一致璃赡,構(gòu)建面向業(yè)務(wù)服務(wù)的團(tuán)隊(duì),幫助團(tuán)隊(duì)的每個(gè)成員共同對(duì)系統(tǒng)技術(shù)愿景的演化負(fù)責(zé)献雅。

逐步開(kāi)始的重要性——在有能力大規(guī)模使用微服務(wù)之前碉考,請(qǐng)花費(fèi)一定的時(shí)間來(lái)構(gòu)建工具和實(shí)踐,幫助管理微服務(wù)挺身。這個(gè)過(guò)程可以幫助我們了解組織改變的意愿和能力侯谁,這將有助于正確地采用微服務(wù)。

本文作者萬(wàn)學(xué)凡,ThoughtWorks首席咨詢師墙贱,武漢热芹。作者保留本文一切權(quán)利,未經(jīng)許可請(qǐng)勿轉(zhuǎn)載惨撇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伊脓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子魁衙,更是在濱河造成了極大的恐慌报腔,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剖淀,死亡現(xiàn)場(chǎng)離奇詭異榄笙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)祷蝌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)帆卓,“玉大人巨朦,你說(shuō)我怎么就攤上這事〗A睿” “怎么了糊啡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吁津。 經(jīng)常有香客問(wèn)我棚蓄,道長(zhǎng),這世上最難降的妖魔是什么碍脏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任梭依,我火速辦了婚禮,結(jié)果婚禮上典尾,老公的妹妹穿的比我還像新娘役拴。我一直安慰自己,他們只是感情好钾埂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布河闰。 她就那樣靜靜地躺著,像睡著了一般褥紫。 火紅的嫁衣襯著肌膚如雪姜性。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天髓考,我揣著相機(jī)與錄音部念,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛印机,可吹牛的內(nèi)容都是我干的矢腻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼射赛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼多柑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起楣责,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竣灌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后秆麸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體初嘹,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年沮趣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屯烦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡房铭,死狀恐怖驻龟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缸匪,我是刑警寧澤翁狐,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站凌蔬,受9級(jí)特大地震影響露懒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砂心,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一懈词、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辩诞,春花似錦钦睡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至秧秉,卻和暖如春褐桌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背象迎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工荧嵌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呛踊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓啦撮,卻偏偏與公主長(zhǎng)得像谭网,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赃春,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • 不得不說(shuō)愉择,今天是個(gè)值得紀(jì)念的日子,當(dāng)然不是因?yàn)槠桨惨怪校且驗(yàn)槲业目颇慷荚囉忠淮问? 從考車上下...
    阿貍囈語(yǔ)閱讀 260評(píng)論 0 0
  • 下載texlive鏡像并掛載 設(shè)置環(huán)境變量: 為XETEX配置字體 vscode下載插件LaTeX Worksho...
    Gaolex閱讀 2,898評(píng)論 2 0
  • 選自《番茄工作法》 I:試著完成特定時(shí)間段內(nèi)的活動(dòng)锥涕。1、列出代辦活動(dòng)狭吼;2层坠、確定哪項(xiàng)是重要的;3刁笙、設(shè)定鬧鈴破花,時(shí)間是十...
    Sara_s閱讀 124評(píng)論 1 0
  • 你還記得你第一次體驗(yàn) VR 的感受嗎旧乞?是不是一個(gè)極其逼真,內(nèi)容豐富磅氨,錯(cuò)綜復(fù)雜的杰出作品?如果你覺(jué)得是這樣嫡纠,那么你是...
    曉曉13號(hào)閱讀 139評(píng)論 0 0