什么是單體應(yīng)用槐脏?
如圖所示,這個(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ì)原則
高內(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ā)布訂閱)
- 同步RESTful(GET/PUT/POST...)公黑,基于http,能讓服務(wù)間的通信變得標(biāo)準(zhǔn)化并且無(wú)狀態(tài),關(guān)于RESTful API的成熟度凡蚜,可參
-
避免在服務(wù)與服務(wù)之間共享數(shù)據(jù)庫(kù)
高度自治
- 獨(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記錄那些超過(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
自動(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