.NET Core with 微服務(wù) - 什么是微服務(wù)
時(shí)間:2023-05-21 00:50:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-05-21 00:50:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
.NET Core with 微服務(wù) - 什么是微服務(wù):微服務(wù)是這幾年最流行的架構(gòu),說(shuō)起架構(gòu)不提微服務(wù)都不好意思跟人家打招呼。最近想要再梳理一下關(guān)于微服務(wù)的知識(shí),并且結(jié)合本人的一些實(shí)踐經(jīng)驗(yàn)來(lái)做一些總結(jié)與分享。前面會(huì)分享一些概念性的東西,后面也會(huì)使用.net來(lái)實(shí)踐,一步步完成一個(gè)簡(jiǎn)單的微服務(wù)架構(gòu)的小demo。
什么是微服務(wù)
其實(shí)微服務(wù)并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)定義。微服務(wù)是一種軟件架構(gòu)的風(fēng)格。它首先由大神martin fowler提出,2014年3月25號(hào)在他的博客上發(fā)表了一篇博客來(lái)描述了這種微服務(wù)的架構(gòu)。原文地址(
https://www.martinfowler.com/articles/microservices.html)。相對(duì)于傳統(tǒng)的單體(Monolithic)架構(gòu)應(yīng)用,微服務(wù)把單個(gè)進(jìn)程的應(yīng)用拆分為多個(gè)單獨(dú)部署的服務(wù)。每個(gè)服務(wù)對(duì)外提供一些接口來(lái)進(jìn)行服務(wù)間的通訊或者對(duì)第三方提供功能。每個(gè)獨(dú)立的服務(wù)甚至使用自己獨(dú)立的存儲(chǔ)技術(shù),獨(dú)立的語(yǔ)言技術(shù)棧。說(shuō)到底微服務(wù)架構(gòu)還是貫徹了軟件開(kāi)發(fā)中:?jiǎn)我宦氊?zé)、分而治之、解耦等基本理念,只是它把這種理念從類、類庫(kù)級(jí)別提升到了進(jìn)程級(jí)別。
圖片引用自https://www.redhat.com/zh/topics/microservices/what-are-microservices
微服務(wù)與SOA
微服務(wù)架構(gòu)看起來(lái)跟SOA架構(gòu)非常相似。事實(shí)上微服務(wù)架構(gòu)就是SOA的一種現(xiàn)代化的實(shí)現(xiàn)方式,一次進(jìn)化。雖然不能在兩者之間畫(huà)等號(hào),但是他們的思想確實(shí)是一致的。
圖片引用自https://zato.io/docs/intro/esb-soa-cn.html
微服務(wù)與SOA之間的區(qū)別網(wǎng)上有很多,在此不再大段的復(fù)制黏貼網(wǎng)上現(xiàn)成的文字,簡(jiǎn)單談?wù)勛约旱囊恍├斫狻?br>首先SOA大多數(shù)情況下是作用于企業(yè)內(nèi)部,它通過(guò)ESB等總線技術(shù)把企業(yè)內(nèi)的服務(wù)(或者稱之為應(yīng)用)串聯(lián)起來(lái)。SOA雖然是在解耦、去中心化,但是它通常跟某種ESB技術(shù)強(qiáng)耦合起來(lái),以至于ESB會(huì)成為那個(gè)最大的中心。微服務(wù)的作用范圍是應(yīng)用而不是龐大的企業(yè)。微服務(wù)不在依賴ESB等總線技術(shù),服務(wù)間的通訊通過(guò)無(wú)狀態(tài)、輕量級(jí)的接口實(shí)現(xiàn)。協(xié)議采用http、json等通用協(xié)議無(wú)關(guān)開(kāi)發(fā)語(yǔ)言,誰(shuí)都可以調(diào)用。所以相比SOA有更好的去中心化意義。
優(yōu)點(diǎn)
上面說(shuō)了這么多關(guān)于微服務(wù)的知識(shí),那么實(shí)施微服務(wù)到底為我們帶來(lái)了哪些好處?網(wǎng)上有很多復(fù)制黏貼的話其實(shí)我不太茍同,比如:部署簡(jiǎn)單,如果沒(méi)有強(qiáng)大的運(yùn)維團(tuán)隊(duì)微服務(wù)的部署顯然是比傳統(tǒng)單體應(yīng)用部署難度更大了。 比如快速開(kāi)發(fā)快速迭代:事實(shí)上單體應(yīng)用也不用等到完全開(kāi)發(fā)完才能上線。下面說(shuō)下我認(rèn)為的微服務(wù)的幾個(gè)優(yōu)點(diǎn):
- 技術(shù)異構(gòu)
采用微服務(wù)架構(gòu)可以很方便的在每個(gè)服務(wù)中使用不同的技術(shù)棧。每個(gè)團(tuán)隊(duì)可以根據(jù)自身的業(yè)務(wù)情況,人員情況安排使用最合適的技術(shù)。如果我們服務(wù)業(yè)務(wù)是AI那就考慮pyhton,如果我們的人員比較熟悉JavaScript,那么可以選nodejs。當(dāng)然技術(shù)的多樣性也是要權(quán)衡的,不能說(shuō)每個(gè)服務(wù)都擼一種語(yǔ)言每個(gè)都試驗(yàn)一把,這樣未必就是好事情了。 - 擴(kuò)展性
當(dāng)我們的業(yè)務(wù)做的越來(lái)越大,流量越來(lái)越大的時(shí)候,需要對(duì)計(jì)算資源進(jìn)行擴(kuò)展。相對(duì)于單體應(yīng)用,微服務(wù)可以更好的進(jìn)行擴(kuò)展。傳統(tǒng)單體應(yīng)用水平擴(kuò)展的時(shí)候可能需要把整個(gè)應(yīng)用都擴(kuò)展多個(gè)實(shí)例。事實(shí)上我們的業(yè)務(wù)越來(lái)越大的時(shí)候,往往只是某個(gè)模塊壓力巨大。而采用微服務(wù)架構(gòu)我們只需要對(duì)某壓力大的服務(wù)進(jìn)行水平擴(kuò)展。配合現(xiàn)在的容器化技術(shù)能夠更好的利用技術(shù)資源。 - 可靠性
由于每個(gè)服務(wù)都是獨(dú)立部署,當(dāng)某個(gè)服務(wù)故障的時(shí)候通常不會(huì)導(dǎo)致其它服務(wù)同時(shí)故障,只是喪失了部分能力。再配合服務(wù)降級(jí)、熔斷等技術(shù)可以比單體應(yīng)用提供更好的可靠性。 - 強(qiáng)模塊化邊界
這個(gè)概念在網(wǎng)上很少出現(xiàn)。我是在B站上楊波老師的一個(gè)關(guān)于微服務(wù)視頻上看到的,對(duì)這個(gè)觀點(diǎn)比較認(rèn)同。模塊化是我們軟件開(kāi)發(fā)常用的模式。原來(lái)我們按類、按類庫(kù)進(jìn)行模塊化,現(xiàn)在通過(guò)微服務(wù)架構(gòu)直接把模塊服務(wù)化了,并且能獨(dú)立部署運(yùn)行。其它模塊不在需要直接引用相關(guān)類庫(kù)就可以使用它。而且實(shí)施微服務(wù)架構(gòu)后會(huì)強(qiáng)制團(tuán)隊(duì)進(jìn)行應(yīng)用的模塊化,對(duì)模塊的邊界進(jìn)行明確的劃分。當(dāng)然模塊的邊界劃分是個(gè)技術(shù)活,如果劃分的不夠好那就是場(chǎng)災(zāi)難。
缺點(diǎn)
這個(gè)世界上的事情都是具有兩面性的。微服務(wù)除了有其優(yōu)點(diǎn),自然也有缺點(diǎn)。我們?cè)谧黾軜?gòu)的時(shí)候要盡量處理好這些缺點(diǎn),避免踩到巨坑。下面談?wù)勎覍?duì)微服務(wù)缺點(diǎn)的一些看法。
- 運(yùn)維難度增加
本來(lái)只需要部署一個(gè)IIS站點(diǎn)或者Tomcat服務(wù)、維護(hù)一個(gè)數(shù)據(jù)庫(kù),現(xiàn)在變成了需要部署N個(gè)不同的服務(wù),N個(gè)不同類型的數(shù)據(jù)庫(kù)。不同的服務(wù)甚至可能分散在不同的服務(wù)器上。要使這些服務(wù)正常的工作,正常的通訊,還要對(duì)其進(jìn)行監(jiān)控顯然比單體架構(gòu)時(shí)代對(duì)運(yùn)維的考驗(yàn)提高了一個(gè)維度。沒(méi)有強(qiáng)大的運(yùn)維團(tuán)隊(duì)、自動(dòng)化的運(yùn)維工具的話微服務(wù)實(shí)施起來(lái)出故障的概率顯然會(huì)大大增加。 - 分布式的挑戰(zhàn)
微服務(wù)架構(gòu)天然就是分布式的。但是分布式系統(tǒng)會(huì)帶來(lái)很多單體架構(gòu)沒(méi)有的問(wèn)題。比如分布式事務(wù),數(shù)據(jù)一致性問(wèn)題。本來(lái)在進(jìn)程內(nèi)一個(gè)鎖或者在數(shù)據(jù)庫(kù)開(kāi)一個(gè)事務(wù)就能解決的事情,現(xiàn)在不得不借助分布式鎖、分布式事務(wù)、數(shù)據(jù)最終一致性來(lái)處理。這些問(wèn)題對(duì)開(kāi)發(fā)人員寫(xiě)代碼的時(shí)候也是很大的挑戰(zhàn)。除了一致性的問(wèn)題,微服務(wù)架構(gòu)中服務(wù)之間的通信也會(huì)有很高的成本。本來(lái)進(jìn)程內(nèi)的方法調(diào)用變成了跨進(jìn)程、跨服務(wù)的通訊。我們知道網(wǎng)絡(luò)是不可靠的,出現(xiàn)故障的概率遠(yuǎn)遠(yuǎn)超過(guò)進(jìn)程內(nèi)調(diào)用。 - 調(diào)試,測(cè)試難度增加
由于服務(wù)之間互相依賴,在做集成測(cè)試或者調(diào)試的時(shí)候需要把所有依賴的服務(wù)、數(shù)據(jù)庫(kù)等全部都跑起來(lái)。出現(xiàn)問(wèn)題很難一次性定位到確切位置。由于服務(wù)器之間網(wǎng)絡(luò)帶寬的原因多次測(cè)試結(jié)果可能會(huì)有變動(dòng),測(cè)試的結(jié)果不穩(wěn)定。 - 溝通成本提高
在采用微服務(wù)架構(gòu)開(kāi)發(fā)之后,團(tuán)隊(duì)的組織架構(gòu)都可能跟著變動(dòng),團(tuán)隊(duì)免不了被拆分成多個(gè)小團(tuán)隊(duì)甚至不同部門(mén)。在公司呆過(guò)的都知道,跨團(tuán)隊(duì)跨部門(mén)之間溝通的成本有多大。本來(lái)一天就能修復(fù)的bug,很可能變成一周。 - 模塊劃分困難
我們前面說(shuō)微服務(wù)把每個(gè)模塊進(jìn)行獨(dú)立部署,采用獨(dú)立的數(shù)據(jù)庫(kù)。這么輕描淡寫(xiě)的一句話,事實(shí)上實(shí)施起來(lái)并沒(méi)有那么容易。如果模塊劃分的不好,那么會(huì)出現(xiàn)非常多的跨庫(kù)查詢,非常多的跨庫(kù)事務(wù)。本來(lái)單體架構(gòu)上很簡(jiǎn)單的事情變得無(wú)比復(fù)雜。本來(lái)一句Transaction就你搞定的事情,現(xiàn)在可能需要先團(tuán)隊(duì)之間進(jìn)行溝通,然后互相開(kāi)接口,再使用分布式事務(wù)來(lái)完成。模塊劃分的一個(gè)好的方案就是采用DDD的思想進(jìn)劃分,但是事實(shí)上能把DDD玩好落地也不是一件容易的事。
微服務(wù)不是銀彈
微服務(wù)這幾年火熱的很。很多公司、架構(gòu)師言架構(gòu)必微服務(wù),好像微服務(wù)是包治百病的良藥。不管項(xiàng)目大小,項(xiàng)目周期,人員配置,技術(shù)實(shí)力,一股腦的上微服務(wù)。見(jiàn)過(guò)3,5人小團(tuán)隊(duì)一個(gè)月就能開(kāi)發(fā)上線的說(shuō)要進(jìn)行微服務(wù)改造。這么做怕不是微服務(wù)真的香,而是為了充實(shí)自己的簡(jiǎn)歷。
微服務(wù)不是銀彈,正如上面所述,微服務(wù)在享受它帶來(lái)的好處的時(shí)候也是有巨大的成本開(kāi)銷的。它會(huì)帶來(lái)組織架構(gòu)上的變動(dòng),人員的變動(dòng)。它大大的提高了系統(tǒng)的復(fù)雜性,給運(yùn)維、開(kāi)發(fā)、測(cè)試、調(diào)試都帶來(lái)巨大的挑戰(zhàn)。
在采用微服務(wù)架構(gòu)之前最好先思考一下,真的需要微服務(wù)嗎?權(quán)衡一下微服務(wù)帶來(lái)的利弊再下決定。以我個(gè)人的經(jīng)驗(yàn)來(lái)看,市面上絕大多數(shù)系統(tǒng)更適合單體架構(gòu),或者說(shuō)沒(méi)必要一上來(lái)就采用微服務(wù)架構(gòu)。真正好的架構(gòu)是在滿足當(dāng)前需求的前提下快速穩(wěn)定的上線,并對(duì)后面的擴(kuò)展、改造留好余地,以應(yīng)對(duì)后面業(yè)務(wù)發(fā)展帶來(lái)的需求進(jìn)行架構(gòu)的升級(jí)改造。
總結(jié)
通過(guò)以上這些鋪墊我們講了微服務(wù)的概念、微服務(wù)有哪些優(yōu)點(diǎn)、微服務(wù)又有哪些缺點(diǎn)給我們帶來(lái)了哪些方面的挑戰(zhàn)。以上是我個(gè)人的一些淺薄的理解有可能有遺漏或者有錯(cuò)誤,大家可以一起討論一下。
下一篇將會(huì)對(duì)微服務(wù)架構(gòu)、微服務(wù)使用的常用組件進(jìn)行詳細(xì)介紹,敬請(qǐng)期待。
謝謝閱讀,幫忙點(diǎn)贊。