欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)邀請(qǐng)碼778899分享:架構(gòu) 微服務(wù)之Dubbo

柚子快報(bào)邀請(qǐng)碼778899分享:架構(gòu) 微服務(wù)之Dubbo

http://yzkb.51969.com/

文章目錄

前言Dubbo的架構(gòu)RPC和HTTP的區(qū)別?各自適合使用的場景?泛化調(diào)用dubbo支持哪些調(diào)用協(xié)議,每個(gè)協(xié)議的特點(diǎn)dubbo的序列化方式dubbo的負(fù)載均衡策略Dubbo的緩存機(jī)制dubbo的異步調(diào)用Dubbo SPIdubbo支持的服務(wù)治理

前言

Dubbo是為了解決公司內(nèi)部服務(wù)之前高效調(diào)用的一種框架,它是采用RPC調(diào)用(提供高效的序列化方式、網(wǎng)絡(luò)基于Netty/Sockket,長連接、內(nèi)網(wǎng)調(diào)用鏈路短、安全、不需要請(qǐng)求頭、拼接Body)。

Dubbo的架構(gòu)

privider:服務(wù)提供者 。在啟動(dòng)的時(shí)候會(huì)將(服務(wù)名稱、版本號(hào)、P地址、媏口號(hào)、協(xié)議、權(quán)重等交給注冊(cè)中心)consumer:服務(wù)消費(fèi)者registry:注冊(cè)中心Monitor:監(jiān)控 (調(diào)用次數(shù)、調(diào)用時(shí)間、響應(yīng)時(shí)間、異常次數(shù)、異常信息等)

RPC和HTTP的區(qū)別?各自適合使用的場景?

RPC和HTTP的區(qū)別

通信方式:

RPC:允許程序調(diào)用另一個(gè)地址空間(通常是另一臺(tái)計(jì)算機(jī)上)的過程或方法,就像調(diào)用本地函數(shù)一樣。RPC隱藏了網(wǎng)絡(luò)通信的復(fù)雜性,提供了透明的遠(yuǎn)程調(diào)用機(jī)制。HTTP:基于請(qǐng)求-響應(yīng)模式,是一種無狀態(tài)的協(xié)議,主要用于Web通信,通過文本格式(如HTML、JSON、XML)傳輸數(shù)據(jù)。 數(shù)據(jù)傳輸效率:

RPC:通常使用二進(jìn)制格式傳輸數(shù)據(jù),減少了數(shù)據(jù)冗余,提高了傳輸效率。同時(shí),支持HTTP/2等高效協(xié)議,具備多路復(fù)用、頭部壓縮等特性。HTTP:使用文本格式傳輸數(shù)據(jù),數(shù)據(jù)冗余較大,傳輸效率相對(duì)較低。雖然HTTP/2也引入了頭部壓縮和多路復(fù)用等特性,但在某些場景下仍不如RPC高效。 接口定義與類型安全:

RPC:使用IDL(接口定義語言)來描述接口,如Protocol Buffers(Protobuf),具有更強(qiáng)的類型安全性和跨語言支持。HTTP:接口定義通常遵循RESTful規(guī)范或使用OpenAPI等描述語言,類型安全性較弱,但跨平臺(tái)、跨語言能力強(qiáng)。 異常處理:

RPC:通常使用自定義的異常處理機(jī)制,可以更細(xì)粒度地處理各種異常情況HTTP:使用HTTP狀態(tài)碼來表示請(qǐng)求的狀態(tài),如200表示成功,404表示資源不存在等。 適用場景:

RPC:主要用于分布式系統(tǒng)內(nèi)部的服務(wù)間調(diào)用,適用于構(gòu)建高性能、低延遲的微服務(wù)架構(gòu)。HTTP:主要用于Web應(yīng)用、API接口、移動(dòng)應(yīng)用、物聯(lián)網(wǎng)和大數(shù)據(jù)等領(lǐng)域的數(shù)據(jù)傳輸,支持跨平臺(tái)、跨語言的交互。 適用場景

使用RPC的場景:

當(dāng)需要構(gòu)建高性能、低延遲的微服務(wù)架構(gòu)時(shí),RPC是更好的選擇。因?yàn)樗峁┝烁咝У倪h(yuǎn)程調(diào)用機(jī)制,減少了數(shù)據(jù)傳輸?shù)娜哂?,提高了通信效率。在分布式系統(tǒng)中,當(dāng)服務(wù)需要頻繁調(diào)用且對(duì)性能要求較高時(shí),RPC能夠提供更好的性能支持。當(dāng)服務(wù)間的接口定義需要更強(qiáng)的類型安全性和跨語言支持時(shí),RPC的IDL機(jī)制能夠滿足這些需求。 使用HTTP的場景:

Web應(yīng)用:HTTP是Web應(yīng)用程序的基石,通過傳輸HTML、CSS、JavaScript等靜態(tài)資源文件和API接口等動(dòng)態(tài)資源文件,提供支撐服務(wù)器響應(yīng)用戶請(qǐng)求的基礎(chǔ)。API接口:在Web應(yīng)用程序中,API接口是連接前端UI和后端數(shù)據(jù)的橋梁。HTTP協(xié)議的接口設(shè)計(jì),可以使不同語言、不同框架的應(yīng)用程序在接口層面得到統(tǒng)一,以方便數(shù)據(jù)的交互與共享。移動(dòng)應(yīng)用:移動(dòng)應(yīng)用通常都需要與服務(wù)器進(jìn)行數(shù)據(jù)交互,HTTP協(xié)議提供了快速、安全、可靠的數(shù)據(jù)傳輸方式。物聯(lián)網(wǎng)和大數(shù)據(jù):在物聯(lián)網(wǎng)應(yīng)用中,傳感器和設(shè)備可以通過HTTP協(xié)議與云服務(wù)器進(jìn)行數(shù)據(jù)交互。在大數(shù)據(jù)應(yīng)用中,HTTP協(xié)議可用于數(shù)據(jù)的傳輸以及分布式計(jì)算結(jié)果的返回。 綜上所述,RPC和HTTP各有優(yōu)缺點(diǎn),適用于不同的場景。在選擇時(shí),需要根據(jù)項(xiàng)目的具體需求、性能要求、開發(fā)成本等因素進(jìn)行綜合考慮。

泛化調(diào)用

Dubbo 是一個(gè)高性能、輕量級(jí)的開源 Java RPC 框架。它提供了三大關(guān)鍵能力:面向接口的遠(yuǎn)程方法調(diào)用、智能負(fù)載均衡以及自動(dòng)服務(wù)注冊(cè)與發(fā)現(xiàn)。在 Dubbo 的使用過程中,泛化調(diào)用是一個(gè)比較特殊且強(qiáng)大的特性,它允許客戶端在不依賴服務(wù)接口定義(即不需要服務(wù)提供方的接口 JAR 包)的情況下,直接通過 Dubbo 框架進(jìn)行遠(yuǎn)程服務(wù)調(diào)用。 泛化調(diào)用的背景

在微服務(wù)架構(gòu)中,服務(wù)間的依賴管理是一個(gè)重要問題。傳統(tǒng)方式下,服務(wù)消費(fèi)者需要依賴服務(wù)提供者的接口定義(通常是通過 Maven 或 Gradle 等構(gòu)建工具引入 JAR 包)。但這種方式存在一些問題,比如:

版本沖突:多個(gè)服務(wù)可能依賴同一服務(wù)的不同版本。依賴管理復(fù)雜:隨著服務(wù)數(shù)量的增加,管理這些依賴會(huì)變得越來越復(fù)雜。部署靈活性受限:服務(wù)的更新和部署可能受到依賴關(guān)系的限制。 泛化調(diào)用提供了一種解決這些問題的方法,它使得服務(wù)消費(fèi)者可以不依賴于具體的服務(wù)接口定義,直接通過 Dubbo 框架的 API 調(diào)用遠(yuǎn)程服務(wù)。 泛化調(diào)用的實(shí)現(xiàn)方式

在 Dubbo 中,泛化調(diào)用通常通過 GenericService 接口來實(shí)現(xiàn)。GenericService 是一個(gè)泛型的接口,它定義了一個(gè) $invoke 方法,該方法接受四個(gè)參數(shù):方法名、方法參數(shù)類型數(shù)組、方法參數(shù)值數(shù)組以及方法返回值類型(對(duì)于沒有返回值的方法,這個(gè)參數(shù)可以為 null)。 泛化調(diào)用的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

解耦:客戶端不需要依賴服務(wù)提供者的接口定義。靈活性:可以動(dòng)態(tài)地調(diào)用遠(yuǎn)程服務(wù)的方法,無需在編譯時(shí)確定。簡化部署:減少了因依賴關(guān)系導(dǎo)致的部署復(fù)雜度。 缺點(diǎn):

類型安全缺失:由于不依賴具體的接口定義,因此無法享受編譯時(shí)類型檢查的好處性能開銷:相對(duì)于直接調(diào)用,泛化調(diào)用可能存在一定的性能開銷。開發(fā)成本:編寫和維護(hù)泛化調(diào)用的代碼可能相對(duì)復(fù)雜和繁瑣。

dubbo支持哪些調(diào)用協(xié)議,每個(gè)協(xié)議的特點(diǎn)

Dubbo協(xié)議

特點(diǎn):

默認(rèn)協(xié)議:Dubbo框架默認(rèn)使用的協(xié)議。單一長連接:基于單一長連接和NIO異步通訊,適合小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用。高效性:在服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況下表現(xiàn)尤為出色。限制:不建議用于傳輸大文件或超大字符串。

RMI協(xié)議

特點(diǎn):

Java標(biāo)準(zhǔn):基于Java RMI(遠(yuǎn)程方法調(diào)用)協(xié)議,通過Java對(duì)象序列化進(jìn)行數(shù)據(jù)傳輸??缙脚_(tái)性:具有較好的跨平臺(tái)性。連接方式:采用阻塞式短連接和JDK標(biāo)準(zhǔn)序列化方式。適用場景:適合消費(fèi)者與提供者個(gè)數(shù)相當(dāng),需要傳輸文件等大數(shù)據(jù)量的場景。

Hessian協(xié)議

特點(diǎn):

Hessian序列化:基于Hessian序列化框架,通過HTTP傳輸數(shù)據(jù)。適用場景:服務(wù)提供者和消費(fèi)者在同一JVM進(jìn)程中的場景,或者需要基于HTTP通信的場景。內(nèi)嵌服務(wù)器:Dubbo缺省內(nèi)嵌Jetty作為服務(wù)器實(shí)現(xiàn)。

HTTP協(xié)議

特點(diǎn):

通用性:基于HTTP協(xié)議進(jìn)行通信,可以通過HTTP客戶端與服務(wù)端進(jìn)行通信。靈活性:支持多種傳輸方式和數(shù)據(jù)格式。適用場景:需同時(shí)給應(yīng)用程序和瀏覽器JS使用的服務(wù)。

WebService協(xié)議

特點(diǎn):

跨語言:基于SOAP規(guī)范的Webservice協(xié)議,通過XML格式進(jìn)行數(shù)據(jù)傳輸,具有良好的跨語言支持。 適用場景:系統(tǒng)集成,跨語言調(diào)用。

Thrift協(xié)議

特點(diǎn):

高性能:基于Apache Thrift框架,使用自定義的二進(jìn)制協(xié)議進(jìn)行數(shù)據(jù)傳輸,具有較好的性能和跨語言支持。擴(kuò)展性:在原生協(xié)議的基礎(chǔ)上添加了一些額外的頭信息,如service name, magic number等。

Memcached協(xié)議

特點(diǎn):

緩存同步:基于Memcached協(xié)議實(shí)現(xiàn)緩存同步,適用于緩存場景下的服務(wù)調(diào)用。

Redis協(xié)議

特點(diǎn):

數(shù)據(jù)存儲(chǔ):基于Redis協(xié)議實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和同步,適用于使用Redis緩存的場景。

Dubbo RESTful協(xié)議

特點(diǎn):

RESTful風(fēng)格:基于Dubbo協(xié)議的RESTful風(fēng)格接口,可以使用HTTP或Websocket進(jìn)行通信。

Dubbo-gRPC

特點(diǎn):

高性能RPC:基于gRPC協(xié)議的Dubbo實(shí)現(xiàn),gRPC是一個(gè)高性能、開源、通用的RPC框架,支持多種編程語言。提升通信性能:通過Dubbo-gRPC,可以實(shí)現(xiàn)基于gRPC協(xié)議的服務(wù)調(diào)用,提高服務(wù)間的通信性能。

Dubbo-MQTT

特點(diǎn):

輕量級(jí)消息傳輸:基于MQTT協(xié)議的Dubbo實(shí)現(xiàn),MQTT是一個(gè)輕量級(jí)的發(fā)布/訂閱消息傳輸協(xié)議,廣泛應(yīng)用于物聯(lián)網(wǎng)領(lǐng)域。適用場景:適用于需要低功耗、低帶寬、高可靠性的場景。 總結(jié) Dubbo支持的調(diào)用協(xié)議多種多樣,每種協(xié)議都有其獨(dú)特的特點(diǎn)和適用場景。在實(shí)際應(yīng)用中,可以根據(jù)服務(wù)的需求和場景選擇合適的協(xié)議進(jìn)行通信。例如,對(duì)于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,可以選擇Dubbo協(xié)議;對(duì)于需要跨語言調(diào)用的場景,可以選擇WebService或Thrift協(xié)議;對(duì)于緩存場景下的服務(wù)調(diào)用,可以選擇Memcached或Redis協(xié)議等。

dubbo的序列化方式

Hessian:

Hessian是Dubbo默認(rèn)的序列化方式。它是一種基于二進(jìn)制的高性能序列化協(xié)議,可以將對(duì)象以二進(jìn)制形式進(jìn)行編碼和解碼,并支持跨語言的數(shù)據(jù)傳輸。Hessian序列化特別適用于Java環(huán)境,但也支持其他語言的實(shí)現(xiàn)。

JSON:

使用JSON進(jìn)行序列化,支持多種語言。JSON序列化具有良好的可讀性和易用性,是Web開發(fā)中常用的數(shù)據(jù)交換格式。Dubbo中可以使用FastJson等庫來實(shí)現(xiàn)JSON序列化。

Java原生序列化:

使用Java默認(rèn)的序列化方式進(jìn)行序列化,僅支持Java語言。這種序列化方式簡單直觀,但可能存在性能瓶頸和安全性問題。

Kryo:

Kryo是一種非常高效的Java序列化框架,速度比Java原生序列化快得多。它支持多種數(shù)據(jù)結(jié)構(gòu)和復(fù)雜對(duì)象的序列化,非常適合需要高性能序列化的場景。

FST:

FST(Fast Serialization Technology)是另一種Java序列化方式,它也具有較高的序列化性能。FST提供了與Java原生序列化相似的接口,但具有更好的性能和更低的內(nèi)存消耗。

Protobuf:

Protobuf(Protocol Buffers)是Google開發(fā)的一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可用于數(shù)據(jù)通信和存儲(chǔ)。Protobuf序列化方式支持多種語言,具有良好的跨平臺(tái)性和可擴(kuò)展性。

Avro:

Avro是一個(gè)由Hadoop項(xiàng)目所發(fā)展的數(shù)據(jù)序列化系統(tǒng),基于二進(jìn)制數(shù)據(jù)格式。 它提供了一種緊湊的、快速的二進(jìn)制數(shù)據(jù)格式,支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),并且具有良好的跨語言支持。

在選擇Dubbo的序列化方式時(shí),需要考慮以下幾個(gè)因素:

性能:不同的序列化方式在性能上有所差異,需要根據(jù)實(shí)際需求選擇適合的序列化方式。兼容性:如果需要與其他語言或系統(tǒng)進(jìn)行數(shù)據(jù)交換,需要選擇具有廣泛支持和高兼容性的序列化方式。安全性:一些序列化方式可能存在安全隱患,需要確保所選的序列化方式符合安全要求。易用性:考慮序列化方式的易用性和維護(hù)成本,選擇易于理解和維護(hù)的序列化方式。

dubbo的負(fù)載均衡策略

隨機(jī)(Random)

描述:隨機(jī)選擇一個(gè)可用的服務(wù)提供者來處理請(qǐng)求。特點(diǎn):

簡單易用:實(shí)現(xiàn)和理解都非常簡單,不需要維護(hù)復(fù)雜的狀態(tài)信息。負(fù)載均衡:在大流量下能夠達(dá)到較好的負(fù)載均衡效果。適用場景:適用于服務(wù)提供者的性能相差不大的場景。

輪詢(Round Robin)

描述:按順序輪流選擇服務(wù)提供者來處理請(qǐng)求。每次請(qǐng)求到達(dá)時(shí),系統(tǒng)選擇下一個(gè)節(jié)點(diǎn),當(dāng)?shù)竭_(dá)列表末尾時(shí)重新從頭開始。特點(diǎn):

公平性:能夠確保每個(gè)服務(wù)節(jié)點(diǎn)被均勻調(diào)用,適用于負(fù)載較為均衡的場景。簡單實(shí)現(xiàn):無需復(fù)雜的狀態(tài)維護(hù),邏輯簡單清晰。適用場景:適用于服務(wù)提供者的性能相近且需要均勻分配請(qǐng)求的場景。

最少活躍調(diào)用數(shù)(Least Active)

描述:選擇當(dāng)前活躍調(diào)用數(shù)(即正在處理請(qǐng)求的線程數(shù))最小的服務(wù)提供者來處理請(qǐng)求。特點(diǎn):

負(fù)載敏感:能夠選擇負(fù)載最輕的服務(wù)提供者,提高系統(tǒng)的整體響應(yīng)速度。高效性:在服務(wù)提供者性能不均的場景下,能有效提高系統(tǒng)處理效率。適用場景:適用于對(duì)系統(tǒng)負(fù)載比較敏感的場景,能夠確保請(qǐng)求被分配給負(fù)載較輕的服務(wù)提供者。

一致性哈希(Consistent Hash)

描述:基于調(diào)用參數(shù)的哈希值來選擇服務(wù)提供者,確保相同參數(shù)的請(qǐng)求始終由同一個(gè)服務(wù)節(jié)點(diǎn)處理。特點(diǎn):

會(huì)話粘性:保證相同參數(shù)的請(qǐng)求由同一個(gè)服務(wù)節(jié)點(diǎn)處理,適用于需要會(huì)話保持的應(yīng)用場景。平滑擴(kuò)展:增加或移除節(jié)點(diǎn)時(shí),影響的請(qǐng)求最少,具有較好的擴(kuò)展性。適用場景:特別適用于需要會(huì)話粘性或數(shù)據(jù)分片的場景,如分布式緩存系統(tǒng)和分布式數(shù)據(jù)庫。

加權(quán)隨機(jī)(WeightedRandom)

描述:根據(jù)服務(wù)提供者的權(quán)重來隨機(jī)選擇服務(wù)提供者。權(quán)重越高的服務(wù)提供者被選中的概率越大。特點(diǎn):

靈活性高:可以根據(jù)服務(wù)提供者的性能差異來設(shè)置不同的權(quán)重,實(shí)現(xiàn)更精細(xì)化的負(fù)載均衡。易于擴(kuò)展:可以方便地添加自定義的權(quán)重計(jì)算邏輯。適用場景:適用于服務(wù)提供者性能差異較大,且需要根據(jù)性能差異來分配請(qǐng)求的場景。

加權(quán)輪詢(WeightedRoundRobin)

描述:按照服務(wù)提供者的權(quán)重進(jìn)行輪詢選擇。權(quán)重越大的服務(wù)提供者被輪詢到的次數(shù)越多。特點(diǎn):

公平性:在加權(quán)的基礎(chǔ)上實(shí)現(xiàn)了請(qǐng)求的均勻分配。高效性:能夠確保高性能的服務(wù)提供者處理更多的請(qǐng)求。適用場景:與加權(quán)隨機(jī)類似,但更適用于需要更公平地分配請(qǐng)求的場景。

Dubbo的緩存機(jī)制

服務(wù)端緩存方式

在服務(wù)端,Dubbo支持通過本地緩存來緩存服務(wù)響應(yīng)結(jié)果。這種緩存方式將服務(wù)響應(yīng)數(shù)據(jù)直接存儲(chǔ)在服務(wù)提供者的內(nèi)存中,以便快速響應(yīng)后續(xù)的相同請(qǐng)求。實(shí)現(xiàn)方式

本地緩存:Dubbo提供了本地緩存的實(shí)現(xiàn)方式,即通過Dubbo的Cache接口或@Cache注解在服務(wù)方法上啟用緩存。當(dāng)服務(wù)方法被調(diào)用時(shí),Dubbo會(huì)檢查緩存中是否存在相應(yīng)的響應(yīng)結(jié)果。如果存在,則直接從緩存中返回結(jié)果,避免重復(fù)的計(jì)算和數(shù)據(jù)庫查詢等操作。配置方式:在服務(wù)提供方的服務(wù)方法上添加@Cache注解,可以啟用本地緩存機(jī)制,并指定緩存的大小、過期時(shí)間等參數(shù)。此外,也可以通過XML配置文件或API配置方式來配置緩存。 優(yōu)點(diǎn)

速度快:由于緩存數(shù)據(jù)存儲(chǔ)在本地內(nèi)存中,因此能夠快速讀取響應(yīng)結(jié)果,減少不必要的計(jì)算和網(wǎng)絡(luò)通信開銷。自適應(yīng):Dubbo的本地緩存會(huì)根據(jù)服務(wù)的調(diào)用頻率和內(nèi)存使用情況等動(dòng)態(tài)調(diào)整緩存的大小,以適應(yīng)不同的場景。 缺點(diǎn)

數(shù)據(jù)一致性:當(dāng)服務(wù)提供方的數(shù)據(jù)發(fā)生變化時(shí),緩存的數(shù)據(jù)可能不是最新的,存在數(shù)據(jù)一致性問題。內(nèi)存開銷:本地緩存對(duì)內(nèi)存的消耗較大,需要合理設(shè)置緩存大小以避免內(nèi)存溢出。

客戶端緩存方式

在客戶端,Dubbo同樣支持緩存服務(wù)調(diào)用的結(jié)果。這種緩存方式將服務(wù)調(diào)用的響應(yīng)結(jié)果緩存在服務(wù)消費(fèi)方的內(nèi)存中,以減少網(wǎng)絡(luò)通信和服務(wù)提供方的負(fù)載。實(shí)現(xiàn)方式

本地緩存:與服務(wù)端類似,客戶端也可以通過本地緩存來實(shí)現(xiàn)服務(wù)調(diào)用結(jié)果的緩存。Dubbo提供了相應(yīng)的配置方式和注解來支持這一功能。分布式緩存:除了本地緩存外,客戶端還可以選擇使用分布式緩存來存儲(chǔ)服務(wù)調(diào)用結(jié)果。分布式緩存將緩存數(shù)據(jù)存儲(chǔ)在獨(dú)立的緩存服務(wù)器上,如Redis、Memcached等,客戶端通過網(wǎng)絡(luò)訪問這些緩存服務(wù)器來獲取緩存數(shù)據(jù)。 優(yōu)點(diǎn)

減少網(wǎng)絡(luò)通信:通過緩存服務(wù)調(diào)用的結(jié)果,可以減少客戶端與服務(wù)端之間的網(wǎng)絡(luò)通信次數(shù),降低網(wǎng)絡(luò)延遲和負(fù)載。提高系統(tǒng)性能:緩存可以減少服務(wù)端的計(jì)算和數(shù)據(jù)庫查詢壓力,提高整個(gè)系統(tǒng)的響應(yīng)速度和性能。 缺點(diǎn)數(shù)據(jù)一致性:與服務(wù)端緩存類似,客戶端緩存也存在數(shù)據(jù)一致性問題。當(dāng)服務(wù)端數(shù)據(jù)發(fā)生變化時(shí),需要確保緩存中的數(shù)據(jù)能夠及時(shí)更新。緩存失效:緩存數(shù)據(jù)需要設(shè)置合理的過期時(shí)間,以避免緩存失效導(dǎo)致的數(shù)據(jù)不一致問題。

dubbo的異步調(diào)用

import org.apache.dubbo.config.annotation.DubboReference;

import org.apache.dubbo.rpc.RpcContext;

import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;

@Component

public class GreetingConsumer {

@DubboReference(async = true) // 注意這里啟用異步

private GreetingService greetingService;

public void asyncSayHello(String name) {

// 使用CompletableFuture來接收異步結(jié)果

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

// 這里實(shí)際上Dubbo會(huì)處理異步邏輯,我們只是將調(diào)用放入CompletableFuture中

return greetingService.sayHello(name);

}, RpcContext.getContext().getCompletableFutureExecutor()); // 使用Dubbo提供的線程池

// 處理異步結(jié)果

future.whenComplete((result, throwable) -> {

if (throwable != null) {

throwable.printStackTrace();

System.out.println("Failed to get response");

} else {

System.out.println("Response: " + result);

}

});

// 注意:這里不會(huì)阻塞,你可以繼續(xù)執(zhí)行其他任務(wù)

System.out.println("Async call sent. Waiting for response...");

// 如果需要,可以在這里執(zhí)行其他任務(wù)

// ...

}

}

Dubbo SPI

Dubbo SPI 的主要特點(diǎn)

自動(dòng)裝配:Dubbo SPI 可以在運(yùn)行時(shí)自動(dòng)加載和裝配服務(wù)實(shí)現(xiàn)。擴(kuò)展點(diǎn)加載:支持通過配置文件或注解來指定擴(kuò)展點(diǎn)的實(shí)現(xiàn)。依賴注入:支持將其他擴(kuò)展點(diǎn)作為依賴注入到當(dāng)前擴(kuò)展點(diǎn)中。自適應(yīng)擴(kuò)展:支持自適應(yīng)擴(kuò)展,即根據(jù) URL 參數(shù)自動(dòng)選擇最合適的擴(kuò)展實(shí)現(xiàn)。

Dubbo SPI 的實(shí)現(xiàn)原理 Dubbo SPI 的實(shí)現(xiàn)主要依賴于以下幾個(gè)關(guān)鍵組件:

ExtensionLoader:這是 Dubbo SPI 的核心類,負(fù)責(zé)加載和管理擴(kuò)展點(diǎn)。它提供了加載擴(kuò)展點(diǎn)、獲取擴(kuò)展點(diǎn)實(shí)現(xiàn)、創(chuàng)建自適應(yīng)擴(kuò)展等功能。META-INF/dubbo/ 目錄下的配置文件:Dubbo 通過掃描這個(gè)目錄下的配置文件來發(fā)現(xiàn)擴(kuò)展點(diǎn)及其實(shí)現(xiàn)。配置文件通常以擴(kuò)展點(diǎn)的全限定名命名,內(nèi)容則是該擴(kuò)展點(diǎn)實(shí)現(xiàn)的鍵值對(duì)。@SPI 注解:Dubbo 允許通過 @SPI 注解來定義擴(kuò)展點(diǎn),但這不是必須的,因?yàn)橐部梢酝ㄟ^配置文件來定義擴(kuò)展點(diǎn)。@Adaptive 注解:用于標(biāo)記自適應(yīng)擴(kuò)展實(shí)現(xiàn)。Dubbo 會(huì)根據(jù)這個(gè)注解來生成自適應(yīng)擴(kuò)展類的字節(jié)碼。

示例 假設(shè)我們有一個(gè)擴(kuò)展點(diǎn)接口 Protocol,我們想要通過 Dubbo SPI 機(jī)制來加載它的不同實(shí)現(xiàn)。

定義擴(kuò)展點(diǎn)接口:

@SPI("dubbo")

public interface Animal {

void eat();

}

這里使用 @SPI(“dubbo”) 注解來定義擴(kuò)展點(diǎn),并指定了默認(rèn)的擴(kuò)展實(shí)現(xiàn)是 dubbo。

實(shí)現(xiàn)擴(kuò)展點(diǎn)

public class DogAnimal implements Animal {

// 實(shí)現(xiàn)方法...

}

public class PigAnimal implements Animal {

// 實(shí)現(xiàn)方法...

}

配置擴(kuò)展實(shí)現(xiàn) 在 META-INF/dubbo/org.apache.dubbo.rpc.Protocol 文件中配置擴(kuò)展實(shí)現(xiàn):

dog=com.tiechui.dubbo.rpc.Animal.DogAnimal

pig=com.tiechui.dubbo.rpc.Animal.PigAnimal

加載和使用擴(kuò)展

ExtensionLoader loader = ExtensionLoader.getExtensionLoader(Animal.class);

Animal animal = loader.getExtension("dubbo");

// 使用 Animal 對(duì)象...

dubbo支持的服務(wù)治理

服務(wù)注冊(cè)與發(fā)現(xiàn): 管理服務(wù)的注冊(cè)與動(dòng)態(tài)發(fā)現(xiàn)。服務(wù)提供者啟動(dòng)時(shí)向注冊(cè)中心注冊(cè)自己的服務(wù),服務(wù)消費(fèi)者啟動(dòng)時(shí)向注冊(cè)中心訂閱所需的服務(wù)。注冊(cè)中心會(huì)實(shí)時(shí)推送服務(wù)地址列表給消費(fèi)者,并在有變更時(shí)更新信息。負(fù)載均衡: 在多個(gè)服務(wù)提供者之間進(jìn)行負(fù)載均衡,以提高系統(tǒng)的性能和資源利用率。Dubbo支持多種負(fù)載均衡算法,如輪詢、加權(quán)輪詢、最小連接數(shù)和加權(quán)最小連接數(shù)等。故障轉(zhuǎn)移: 在服務(wù)調(diào)用失敗時(shí),提供故障轉(zhuǎn)移機(jī)制,以保障系統(tǒng)的可用性。Dubbo內(nèi)置了多種容錯(cuò)機(jī)制,如Failover(失敗自動(dòng)切換)、Failfast(快速失敗)、Failsafe(失敗安全)、Failback(失敗自動(dòng)恢復(fù))等,可以根據(jù)需要選擇合適的容錯(cuò)策略。服務(wù)監(jiān)控: 監(jiān)控服務(wù)調(diào)用次數(shù)、調(diào)用時(shí)間等信息,幫助開發(fā)者了解服務(wù)的運(yùn)行狀況。Dubbo提供了監(jiān)控和治理控制臺(tái),可以實(shí)時(shí)監(jiān)控服務(wù)的運(yùn)行狀態(tài)和性能指標(biāo)。路由規(guī)則: 根據(jù)規(guī)則路由調(diào)用請(qǐng)求到指定服務(wù)。Dubbo支持靈活的路由規(guī)則配置,可以根據(jù)服務(wù)提供者的狀態(tài)和性能選擇合適的調(diào)用路徑,優(yōu)化服務(wù)調(diào)用的效率和響應(yīng)時(shí)間。配置管理: 動(dòng)態(tài)配置服務(wù)參數(shù),實(shí)現(xiàn)配置的動(dòng)態(tài)更新和版本控制。開發(fā)者可以通過Dubbo的配置中心對(duì)服務(wù)的參數(shù)進(jìn)行動(dòng)態(tài)調(diào)整,而無需重啟服務(wù)。服務(wù)降級(jí): 在服務(wù)不可用或性能下降時(shí),提供備用方案,保障核心業(yè)務(wù)的正常運(yùn)行。服務(wù)降級(jí)是一種在極端情況下保護(hù)系統(tǒng)穩(wěn)定性的重要手段。動(dòng)態(tài)配置與治理: Dubbo支持動(dòng)態(tài)配置管理,允許在運(yùn)行時(shí)動(dòng)態(tài)調(diào)整服務(wù)的參數(shù)、權(quán)重、路由規(guī)則等,以適應(yīng)不同的業(yè)務(wù)場景和需求。支持多種注冊(cè)中心: Dubbo支持多種注冊(cè)中心,如ZooKeeper、Consul、Nacos等,開發(fā)者可以根據(jù)自己的需求選擇合適的注冊(cè)中心進(jìn)行服務(wù)注冊(cè)和發(fā)現(xiàn)。支持微服務(wù)架構(gòu): Dubbo廣泛應(yīng)用于微服務(wù)架構(gòu)中,通過其服務(wù)治理功能幫助開發(fā)者快速構(gòu)建和管理分布式應(yīng)用。

柚子快報(bào)邀請(qǐng)碼778899分享:架構(gòu) 微服務(wù)之Dubbo

http://yzkb.51969.com/

文章來源

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19612832.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄