2.3 用上分布式、微服務(wù)技術(shù)系統(tǒng)拓展性就強(qiáng)?


? ? ? 微服務(wù),也被稱為微服務(wù)架構(gòu),是一種構(gòu)建應(yīng)用程序的方法。在這種架構(gòu)中,一個(gè)大型應(yīng)用被分解成許多獨(dú)立的、較小的服務(wù),這些服務(wù)都運(yùn)行在自己的進(jìn)程中,并且通過(guò)某種輕量級(jí)的機(jī)制(通常是 HTTP REST API或者消息隊(duì)列)進(jìn)行通信。每個(gè)服務(wù)通常都是圍繞著特定的業(yè)務(wù)能力構(gòu)建的,它們可以獨(dú)立部署和擴(kuò)展。
微服務(wù)架構(gòu)的主要優(yōu)點(diǎn)包括:
敏捷性
? ? 因?yàn)槊總€(gè)服務(wù)都是獨(dú)立部署的,所以團(tuán)隊(duì)可以更快速地開(kāi)發(fā)和迭代服務(wù),而不必等待整個(gè)應(yīng)用的部署周期。
擴(kuò)展性
? ?如果某個(gè)服務(wù)需要更多的資源,你可以單獨(dú)擴(kuò)展那個(gè)服務(wù),而不是整個(gè)應(yīng)用。
容錯(cuò)性
? ? 如果一個(gè)服務(wù)出現(xiàn)故障,它不會(huì)直接影響到其他服務(wù)。這使得微服務(wù)架構(gòu)的應(yīng)用更加穩(wěn)定,故障影響范圍更小。
技術(shù)多樣性
? 不同的服務(wù)可以使用不同的技術(shù)棧,這給了開(kāi)發(fā)團(tuán)隊(duì)更大的靈活性。
? 然而,也是由于這些優(yōu)勢(shì)導(dǎo)致微服務(wù)技術(shù)被濫用,尤其是服務(wù)模塊劃分是一個(gè)具有挑戰(zhàn)性的事情。微服務(wù)劃分過(guò)度可能帶來(lái)的問(wèn)題包括:
? ?過(guò)度復(fù)雜性
? ?每個(gè)服務(wù)都需要處理網(wǎng)絡(luò)通信、數(shù)據(jù)一致性、服務(wù)發(fā)現(xiàn)和故障恢復(fù)等問(wèn)題,因此隨著服務(wù)數(shù)量的增加,系統(tǒng)的復(fù)雜性會(huì)大幅度提升。
高網(wǎng)絡(luò)開(kāi)銷
? ? 如果服務(wù)劃分過(guò)細(xì),那么可能會(huì)導(dǎo)致大量的跨服務(wù)通信,這可能會(huì)增加網(wǎng)絡(luò)開(kāi)銷,并可能導(dǎo)致性能問(wèn)題。
數(shù)據(jù)一致性問(wèn)題
? ?微服務(wù)中的每個(gè)服務(wù)都應(yīng)該擁有自己的數(shù)據(jù)庫(kù),以確保服務(wù)的獨(dú)立性。然而,如果服務(wù)劃分過(guò)細(xì),那么處理跨服務(wù)的數(shù)據(jù)一致性就會(huì)變得非常困難。
團(tuán)隊(duì)溝通成本增加
? ?隨著服務(wù)數(shù)量的增加,團(tuán)隊(duì)成員需要理解和跟蹤的服務(wù)和交互也會(huì)增加,這可能會(huì)增加溝通的成本和復(fù)雜性。
? ? 因此,在劃分微服務(wù)時(shí),需要考慮到這些可能的問(wèn)題,避免過(guò)度劃分服務(wù)。合理的服務(wù)劃分應(yīng)該根據(jù)實(shí)際的業(yè)務(wù)需求、團(tuán)隊(duì)結(jié)構(gòu)和技術(shù)能力等因素進(jìn)行,而不應(yīng)該單純地追求服務(wù)的數(shù)量和獨(dú)立性。
? ? 如何劃分服務(wù),其實(shí)追究到最后還是考驗(yàn)的架構(gòu)設(shè)計(jì)上的單一責(zé)任原則的理解問(wèn)題,假如一個(gè)類的職責(zé)都訂閱不清楚,一個(gè)函數(shù)的功能職責(zé)都是模糊的,那么微服務(wù)層面就將更加的混亂。面向?qū)ο笤O(shè)計(jì)的面向?qū)ο笤O(shè)計(jì)的五個(gè)基本原則,其實(shí)就已經(jīng)把相關(guān)的規(guī)范給我們講清楚了,但是少有人能夠?qū)⑵漕I(lǐng)悟。
五個(gè)基本原則(SOLID):
單一職責(zé)原則(Single Responsibility Principle, SRP):一個(gè)類應(yīng)該只有一個(gè)改變的原因。
開(kāi)放封閉原則(Open-Closed Principle, OCP):軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉。
里氏替換原則(Liskov Substitution Principle, LSP):子類型必須能夠替換掉它們的基類型。
接口隔離原則(Interface Segregation Principle, ISP):客戶端不應(yīng)該依賴于它們不使用的接口。
依賴倒置原則(Dependency Inversion Principle, DIP):高層模塊不應(yīng)該依賴低層模塊,它們都應(yīng)該依賴于抽象。
總結(jié)
? ? 微服務(wù)的技術(shù)是很容易被引入的,這也導(dǎo)致大家更注重技術(shù)本身而忽悠業(yè)務(wù)。其實(shí)作為一個(gè)軟件系統(tǒng),業(yè)務(wù)才是核心,而業(yè)務(wù)通常是易變的,我們通過(guò)引入一項(xiàng)技術(shù)后,如果不能讓業(yè)務(wù)可以更加靈活的應(yīng)對(duì)需求,而只是解決部分技術(shù)問(wèn)題,那這是失敗的,因?yàn)檫@樣的做法會(huì)讓業(yè)務(wù)更加的被腐蝕,讓業(yè)務(wù)與技術(shù)相互糾纏再在一起,這就導(dǎo)致業(yè)務(wù)無(wú)法聚焦、無(wú)法被復(fù)用。?
? ? 我一直推崇的架構(gòu)設(shè)計(jì)就是要把業(yè)務(wù)與技術(shù)分離,做到技術(shù)可任意更換,可任意升級(jí),而業(yè)務(wù)則可以不斷的沉淀與優(yōu)化。