溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

顛覆微服務(wù)認(rèn)知:深入思考微服務(wù)的七個(gè)主流觀點(diǎn)

發(fā)布時(shí)間:2020-07-05 18:56:35 來源:網(wǎng)絡(luò) 閱讀:330 作者:wx5dca43872c5cc 欄目:編程語言

一、逃離單體系統(tǒng),擁抱微服務(wù)?

單體系統(tǒng)和微服務(wù)的區(qū)別在于,一個(gè)單體系統(tǒng)是一個(gè)大而全的功能集合,每個(gè)服務(wù)器運(yùn)行的是這個(gè)應(yīng)用的完整服務(wù)。而微服務(wù)是獨(dú)立自治的功能模塊,它是生態(tài)系統(tǒng)中的一部分,和其他微服務(wù)是共生關(guān)系。現(xiàn)在,業(yè)界對單體系統(tǒng)和微服務(wù)的普遍觀點(diǎn)是:單體系統(tǒng)非常容易開發(fā)、測試、部署,但是單體系統(tǒng)面對的問題也很多,例如開發(fā)效率變低、維護(hù)成本增加、部署影響變大、可擴(kuò)展性較差、技術(shù)選型成本高,而引入了微服務(wù)可以實(shí)現(xiàn)每個(gè)微服務(wù)易于開發(fā)與維護(hù),便于溝通與協(xié)作,很適合小團(tuán)隊(duì)敏捷開發(fā)與持續(xù)交付;每個(gè)微服務(wù)職責(zé)單一,高內(nèi)聚、低耦合。同時(shí),每個(gè)微服務(wù)能夠獨(dú)立開發(fā)、獨(dú)立運(yùn)行、獨(dú)立部署;每個(gè)微服務(wù)之間是獨(dú)立的,如果某個(gè)服務(wù)部署或者宕機(jī),只會影響到當(dāng)前服務(wù),而不會對整個(gè)業(yè)務(wù)系統(tǒng)產(chǎn)生影響;每個(gè)微服務(wù)可以隨著系統(tǒng)規(guī)模的不斷擴(kuò)大,面對海量用戶和高并發(fā),獨(dú)立做水平擴(kuò)展與垂直擴(kuò)展;每個(gè)微服務(wù)可以使用不同的編程語言以及不同的存儲技術(shù),使得我們更容易嘗試新的技術(shù)。此外,對單個(gè)服務(wù)進(jìn)行業(yè)務(wù)重構(gòu),也不會面臨很大的業(yè)務(wù)負(fù)擔(dān)與技術(shù)債券。顛覆微服務(wù)認(rèn)知:深入思考微服務(wù)的七個(gè)主流觀點(diǎn)

筆者對微服務(wù)系統(tǒng)的觀點(diǎn)是,我們從單體系統(tǒng)向微服務(wù)系統(tǒng)改造的過程中,需要認(rèn)真思考什么階段使用微服務(wù)。微服務(wù)不是銀彈,它對于設(shè)計(jì)和運(yùn)維難度提出了更高的要求,同時(shí)也帶來了一些技術(shù)的復(fù)雜度。因此,我們需要思考與解決分布式的復(fù)雜性、數(shù)據(jù)的一致性、服務(wù)的管理與運(yùn)維、服務(wù)的自動化部署等解決方案。事實(shí)上,微服務(wù)通過拆分單體系統(tǒng)使其成為多個(gè)體積更小的服務(wù)來降低單個(gè)服務(wù)的復(fù)雜性,但是,我們從整體來看,這種方式有造成了存在大量的服務(wù),而服務(wù)之間的相互調(diào)用也會增多,從而導(dǎo)致整個(gè)系統(tǒng)架構(gòu)變得更加復(fù)雜。

我們經(jīng)常忽視業(yè)務(wù)價(jià)值和成本考量,而太過追求技術(shù),那么可能會導(dǎo)致我們精心設(shè)計(jì)的分布式架構(gòu)嚴(yán)重影響我們開發(fā)的速度和業(yè)務(wù)的快速迭代,并且隨著業(yè)務(wù)的不確定性往往導(dǎo)致我們的架構(gòu)在半年到一年之內(nèi)就已經(jīng)不完全適用,推倒重來。此外,如果業(yè)務(wù)沒有發(fā)展起來也會導(dǎo)致前期大量的服務(wù)器資源盲目的浪費(fèi)了,這對于初創(chuàng)業(yè)務(wù)得不償失。因此,我們在項(xiàng)目前期為了保證快速增長業(yè)務(wù),保證系統(tǒng)盡量減少依賴且獨(dú)立完整,減低引入微服務(wù)架構(gòu)后的技術(shù)復(fù)雜度,例如它對于運(yùn)維難度提出了更高的要求,因?yàn)楹玫奈⒎?wù)架構(gòu)需要穩(wěn)定的基礎(chǔ)設(shè)施。隨著業(yè)務(wù)發(fā)展良好,系統(tǒng)規(guī)模會不斷擴(kuò)大,它的擴(kuò)展性、伸縮性、可用性和性能都限制了我們的業(yè)務(wù)發(fā)展,此時(shí),我們懷著明確的業(yè)務(wù)思考和投入更多的資源再來考慮微服務(wù)改造。

微服務(wù)架構(gòu)使用服務(wù)作為模塊化的單元,那么,我們可以在前期設(shè)計(jì)的時(shí)候通過 Maven 的 module 模塊化來初步隔離依賴,為我們之后的改造預(yù)留空間。注意的是,微服務(wù)在生態(tài)系統(tǒng)中是共生關(guān)系。這里,不僅僅局限在它們可能存在鏈路依賴,同時(shí)它們的業(yè)務(wù)價(jià)值一定是共生的。因此,后期識別出單體系統(tǒng)的核心價(jià)值、關(guān)鍵功能,再把這些功能拆分成獨(dú)立且自完整的模塊。這里,改造方案可以閱讀筆者的《高可用可伸縮微服務(wù)架構(gòu):基于Dubbo、Spring Cloud和Service Mesh》一書的第十二章 “遺留系統(tǒng)的微服務(wù)架構(gòu)改造”。

總結(jié)一下,微服務(wù)通過拆分單體系統(tǒng)使其成為多個(gè)體積更小的服務(wù)來降低單個(gè)服務(wù)的復(fù)雜性,但是,我們從整體來看,這種方式有造成了存在大量的服務(wù),而服務(wù)之間的相互調(diào)用也會增多,從而導(dǎo)致整個(gè)系統(tǒng)架構(gòu)變得更加復(fù)雜。因此,我們不單單只關(guān)注技術(shù),而需要考量投入產(chǎn)出比,保障當(dāng)前階段的利益最大化。

二、擺脫單體系統(tǒng)就遠(yuǎn)離大泥球?

單體系統(tǒng)讓很多人詬病的是其服務(wù)內(nèi)聚混亂,看起來就像一個(gè)大泥球。那么,服務(wù)化之后,就解決了這個(gè)問題了嗎?事實(shí)上,微服務(wù)通過拆分單體系統(tǒng)使其成為多個(gè)體積更小的服務(wù)來降低單個(gè)服務(wù)的復(fù)雜性,讓單個(gè)系統(tǒng)看起來更加的職能清晰,但是,整個(gè)系統(tǒng)架構(gòu)變得更加復(fù)雜。事實(shí)上,生產(chǎn)環(huán)境的多服務(wù)之間的調(diào)用可能如圖所示的場景。
顛覆微服務(wù)認(rèn)知:深入思考微服務(wù)的七個(gè)主流觀點(diǎn)
通常情況下,生產(chǎn)環(huán)境的微服務(wù)生態(tài)比上面的案例復(fù)雜的多,可能存在幾十個(gè)到幾百個(gè)的服務(wù)。那么,對于我們而言,如何系統(tǒng)地梳理服務(wù)之間的依賴關(guān)系和鏈路關(guān)系就顯得非常重要。尤其在大促的時(shí)候,需要對于核心鏈路進(jìn)行強(qiáng)保障,這個(gè)工作就顯得更加重要了。對此,我推薦通過 APM 的流量采集實(shí)現(xiàn)自動化鏈路梳理。

此外,我們在設(shè)計(jì)架構(gòu),每當(dāng)有服務(wù)粒度的劃分問題,例如新項(xiàng)目的創(chuàng)建,或者對于服務(wù)邊界模凌兩可的時(shí)候,我們需要對服務(wù)邊界討論清楚,盡可能讓我們的服務(wù)保持內(nèi)聚性。

三、遷移微服務(wù)能提升系統(tǒng)健壯性嗎?

這里,還有一個(gè)主流的觀點(diǎn):一個(gè)單體系統(tǒng)是一個(gè)大而全的功能集合,如果某個(gè)服務(wù)出現(xiàn)故障,會對整個(gè)業(yè)務(wù)系統(tǒng)產(chǎn)生影響,然而使用微服務(wù)可以實(shí)現(xiàn)如果某個(gè)服務(wù)部署或者宕機(jī),只會影響到當(dāng)前服務(wù),而不會影響到整個(gè)業(yè)務(wù)系統(tǒng)。

事實(shí)上,這個(gè)觀點(diǎn)看起來非常正確,但是在真實(shí)的業(yè)務(wù)場景下,并不是推動我們改造的關(guān)鍵原因。首先,一個(gè)單體為了避免單點(diǎn)故障,肯定需要集群和負(fù)載均衡,注意的是,集群和負(fù)載均衡和微服務(wù)(服務(wù)垂直拆分)不是互斥關(guān)系,而是在高并發(fā)和分布式中的共存關(guān)系。此外,為了解決服務(wù)部署,我們可以考慮通過滾動發(fā)布來實(shí)現(xiàn)服務(wù)的無中斷。所以,單體系統(tǒng)不一定就是不健壯的。同時(shí),引入了微服務(wù)之后,從整體來看,這種方式有造成了存在大量的服務(wù),而服務(wù)之間的相互調(diào)用也會增多,從而導(dǎo)致整個(gè)系統(tǒng)架構(gòu)變得更加復(fù)雜,某個(gè)鏈路上的某個(gè)節(jié)點(diǎn)出現(xiàn)故障的幾率就大大的增加了,更多的依賴也意味著發(fā)生更多問題的可能。此時(shí),假設(shè)其中某條調(diào)用鏈路上某個(gè)微服務(wù)宕機(jī)而無法提供服務(wù),那么對其強(qiáng)依賴的上游服務(wù),如何保障其自身可用性?(我在這里特指強(qiáng)依賴調(diào)用,服務(wù)降級或者熔斷機(jī)制可能會對業(yè)務(wù)有損,并不是解決的有效方案。)因此,很多場景下,某個(gè)服務(wù)宕機(jī)也可能會影響到整個(gè)業(yè)務(wù)系統(tǒng)。

因此,如果我們沒有面向失敗設(shè)計(jì),并且構(gòu)建一套服務(wù)治理的體系,反而會導(dǎo)致整體服務(wù)的不健壯性。

四、遷移微服務(wù)能提升系統(tǒng)的性能嗎?

那么,什么才是遷移微服務(wù)的主要動因了?我覺得最主要的利益動因是服務(wù)的可擴(kuò)展性和提升性能方面的考量。一個(gè)服務(wù)因?yàn)樗拗鳈C(jī)器的限制可能達(dá)到了瓶頸,為了更加進(jìn)一步的壓榨機(jī)器的資源,拆分服務(wù)是一個(gè)好主意。同時(shí),我們還可以進(jìn)一步實(shí)現(xiàn)自動縮擴(kuò)容來調(diào)整機(jī)器的使用。但是,遷移微服務(wù)一定能提升系統(tǒng)的性能嗎?我的觀點(diǎn)是真不一定。服務(wù)化后,調(diào)用鏈路變長,原本的一次 RPC 通信可能變成幾次,性能損耗有所增加。例如,異地多活主要挑戰(zhàn)之一就是網(wǎng)絡(luò)時(shí)延,跨城市一定會有延時(shí)的問題,假設(shè)跨地域網(wǎng)絡(luò)延時(shí)可能在一百毫秒以內(nèi),一次 HTTP 請求涉及到一兩百次跨城市 RPC 調(diào)用,那么整個(gè)響應(yīng)時(shí)間會增加很多,所以延時(shí)帶來的挑戰(zhàn)非常大。那么,阿里為了解決數(shù)據(jù)延遲的問題,最早提出了單元化的解決思路,即將讓請求收斂到同一區(qū)域內(nèi)完成,單元高內(nèi)聚,不做跨區(qū)域訪問,即“單元封閉”。此外,還存在跨服務(wù)調(diào)用的網(wǎng)絡(luò)超時(shí)問題,通過重試也增加了同步阻塞的隱患性。

因此,服務(wù)化是犧牲了服務(wù)之間鏈路上的調(diào)用性能,來整體提高整個(gè)業(yè)務(wù)系統(tǒng)對于機(jī)器資源壓榨來提升系統(tǒng)的性能。

五、微服務(wù)的可用性 =?服務(wù)提供的每次調(diào)用都是可靠且可用的?

對于微服務(wù)的可用性,很多人的理解是,服務(wù)提供的每次調(diào)用都是可靠且可用的。這個(gè)觀點(diǎn)不太對。事實(shí)上,微服務(wù)保證其服務(wù)的整體可用性。通常情況下,如果服務(wù) A 調(diào)用服務(wù) B,如果調(diào)用了 10 秒,那么后面的情況可能就會阻塞,間接地,導(dǎo)致了線程池?fù)伪?,?dǎo)致服務(wù)不可用。因此,我們就會采取超時(shí)機(jī)制來保障極短的時(shí)間內(nèi)完成結(jié)果響應(yīng),盡可能不出現(xiàn)同步阻塞問題。
顛覆微服務(wù)認(rèn)知:深入思考微服務(wù)的七個(gè)主流觀點(diǎn)
此外,如果服務(wù) B 出現(xiàn)故障,所有調(diào)用依賴的服務(wù)都將出現(xiàn)阻塞,如果有大量的請求會導(dǎo)致線程資源會被消耗完畢,導(dǎo)致服務(wù)癱瘓。事實(shí)上,服務(wù)與服務(wù)之間的依賴性會導(dǎo)致級聯(lián)傳播,從而間接導(dǎo)致服務(wù)故障的“雪崩”效應(yīng),造成整個(gè)微服務(wù)系統(tǒng)不可用。為了解決這個(gè)問題,熔斷機(jī)制就有了用武之地。

六、微服務(wù)中數(shù)據(jù)庫是相互獨(dú)立且透明?

微服務(wù)的一個(gè)主流觀點(diǎn)是,在每個(gè)服務(wù)都有自己的緩存和數(shù)據(jù)庫,并且緩存和數(shù)據(jù)庫是相互獨(dú)立且透明的。因此,共享緩存與共享數(shù)據(jù)庫是不對的。那如果服務(wù) A 需要獲取服務(wù) B 的數(shù)據(jù)怎么辦?一般的做法是,服務(wù) B 提供一個(gè)獲取該數(shù)據(jù)的 API 接口,而服務(wù) A 通過調(diào)用該接口進(jìn)行業(yè)務(wù)組裝。因此,微服務(wù)化之后,服務(wù)之間的數(shù)據(jù)交換都是通過接口來開展的,如果服務(wù) A 越過服務(wù) B 的業(yè)務(wù)邏輯之間訪問服務(wù) B 的數(shù)據(jù),其會破壞了微服務(wù)之間的數(shù)據(jù)獨(dú)立性。
顛覆微服務(wù)認(rèn)知:深入思考微服務(wù)的七個(gè)主流觀點(diǎn)
此時(shí),筆者需要潑一下冷水。凡事無絕對,有幾種特殊的場景可能需要共享數(shù)據(jù)。其一,那就是舊的服務(wù)過渡到新的服務(wù)的場景,新的服務(wù)復(fù)用舊的服務(wù)的數(shù)據(jù)庫從而到達(dá)功能與數(shù)據(jù)過渡的需求。其二,多個(gè)服務(wù)之間可能依賴于同一個(gè)數(shù)據(jù)源,例如報(bào)表的數(shù)據(jù)聚合。這種情況下,如果我們單純的依賴于 RPC 的接口調(diào)用很可能會導(dǎo)致偶發(fā)性的調(diào)用超時(shí),從而導(dǎo)致故障發(fā)生的幾率更大。那么,解決這個(gè)問題的常用套路就是共享數(shù)據(jù),要么通過數(shù)據(jù)冗余的方式進(jìn)行數(shù)據(jù)同步,然后基于本地的服務(wù)進(jìn)行邊界內(nèi)的數(shù)據(jù)聚合;要么通過抽離數(shù)倉方案進(jìn)行數(shù)據(jù)的集中化 ETL,然后再對外通過加工好的數(shù)據(jù)。其三,更加現(xiàn)實(shí)的成本問題。事實(shí)上,更多的數(shù)據(jù)庫會帶來更多的經(jīng)費(fèi)成本。很多時(shí)候,我們也會從經(jīng)費(fèi)成本來考慮問題。我們選擇復(fù)用原來的數(shù)據(jù)庫表,等待業(yè)務(wù)價(jià)值明確之后,再考慮單獨(dú)獨(dú)立數(shù)據(jù)庫。

同時(shí),共享數(shù)據(jù)技術(shù)方案可避免數(shù)據(jù)之間的上下文不明確的情況下代價(jià)高昂且重復(fù)的數(shù)據(jù)遷移,并可在需要時(shí)更輕松地調(diào)整服務(wù)粒度,然后在服務(wù)粒度穩(wěn)定之后再進(jìn)行數(shù)據(jù)遷移。因此,我們要在兩者之間尋求適當(dāng)?shù)钠胶?,盡可能遵守微服務(wù)的主流觀點(diǎn),充分利用微服務(wù)帶來的好處。

七、組織保障微服務(wù)的實(shí)施?

微服務(wù)對與組織結(jié)構(gòu)提出了新的要求,它建議將大團(tuán)隊(duì)拆分成為多個(gè)小團(tuán)隊(duì),而每個(gè)團(tuán)隊(duì)各自運(yùn)維開發(fā)和運(yùn)維一個(gè)或多個(gè)服務(wù),并且需要流程上持續(xù)交付、持續(xù)部署、DevOps。
顛覆微服務(wù)認(rèn)知:深入思考微服務(wù)的七個(gè)主流觀點(diǎn)
不同的服務(wù)可能由不同的團(tuán)隊(duì)開發(fā)與維護(hù),實(shí)際場景下,微服務(wù)的便利性更多的在于團(tuán)隊(duì)內(nèi)部能夠產(chǎn)生閉環(huán),換句話說,團(tuán)隊(duì)內(nèi)部可以易于開發(fā)與維護(hù),便于溝通與協(xié)作,但是對于外部團(tuán)隊(duì)就存在很大的溝通成本與協(xié)作成本。如圖所示,團(tuán)隊(duì) A 對于服務(wù) C 的了解是一個(gè)黑盒,我們不知道它是單體服務(wù)還是微服務(wù),它部署了幾臺服務(wù)器,需要依賴哪些下游服務(wù),是否存在限流、熔斷和降級策略,以及如何接入。如果我們需要確認(rèn)這些問題,通常情況下,都需要人工協(xié)作和確認(rèn)。
顛覆微服務(wù)認(rèn)知:深入思考微服務(wù)的七個(gè)主流觀點(diǎn)
當(dāng)然,這個(gè)是組織分工帶來的不可避免的問題,那么我們盡可能保證我們自己團(tuán)隊(duì)內(nèi)部的服務(wù)的內(nèi)聚性,圍繞業(yè)務(wù)模塊進(jìn)行劃分,保證微服務(wù)具有業(yè)務(wù)的獨(dú)立性與完整性,盡可能少的存在服務(wù)依賴,鏈?zhǔn)秸{(diào)用。這里,又拋出了一個(gè)新的問題。微服務(wù)有多“微”?事實(shí)上,對于服務(wù)的拆分并非越小越好,甚至極端的案例是把一塊功能拆分成一個(gè)服務(wù),這種做法是不對的。因此,拆分粒度應(yīng)該保證微服務(wù)具有業(yè)務(wù)的獨(dú)立性與完整性,服務(wù)的拆分圍繞業(yè)務(wù)模塊進(jìn)行拆分。如果單獨(dú)拆分成服務(wù)的業(yè)務(wù)價(jià)值/技術(shù)價(jià)值不明確,那么就讓它耦合在這個(gè)單體系統(tǒng)中,在整個(gè)項(xiàng)目的生命周期里已經(jīng)足夠了。如果隨著業(yè)務(wù)的發(fā)展與需求,我們可以隨著調(diào)整系統(tǒng)源碼層次上模塊結(jié)構(gòu),并將其拆分成獨(dú)立的微服務(wù)。

有的時(shí)候,團(tuán)隊(duì)對項(xiàng)目具有絕對的所有權(quán),從而因?yàn)閳F(tuán)隊(duì)利益上的考慮而出現(xiàn)生產(chǎn)上的微服務(wù)是一個(gè)“半成品”。筆者相信這種情況并非個(gè)例,而是絕大多數(shù)的常態(tài)?,F(xiàn)在,我們來看一個(gè)案例。團(tuán)隊(duì)?A?考慮到功能的復(fù)用性而開發(fā)了一個(gè)“互動組件”,其中包括?“評論模塊”功能。此時(shí),團(tuán)隊(duì)?B?并不知情也開發(fā)了一個(gè)類似的“互動組件”。而團(tuán)隊(duì)?C?也有這個(gè)需求,它知道團(tuán)隊(duì)?A?有這個(gè)“互動組件”,希望可以復(fù)用,但是由于這個(gè)“互動組件”在設(shè)計(jì)的時(shí)候更多地考慮了團(tuán)隊(duì)?A?的當(dāng)前業(yè)務(wù),沒有很好的復(fù)用性,例如不支持“評論蓋樓”功能,而由于團(tuán)隊(duì)?A?出于當(dāng)前其他項(xiàng)目的進(jìn)度原因無法馬上提供支持,團(tuán)隊(duì)?C?評估后決定花一周時(shí)間自己開發(fā)一個(gè)符合自己業(yè)務(wù)需求的“互動組件”。此時(shí),各個(gè)項(xiàng)目團(tuán)隊(duì)各自維護(hù)了一個(gè)“互動組件”。這個(gè)案例中,由于團(tuán)隊(duì)之間的職責(zé)與邊界導(dǎo)致了服務(wù)的復(fù)用存在局限性,甚至造成各自為戰(zhàn)的局面,這種情況一般需要公司層面進(jìn)行規(guī)劃和統(tǒng)籌。無獨(dú)有偶,團(tuán)隊(duì) A 和團(tuán)隊(duì) B 都在做工單系統(tǒng),但是兩者需要融合,為了保證兩個(gè)團(tuán)隊(duì)的既有利益,他們并不是將原來的架構(gòu)打破進(jìn)行融合,而是在原有的基礎(chǔ)上確定領(lǐng)域邊界。

此外,假設(shè)外部一個(gè) RPC 接口不太穩(wěn)定,一般的做法就是去分析不穩(wěn)定的原因,但是跨團(tuán)隊(duì)合作的情況下,外部服務(wù)可能就是一個(gè)黑盒,并且團(tuán)隊(duì)之間可能就是一堵隱形的墻,那么溝通協(xié)作成本是非常大的,此時(shí)需要有人來全鏈路牽頭讓大家的利益達(dá)成一致。那么,當(dāng)下最高效的方式可能就是團(tuán)隊(duì)內(nèi)部通過其他手段來規(guī)避這個(gè)問題,例如冗余緩存或者接口適配。因此,它也許就是當(dāng)前組織結(jié)構(gòu)和環(huán)境下業(yè)務(wù)價(jià)值的最大化的較優(yōu)方案,我們需要適應(yīng)當(dāng)下,展望未來。說到接口適配,其實(shí)還有一個(gè)非常常見的微服務(wù)架構(gòu)設(shè)計(jì):適配器服務(wù)模式。通常情況下,外部服務(wù)給我們的消息體格式和我們所需要的不一致,此時(shí),我們?nèi)ネ苿铀麄兏脑祜@得不太現(xiàn)實(shí),那么,為了保障我們的業(yè)務(wù)邏輯不引入大量的業(yè)務(wù)適配邏輯,我們就會引入適配層 (適配器服務(wù)),它將外部服務(wù)的消息體適配成統(tǒng)一的標(biāo)準(zhǔn)格式,然后再向上暴露服務(wù),例如退款適配、物流適配等。

因此,公司組織在很大程度上影響了服務(wù)邊界的確定。通常情況下,我們在自身團(tuán)隊(duì)的邊界內(nèi)做領(lǐng)域劃分,盡可能的滿足業(yè)務(wù)需求,雖然從技術(shù)層面來看這個(gè)是一個(gè)“半成品”,但是它也許就是當(dāng)前環(huán)境下業(yè)務(wù)價(jià)值的最大化的較優(yōu)方案。所謂分久必合,當(dāng)大家看到它有足夠大的價(jià)值后,在考慮進(jìn)一步融合也是一個(gè)不錯(cuò)的主意。

寫在最后的心聲

最后,我們再來談?wù)勔胄碌募夹g(shù),給項(xiàng)目帶來技術(shù)紅利。一個(gè)新的技術(shù)需要考慮學(xué)習(xí)成本和維護(hù)成本,以及可用性保障和可運(yùn)維性。例如,我在公司在運(yùn)維的護(hù)航下,我可以輕松自如的使用各種技術(shù)等,但是,我不一定敢在另外一個(gè)公司使用?MongoDB,因?yàn)槲抑牢也⒉皇沁@方面的運(yùn)維專家,如果出現(xiàn)問題,我可能沒辦法解決。那么,引入一個(gè)新技術(shù)可能存在的技術(shù)風(fēng)險(xiǎn)。很多時(shí)候,我們要基于失敗設(shè)計(jì),這恰恰是初級工程師和資深工程師之間的差距。例如,Redis 實(shí)現(xiàn)分布式鎖,很多人都只想到來如何通過代碼實(shí)現(xiàn)這套邏輯,但是,如果 Redis 集群中主服務(wù)掛了,直接切換到從服務(wù),因?yàn)槭侵鲝漠惒酵剑植际芥i講究的是一定是最新的鎖數(shù)據(jù)才管用,就是在一瞬間才起作用,這時(shí)候丟了分布式鎖數(shù)據(jù),你的業(yè)務(wù)就會造成重復(fù)請求,而分布式鎖如果應(yīng)用在了業(yè)務(wù)中,必須是非常重要的場景,尤其是金融和支付,所以單點(diǎn)版 Redis?分布式鎖不是好方法,不能使用,如果要用,就得解決穩(wěn)定性問題。(引用《高可用可伸縮微服務(wù)架構(gòu):基于Dubbo、Spring Cloud和Service Mesh》作者「程超」在群里分享的案例,特別精彩。)這里,小小的偏題了下,回到正題,我們會經(jīng)常發(fā)現(xiàn)新項(xiàng)目嘗試使用新技術(shù),而老項(xiàng)目更加保守,因?yàn)榍罢咴囧e(cuò)成本更低。有趣的是,新公司對技術(shù)的發(fā)展更加敏銳,例如很多小公司在云原生方面有諸多實(shí)踐與落地。此時(shí),你可能大概明白了我表述的觀點(diǎn):通常情況下,技術(shù)棧的使用背后是公司的運(yùn)維保障,以及對技術(shù)深度的把控力。所以,我們需要對新技術(shù)有提前的儲備,以備隨時(shí)上戰(zhàn)場,但是絕大多數(shù)情況下,我們要保證利用現(xiàn)有的技術(shù)(工具)實(shí)現(xiàn)業(yè)務(wù)價(jià)值的最大化。

總結(jié)一下,本篇文章沉淀了很多我在工作以來的所見所聞和實(shí)戰(zhàn)思考,核心觀點(diǎn)并不是唱衰微服務(wù),而是讓大家保持獨(dú)立思考,跳出純技術(shù)的視角去思考架構(gòu),去看待微服務(wù),要保證利用現(xiàn)有的技術(shù)(工具)實(shí)現(xiàn)業(yè)務(wù)價(jià)值的最大化。

寫在末尾

【服務(wù)端思維】:我們一起聊聊服務(wù)端核心技術(shù),探討一線互聯(lián)網(wǎng)的項(xiàng)目架構(gòu)與實(shí)戰(zhàn)經(jīng)驗(yàn)。讓所有孤軍奮戰(zhàn)的研發(fā)人員都找到屬于自己的圈子,一起交流、探討。在這里,我們可以認(rèn)知升級,連接頂級的技術(shù)大牛,連接優(yōu)秀的思維方式,連接解決問題的最短路徑,連接一切優(yōu)秀的方法,打破認(rèn)知的局限。
更多精彩文章,盡在「服務(wù)端思維」!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI