第2章 使用Spring Boot構(gòu)建微服務(wù)

軟件開發(fā)并不是一個由定義和執(zhí)行組成的線性過程,而是一個演化過程,在開發(fā)團隊真正明白手頭的問題之前,需要經(jīng)歷與客戶溝通憋肖、向客戶學(xué)習(xí)和向客戶交付的數(shù)次迭代。
使用傳統(tǒng)的瀑布方法面臨的挑戰(zhàn)在于婚苹,許多時候岸更,這些項目的交付的軟件制品粒度具有以下特點:

  • 緊耦合的
  • 有漏洞的
  • 單體的

基于微服務(wù)的構(gòu)架采用不同的方法來交付功能。具體來說膊升,基于微服務(wù)的構(gòu)架具有以下特點:

  • 有約束的——微服務(wù)具有范圍有限的單一職責(zé)集怎炊。微服務(wù)遵循UNIX的理念,即應(yīng)用程序是服務(wù)的合集用僧,每個服務(wù)只做一件事结胀,并只做好一件事
  • 松耦合的——基于微服務(wù)的應(yīng)用程序是小型服務(wù)的集合赞咙,服務(wù)之間使用非專屬調(diào)用協(xié)議(如HTTP和REST)通過非特定實現(xiàn)的接口彼此交互
  • 抽象的——微服務(wù)完全擁有自己的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)源责循。微服務(wù)所擁有的的數(shù)據(jù)只能由該服務(wù)修改
  • 獨立的——微服務(wù)應(yīng)用程序中的每一個微服務(wù)可以獨立于應(yīng)用程序中使用的其他服務(wù)進行編譯和部署

為什么這些微服務(wù)構(gòu)架屬性對基于云的開發(fā)很重要?基于云的應(yīng)用程序通常有以下特點:

  • 擁有龐大而多樣化的用戶群
  • 極高的運行時間要求
  • 不均勻的容量需求

構(gòu)建一個成功的微服務(wù)架構(gòu)的過程需要結(jié)合軟件開發(fā)組織內(nèi)多個人的視角攀操。

  • 架構(gòu)師——架構(gòu)師的工作是看到大局院仿,了解應(yīng)用程序如何分為單個微服務(wù),以及微服務(wù)如何交互以交付解決方案
  • 軟件開發(fā)人員——軟件開發(fā)人員編寫代碼并詳細了解如何將編程語言和該語言的開發(fā)框架用于交付微服務(wù)
  • DevOps工程師——DevOps工程師不僅為生產(chǎn)環(huán)境而且為所有非生產(chǎn)環(huán)境提供服務(wù)部署和管理的智慧

2.1 架構(gòu)師的故事:設(shè)計微服務(wù)架構(gòu)

架構(gòu)師在軟件項目中的作用是提供待解決問題的工作模型速和。架構(gòu)師的工作是提供腳手架歹垫,開發(fā)人員根據(jù)這些腳手架構(gòu)建他們的代碼,使應(yīng)用程序所有部件都組合在一起颠放。
在構(gòu)建微服務(wù)架構(gòu)時排惨,關(guān)注以下3個關(guān)鍵任務(wù):
(1)分解業(yè)務(wù)問題
(2)建立服務(wù)粒度
(3)定義服務(wù)接口

2.1.1 分解業(yè)務(wù)問題

架構(gòu)師將業(yè)務(wù)問題分解成代表離散活動領(lǐng)域的塊。這些塊封裝了與業(yè)務(wù)域特定部分相關(guān)聯(lián)的業(yè)務(wù)規(guī)則和數(shù)據(jù)邏輯
分離業(yè)務(wù)領(lǐng)域是一門藝術(shù)碰凶,而不是非黑即白的科學(xué):
(1)描述業(yè)務(wù)問題暮芭,并聆聽用來描述問題的名詞
(2)注意動詞鹿驼。動詞突出了動作,通常代表問題域的自然輪廓
(3)尋找數(shù)據(jù)內(nèi)聚

2.1.2 建立服務(wù)粒度

構(gòu)建微服務(wù)構(gòu)架時辕宏,粒度的問題很重要畜晰,可以采取用以下思想來確定正確的解決方案。
(1)開始的時候可以讓微服務(wù)涉及的范圍更廣泛一些瑞筐,然后將其重構(gòu)到更小的服務(wù)
(2)重點關(guān)注服務(wù)如何相互交互
(3)隨著對問題域的理解不斷增長凄鼻,服務(wù)的職責(zé)將隨著時間的推移而改變

Tips:糟糕的微服務(wù)的“味道”
如何知道微服務(wù)的劃分是否正確?如果微服務(wù)過于粗粒度聚假,可能會有以下現(xiàn)象:

  • 服務(wù)承擔(dān)過多的職責(zé)
  • 該服務(wù)正在跨大量表來管理數(shù)據(jù)
  • 測試用例太多
    如果微服務(wù)過于細粒度块蚌?
  • 問題域的一部分微服務(wù)會像兔子一樣繁殖
  • 微服務(wù)彼此之間嚴(yán)重的互相依賴性
  • 微服務(wù)成為簡單CRUD(Create,Read膘格,Update匈子,Delete)服務(wù)的集合

2.1.3 相互交流:定義服務(wù)接口

構(gòu)架師需要關(guān)心的最后一部分,是應(yīng)用程序中的微服務(wù)該如何彼此交流闯袒。
在設(shè)計服務(wù)接口時虎敦,可以使用以下指導(dǎo)方針?biāo)伎挤?wù)接口設(shè)計:
(1)擁抱REST理念——REST對服務(wù)的處理方式是將HTTP作為服務(wù)的調(diào)用協(xié)議并使用標(biāo)準(zhǔn)HTTP動詞(GET、PUT政敢、POST和DELETE)其徙。
(2)使用URI來傳達意圖——用作服務(wù)端點的URI應(yīng)描述問題域中的不同資源,并為問題域的資源關(guān)系提供一種基本機制
(3)請求和響應(yīng)使用JSON——JavaScript Object Notation是一個輕量級的數(shù)據(jù)序列化協(xié)議喷户,并且比XML更易于使用
(4)使用HTTP狀態(tài)碼來傳達結(jié)果

2.2 何時不應(yīng)該使用微服務(wù)

首先唾那,讓我們來了解一下構(gòu)建微服務(wù)應(yīng)用程序的考量因素:
(1)構(gòu)建分布式系統(tǒng)的復(fù)雜性
(2)虛擬服務(wù)器/容器散亂
(3)應(yīng)用程序類型
(4)數(shù)據(jù)事物和一致性

2.2.1 構(gòu)建分布式系統(tǒng)的復(fù)雜性

因為微服務(wù)是分布式和細粒度的,所以它們在應(yīng)用程序中引入了一層復(fù)雜性褪尝,而在單體應(yīng)用程序中就不會出現(xiàn)這樣的情況闹获。微服務(wù)需要高度的運維成熟度。除非組織愿意投入高分布式應(yīng)用程序獲得成功所需
的自動化和運維工作(監(jiān)控河哑、伸縮)避诽,否則不要考慮使用微服務(wù)。

2.2.2 服務(wù)器散亂

微服務(wù)最常用的部署模式之一就是在一個服務(wù)器上部署一個微服務(wù)的實例璃谨。即使在云中運行這些服務(wù)的成本較低沙庐,監(jiān)管和監(jiān)控這些服務(wù)器的操作復(fù)雜性也是巨大的。必須對微服務(wù)的靈活性與運行所有這些服務(wù)器的成本進行權(quán)衡佳吞。

2.2.3 應(yīng)用程序的類型

微服務(wù)面向可復(fù)用性拱雏,并且對構(gòu)建需要高度彈性和可伸縮性的大型應(yīng)用程序非常有用。但如果構(gòu)建小型的底扳、部門級的應(yīng)用程序或具有較小用戶群的應(yīng)用程序铸抑,那么搭建一個分布式模型(如微服務(wù))的復(fù)雜性可能太昂貴了,不值得衷模。

2.2.4 數(shù)據(jù)事物和一致性

如果應(yīng)用程序需要跨多個數(shù)據(jù)源進行復(fù)雜的數(shù)據(jù)聚合或轉(zhuǎn)換鹊汛,那么微服務(wù)的分布式性質(zhì)會讓這項工作變得很困難菇爪。

2.3 開發(fā)人員的故事:用Spring Boot 和Java 構(gòu)建微服務(wù)

(1)構(gòu)建微服務(wù)的基本框架并構(gòu)建應(yīng)用程序的Maven腳本
(2)實現(xiàn)一個Spring 引導(dǎo)類,它將啟動用于微服務(wù)的Spring容器柒昏,并啟動類的所有初始化工作
(3)實現(xiàn)映射端點的Spring Boot 控制器類凳宙,以公開服務(wù)的端點

2.4 DevOps 工程師的故事:構(gòu)建運行時的嚴(yán)謹(jǐn)性

(1)服務(wù)裝配
(2)服務(wù)引導(dǎo)
(3)服務(wù)注冊/發(fā)現(xiàn)
(4)服務(wù)監(jiān)控

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市职祷,隨后出現(xiàn)的幾起案子氏涩,更是在濱河造成了極大的恐慌,老刑警劉巖有梆,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是尖,死亡現(xiàn)場離奇詭異,居然都是意外死亡泥耀,警方通過查閱死者的電腦和手機饺汹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痰催,“玉大人兜辞,你說我怎么就攤上這事】淙埽” “怎么了逸吵?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缝裁。 經(jīng)常有香客問我扫皱,道長,這世上最難降的妖魔是什么捷绑? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任韩脑,我火速辦了婚禮,結(jié)果婚禮上粹污,老公的妹妹穿的比我還像新娘段多。我一直安慰自己,他們只是感情好厕怜,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布衩匣。 她就那樣靜靜地躺著,像睡著了一般粥航。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上生百,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天递雀,我揣著相機與錄音,去河邊找鬼蚀浆。 笑死缀程,一個胖子當(dāng)著我的面吹牛搜吧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杨凑,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼滤奈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撩满?” 一聲冷哼從身側(cè)響起蜒程,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伺帘,沒想到半個月后昭躺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡伪嫁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年领炫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片张咳。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡帝洪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脚猾,到底是詐尸還是另有隱情碟狞,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布婚陪,位于F島的核電站族沃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泌参。R本人自食惡果不足惜脆淹,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沽一。 院中可真熱鬧盖溺,春花似錦、人聲如沸铣缠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝗蛙。三九已至蝇庭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捡硅,已是汗流浹背哮内。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壮韭,地道東北人北发。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓纹因,卻偏偏與公主長得像,于是被迫代替她去往敵國和親琳拨。 傳聞我的和親對象是個殘疾皇子瞭恰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355