微服務(wù)六大設(shè)計(jì)原則

什么是單體應(yīng)用槐脏?

單體.png

如圖所示,這個(gè)系統(tǒng)采用了三層架構(gòu)撇寞,表現(xiàn)層顿天,業(yè)務(wù)邏輯層,數(shù)據(jù)訪問(wèn)層蔑担,雖然三層架構(gòu)解決了應(yīng)用程序中代碼間調(diào)用復(fù)雜牌废,代碼職責(zé)不清的問(wèn)題。但是他只是將應(yīng)用在邏輯上分成了三層啤握,并不是物理上的分層鸟缕,通過(guò)編譯,打包,部署后懂从,最終還是在同一臺(tái)機(jī)器的同一個(gè)進(jìn)程中運(yùn)行授段, 這種功能集中,代碼中心化番甩,一個(gè)發(fā)布包侵贵,部署后運(yùn)行在同一個(gè)進(jìn)程的應(yīng)用程序,我們通常稱之為單體架構(gòu)應(yīng)用缘薛。

單體應(yīng)用的優(yōu)點(diǎn)窍育?

  • 易于開(kāi)發(fā)
  • 易于測(cè)試
  • 易于部署

單體應(yīng)用的弊端?

  • 維護(hù)成本高 - 隨著業(yè)務(wù)的不斷擴(kuò)大掩宜,需求的持續(xù)增加蔫骂,越來(lái)越多人加入開(kāi)發(fā)團(tuán)隊(duì),代碼庫(kù)也在急劇的膨脹牺汤,在這種情況下辽旋,單體架構(gòu)的可維護(hù)性,靈活性在降低檐迟,而維護(hù)成本补胚,技術(shù)架構(gòu)演進(jìn)的成本,以及系統(tǒng)擴(kuò)展成本等都在增加追迟。
  • 可靠性差 - 由于所有模塊都運(yùn)行在同一進(jìn)程中溶其,任何模塊中的一個(gè) bug,比如內(nèi)存泄漏都可能弄垮整個(gè)進(jìn)程敦间。
  • 技術(shù)選型成本高 - 單體應(yīng)用會(huì)讓采用新框架和語(yǔ)言極其困難瓶逃。舉例來(lái)說(shuō),你有兩百萬(wàn)行使用 XYZ 框架的代碼廓块,如果要使用 ABC 框架重寫(xiě)代碼厢绝,無(wú)論時(shí)間還是成本都將非常高昂,即便新框架更好带猴,這也就成為使用新技術(shù)的阻礙昔汉。
  • 交付周期長(zhǎng) - 一般采用release train的方式,需要所用的功能都準(zhǔn)備好了才能發(fā)布拴清。

微服務(wù)的定義

越來(lái)越多的公司靶病,諸如亞馬遜、eBay口予、Netflix 等已經(jīng)通過(guò)采用微服務(wù)架構(gòu)解決了上面提到的問(wèn)題娄周,當(dāng)我們?cè)诹奈⒎?wù)的時(shí)候,它代表著什么沪停?

微服務(wù)架構(gòu)是一種架構(gòu)模式煤辨,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合掷酗,為用戶提供最終價(jià)值。每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中窟哺,服務(wù)與服務(wù)間采用輕量級(jí)的通信機(jī)制互相溝通(通常是基于HTTP協(xié)議的RESTful API)泻轰。每個(gè)服務(wù)都圍繞著具體業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠被獨(dú)立的部署到生產(chǎn)環(huán)境且轨、類(lèi)生產(chǎn)環(huán)境等浮声。另外,應(yīng)當(dāng)盡量避免統(tǒng)一的旋奢、集中式的服務(wù)管理機(jī)制泳挥,對(duì)具體的一個(gè)服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文至朗,選擇合適的語(yǔ)言屉符、工具對(duì)其進(jìn)行構(gòu)建。

微服務(wù)與SOA

SOA

  • SOA最早的出現(xiàn)是為了解決企業(yè)不同系統(tǒng)之間整合的問(wèn)題锹引,提出服務(wù)重用和消息總線矗钟。
  • SOA中存在大量的編排,通常通過(guò)消息總線來(lái)承載業(yè)務(wù)邏輯嫌变,并構(gòu)建出重量級(jí)中心化的中間件吨艇。
  • SOA有個(gè)很大的問(wèn)題在于總線,按照這個(gè)思想腾啥,這些系統(tǒng)總會(huì)在某個(gè)環(huán)節(jié)上走向集中东涡,所以去中心化做的很不徹底。

微服務(wù)

  • 目標(biāo): 幫助企業(yè)更快的響應(yīng)變化
  • 宗旨: 去中心化

微服務(wù)劃分

如何設(shè)計(jì)一個(gè)好的服務(wù)是微服務(wù)的核心倘待,而領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是其中關(guān)鍵的方法之一疮跑,請(qǐng)參考我之前的文章: https://qinnnyul.github.io/2018/08/13/ddd-concept/#more

微服務(wù)的設(shè)計(jì)原則

設(shè)計(jì)原則.png

高內(nèi)聚低耦合

  • 緊密關(guān)聯(lián)的事物應(yīng)該放在一起,每個(gè)服務(wù)是針對(duì)一個(gè)單一職責(zé)的業(yè)務(wù)能力的封裝延柠,專注做好一件事情(每次只有一個(gè)更改它的理由)祸挪。如下圖:有四個(gè)服務(wù)a,b,c,d,但是每個(gè)服務(wù)職責(zé)不單一贞间,a可能在做b的事情贿条,b又在做c的事情,c又同時(shí)在做a的事情增热,通過(guò)重新調(diào)整整以,將相關(guān)的事物放在一起后,可以減少不必要的服務(wù)峻仇。
  • 輕量級(jí)的通信方式
    • 同步RESTful(GET/PUT/POST...)公黑,基于http,能讓服務(wù)間的通信變得標(biāo)準(zhǔn)化并且無(wú)狀態(tài),關(guān)于RESTful API的成熟度凡蚜,可參Richardson為REST定義的成熟度模型
    • 異步(消息隊(duì)列/發(fā)布訂閱)
  • 避免在服務(wù)與服務(wù)之間共享數(shù)據(jù)庫(kù)


    高內(nèi)聚.png

高度自治

  • 獨(dú)立部署運(yùn)行和擴(kuò)展
    • 每個(gè)服務(wù)能夠獨(dú)立被部署并運(yùn)行在一個(gè)進(jìn)程內(nèi)
    • 這種運(yùn)行和部署方式能夠賦予系統(tǒng)靈活的代碼組織方式和發(fā)布節(jié)奏人断,使得快速交付和應(yīng)對(duì)變化成為可能。
  • 獨(dú)立開(kāi)發(fā)和演進(jìn)
    • 技術(shù)選型靈活朝蜘,不受遺留系統(tǒng)技術(shù)棧的約束恶迈。
    • 合適的業(yè)務(wù)問(wèn)題可以選擇合適的技術(shù)棧,可以獨(dú)立的演進(jìn)
    • 服務(wù)與服務(wù)之間采取與語(yǔ)言無(wú)關(guān)的API進(jìn)行集成
  • 獨(dú)立的團(tuán)隊(duì)和自治
    • 團(tuán)隊(duì)對(duì)服務(wù)的整個(gè)生命周期負(fù)責(zé)谱醇,工作在獨(dú)立的上下文中暇仲, 誰(shuí)開(kāi)發(fā),誰(shuí)維護(hù)副渴。

以業(yè)務(wù)為中心

  • 每個(gè)服務(wù)代表了特定的業(yè)務(wù)邏輯
  • 有明顯的邊界上下文
  • 圍繞業(yè)務(wù)組織團(tuán)隊(duì)
  • 能快速的響應(yīng)業(yè)務(wù)的變化
  • 隔離實(shí)現(xiàn)細(xì)節(jié)奈附,讓業(yè)務(wù)領(lǐng)域可以被重用

彈性設(shè)計(jì)

  • 設(shè)計(jì)可容錯(cuò)的系統(tǒng)
    • 擁抱失敗,為已知的錯(cuò)誤而設(shè)計(jì)
    • 依賴的服務(wù)掛掉
    • 網(wǎng)絡(luò)連接問(wèn)題
  • 設(shè)計(jì)具有自我保護(hù)能力的系統(tǒng)
    • 服務(wù)隔離
    • 服務(wù)降級(jí)
    • 限制使用資源
    • 防止級(jí)聯(lián)錯(cuò)誤

Netfilix 提供了一個(gè)比較好的解決方案煮剧,具體的應(yīng)對(duì)措施包括:網(wǎng)絡(luò)超時(shí)/限制請(qǐng)求的次數(shù)/斷路器模式/提供回滾等斥滤。

hystrix.png

fallback.png

Hystrix記錄那些超過(guò)預(yù)設(shè)定的極限值的調(diào)用。它實(shí)現(xiàn)了circuit break模式勉盅,從而避免了無(wú)休止的等待無(wú)響應(yīng)的服務(wù)中跌。如果一個(gè)服務(wù)的錯(cuò)誤率超過(guò)預(yù)設(shè)值,Hystrix將中斷服務(wù)菇篡,并且在一段時(shí)間內(nèi)所有對(duì)該服務(wù)的請(qǐng)求會(huì)立刻失效漩符。Hystrix可以為請(qǐng)求失敗定義一個(gè)fallback操作,例如讀取緩存或者返回默認(rèn)值驱还。

日志與監(jiān)控

當(dāng)產(chǎn)品環(huán)境出錯(cuò)時(shí)嗜暴,需要快速的定位問(wèn)題,檢測(cè)可能發(fā)生的意外和故障议蟆。而日志與監(jiān)控是快速定位和預(yù)防的不二選擇闷沥,在微服務(wù)架構(gòu)中更是至關(guān)重要。

  • 高度可觀察咐容,我們需要對(duì)正在發(fā)生的事情有一個(gè)整體的視角舆逃。
  • 聚合你的日志,聚合你的數(shù)據(jù)戳粒,從而當(dāng)你遇到問(wèn)題時(shí)路狮,可以深入分析原因。
  • 當(dāng)需要重現(xiàn)令人討厭的問(wèn)題蔚约,或僅僅查看你的系統(tǒng)在生產(chǎn)環(huán)境如何交互時(shí)奄妨,關(guān)聯(lián)標(biāo)識(shí)可以幫助你跟蹤系統(tǒng)間的調(diào)用。

監(jiān)控主要包括服務(wù)可用狀態(tài)苹祟、請(qǐng)求流量砸抛、調(diào)用鏈评雌、錯(cuò)誤計(jì)數(shù),結(jié)構(gòu)化的日志直焙、服務(wù)依賴關(guān)系可視化等內(nèi)容景东,以便發(fā)現(xiàn)問(wèn)題及時(shí)修復(fù),實(shí)時(shí)調(diào)整系統(tǒng)負(fù)載奔誓,必要時(shí)進(jìn)行服務(wù)降級(jí)耐薯,過(guò)載保護(hù)等等,從而讓系統(tǒng)和環(huán)境提供高效高質(zhì)量的服務(wù)丝里。

比如商業(yè)解決方案splunk,sumologic体谒,以及開(kāi)源產(chǎn)品ELK他們都可以用于日志的收集杯聚,聚合,展現(xiàn)抒痒,并提供搜索功能幌绍,基于一定條件,觸發(fā)郵件警告故响。

Spring boot admin也可以用于服務(wù)可用性的監(jiān)控傀广, hystrix除了提供熔斷器機(jī)制外,它還收集了一些請(qǐng)求的基本信息(比如請(qǐng)求響應(yīng)時(shí)間彩届,訪問(wèn)計(jì)算伪冰,錯(cuò)誤統(tǒng)計(jì)等),并提供現(xiàn)成的dashboard將信息可視化樟蠕。

關(guān)于性能監(jiān)控和調(diào)用鏈追蹤贮聂,考慮使用dynatrace和zipkin/Sleuth


monitor.png

自動(dòng)化

在微服務(wù)架構(gòu)下,面臨如下挑戰(zhàn):

  • 分布式系統(tǒng)
  • 多服務(wù)寨辩,多實(shí)例
  • 手動(dòng)測(cè)試吓懈,部署,發(fā)布太消耗時(shí)間
  • 反饋周期太長(zhǎng)

傳統(tǒng)的手工運(yùn)維方式必然要被淘汰靡狞,微服務(wù)的實(shí)施是有一定的先決條件:那就是自動(dòng)化耻警,當(dāng)服務(wù)規(guī)模化后需要更多自動(dòng)化標(biāo)準(zhǔn)化的手段來(lái)提升效能和降低成本甸怕。

  • 自動(dòng)化測(cè)試必不可少甘穿,因?yàn)閷?duì)比單塊系統(tǒng),確保我們大量的服務(wù)正常工作是一個(gè)更復(fù)雜的過(guò)程梢杭。
  • 調(diào)用一個(gè)統(tǒng)一的命令行扒磁,以相同的方式把系統(tǒng)部署到各個(gè)環(huán)境。
  • 考慮使用環(huán)境定義來(lái)幫助你明確不同環(huán)境間的差異式曲,但同時(shí)保持使用統(tǒng)一的方式進(jìn)行部署的能力妨托。
  • 考慮創(chuàng)建自定義鏡像來(lái)加快部署缸榛,并且擁抱全自動(dòng)化創(chuàng)建不可變服務(wù)器的實(shí)踐。

自動(dòng)化一切可以自動(dòng)化的兰伤,降低部署和發(fā)布的難度, 比如: 在持續(xù)集成和持續(xù)交付中内颗,自動(dòng)化編譯,測(cè)試敦腔,安全掃描均澳,打包,集成測(cè)試符衔,部署找前,隨著服務(wù)越來(lái)越多,在發(fā)布過(guò)程中判族,需要進(jìn)一步自動(dòng)化藍(lán)綠部署(做到老版本到新版本的平滑過(guò)渡)還可以使用pipeline as code的實(shí)踐躺盛,用代碼來(lái)描述你的流水線。關(guān)于部署有很多選擇形帮,可以使用虛擬機(jī)槽惫,容器docker,或者流行的無(wú)服務(wù)架構(gòu)lambda(AWS Lambda 也有一些明顯的局限辩撑。它并不適合被用來(lái)部署長(zhǎng)期運(yùn)行的服務(wù)界斜,請(qǐng)求需要在 300 秒內(nèi)完成,當(dāng)然你可以通過(guò)hack的方式延遲時(shí)間)合冀。

然后各薇, 可以采用基礎(chǔ)設(shè)施及代碼的實(shí)踐,比如亞馬遜的cloudformation君躺,還有terrform得糜,通過(guò)代碼來(lái)描述計(jì)算和網(wǎng)絡(luò)等基礎(chǔ)設(shè)施, 可以快速為一個(gè)全新的服務(wù)晰洒,構(gòu)架它所需要的環(huán)境朝抖,保持各環(huán)境的一致性

康威定律

一個(gè)系統(tǒng)的架構(gòu)谍珊,反應(yīng)了組織的溝通結(jié)構(gòu)

這就要求我們應(yīng)該將服務(wù)的所用權(quán)和團(tuán)隊(duì)對(duì)齊治宣,當(dāng)兩者不一致的時(shí)候,我們會(huì)發(fā)現(xiàn)很多的摩擦點(diǎn)砌滞。

最后小結(jié): 微服務(wù)的目標(biāo)述求是為了提供響應(yīng)力侮邀,它圍繞業(yè)務(wù)能力進(jìn)行構(gòu)建,讓一切去中心化是微服務(wù)的最高宗旨贝润,在設(shè)計(jì)微服務(wù)的時(shí)候绊茧,是需要具備一定前提條件的(你必須是那個(gè)高個(gè)子),請(qǐng)參考上面的設(shè)計(jì)原則打掘。很早以前寫(xiě)的關(guān)于微服務(wù)的咨詢华畏,可以去這里下載一些PPT: https://wenku.baidu.com/view/fd9dea34dcccda38376baf1ffc4ffe473268fd42

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹏秋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子亡笑,更是在濱河造成了極大的恐慌侣夷,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仑乌,死亡現(xiàn)場(chǎng)離奇詭異百拓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晰甚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)衙传,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人厕九,你說(shuō)我怎么就攤上這事蓖捶。” “怎么了止剖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)落君。 經(jīng)常有香客問(wèn)我穿香,道長(zhǎng),這世上最難降的妖魔是什么绎速? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任皮获,我火速辦了婚禮,結(jié)果婚禮上纹冤,老公的妹妹穿的比我還像新娘洒宝。我一直安慰自己,他們只是感情好萌京,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布雁歌。 她就那樣靜靜地躺著,像睡著了一般知残。 火紅的嫁衣襯著肌膚如雪靠瞎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天求妹,我揣著相機(jī)與錄音乏盐,去河邊找鬼。 笑死制恍,一個(gè)胖子當(dāng)著我的面吹牛父能,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播净神,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼何吝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溉委!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起岔霸,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤薛躬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后呆细,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體型宝,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年絮爷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趴酣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坑夯,死狀恐怖岖寞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柜蜈,我是刑警寧澤仗谆,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站淑履,受9級(jí)特大地震影響隶垮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秘噪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一狸吞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧指煎,春花似錦蹋偏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至像街,卻和暖如春字逗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宅广。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工葫掉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跟狱。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓俭厚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驶臊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挪挤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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