本篇文章給大家談?wù)刣ubbo負(fù)載均衡配置,以及nginx負(fù)載均衡怎么配置對應(yīng)的知識點(diǎn),文章可能有點(diǎn)長,但是希望大家可以閱讀完,增長自己的知識,最重要的是希望對各位有所幫助,可以解決了您的問題,不要忘了收藏本站喔。
dubbo是用來做什么的
"dubbo是用來進(jìn)行分布式服務(wù)治理的。
"1.Dubbo是阿里巴巴提供的基于Java的高性能RPC分布式服務(wù)框架。
它可以良好的支持各種RPC協(xié)議和各種序列化機(jī)制,是在大規(guī)模分布式環(huán)境中提供有效的服務(wù)治理方案的理想選擇。
2.通過Dubbo,可以進(jìn)行服務(wù)注冊與發(fā)現(xiàn)、服務(wù)治理、負(fù)載均衡、容錯、并發(fā)控制、服務(wù)路由和可視化等服務(wù)間通訊和治理方案的實(shí)現(xiàn)。
同時,它也具備高可靠、高效能、易于擴(kuò)展和集成等特點(diǎn),被廣泛應(yīng)用于互聯(lián)網(wǎng)、物聯(lián)網(wǎng)、金融等領(lǐng)域,可以方便有效的解決大型分布式應(yīng)用系統(tǒng)所面臨的復(fù)雜性問題。
dubbo負(fù)載均衡原理
Remoting:網(wǎng)絡(luò)通信框架,實(shí)現(xiàn)了sync-over-async和request-response消息機(jī)制。
RPC:一個遠(yuǎn)程過程調(diào)用的抽象,支持負(fù)載均衡、容災(zāi)和集群功能。
Registry:服務(wù)目錄框架用于服務(wù)的注冊和服務(wù)事件發(fā)布和訂閱。(類似第一篇文章中的點(diǎn)菜寶)
dubbo架構(gòu)
Provider:暴露服務(wù)的提供方。
Consumer:調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
Registry:服務(wù)注冊中心和發(fā)現(xiàn)中心。
Monitor:統(tǒng)計服務(wù)和調(diào)用次數(shù),調(diào)用時間監(jiān)控中心。(dubbo的控制臺頁面中可以顯示)
Container:服務(wù)運(yùn)行的容器。
調(diào)用關(guān)系:
0、服務(wù)器負(fù)責(zé)啟動,加載,運(yùn)行提供者(例如在tomcat容器中,啟動dubbo服務(wù)端)。
1、提供者在啟動時,向注冊中心注冊自己提供的服務(wù)。
2、消費(fèi)者啟動時,向注冊中心訂閱自己所需的服務(wù)。
3、注冊中心返回提供者地址列表給消費(fèi)者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者。
4、消費(fèi)者,從遠(yuǎn)程接口列表中,調(diào)用遠(yuǎn)程接口,dubbo會基于負(fù)載均衡算法,選一臺提供者進(jìn)行調(diào)用,如果調(diào)用失敗則選擇另一臺。
5、消費(fèi)者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。(可以在dubbo的可視化界面看到)
dubbo的容錯方案
當(dāng)我們的系統(tǒng)中用到Dubbo的集群環(huán)境,因?yàn)楦鞣N原因在集群調(diào)用失敗時,Dubbo提供了多種容錯方案,缺省為failover重試。
Dubbo的集群容錯在這里想說說他是因?yàn)槲覀儗?shí)際的項(xiàng)目中出現(xiàn)了此類的問題,因?yàn)橐蕾嚨牡谌巾?xiàng)目出現(xiàn)異常,導(dǎo)致dubbo調(diào)用超時,此時使用的是默認(rèn)的集群容錯方式,而配置的reties='3',這樣前段系統(tǒng)連續(xù)掉用了三次服務(wù),結(jié)果可想而知.
先說一下各節(jié)點(diǎn)關(guān)系:
這里的Invoker是Provider的一個可調(diào)用Service的抽象,Invoker封裝了Provider地址及Service接口信息。
Directory代表多個Invoker,可以把它看成List<Invoker>,但與List不同的是,它的值可能是動態(tài)變化的,比如注冊中心推送變更。
Cluster將Directory中的多個Invoker偽裝成一個Invoker,對上層透明,偽裝過程包含了容錯邏輯,調(diào)用失敗后,重試另一個。
Router負(fù)責(zé)從多個Invoker中按路由規(guī)則選出子集,比如讀寫分離,應(yīng)用隔離等。
LoadBalance負(fù)責(zé)從多個Invoker中選出具體的一個用于本次調(diào)用,選的過程包含了負(fù)載均衡算法,調(diào)用失敗后,需要重選。
集群容錯模式:
FailoverCluster
失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。(缺省)
通常用于讀操作,但重試會帶來更長延遲。
可通過retries="2"來設(shè)置重試次數(shù)(不含第一次)。正是文章剛開始說的那種情況.
FailfastCluster
快速失敗,只發(fā)起一次調(diào)用,失敗立即報錯。
通常用于非冪等性的寫操作,比如新增記錄。
FailsafeCluster
失敗安全,出現(xiàn)異常時,直接忽略。
通常用于寫入審計日志等操作。
FailbackCluster
失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。
通常用于消息通知操作。
ForkingCluster
并行調(diào)用多個服務(wù)器,只要一個成功即返回。
通常用于實(shí)時性要求較高的讀操作,但需要浪費(fèi)更多服務(wù)資源。
可通過forks="2"來設(shè)置最大并行數(shù)。
BroadcastCluster
廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報錯則報錯。(2.1.0開始支持)
通常用于通知所有提供者更新緩存或日志等本地資源信息。
重試次數(shù)配置如:(failover集群模式生效)
<dubbo:serviceretries="2"/>
或:<dubbo:referenceretries="2"/>
或:<dubbo:reference>
<dubbo:methodname="findFoo"retries="2"/>
</dubbo:reference>
集群模式配置如:
<dubbo:servicecluster="failsafe"/>
或:<dubbo:referencecluster="failsafe"/>
dubbo負(fù)載均衡策略:
在集群負(fù)載均衡時,Dubbo提供了多種均衡策略,缺省為random隨機(jī)調(diào)用。
RandomLoadBalance
隨機(jī),按權(quán)重設(shè)置隨機(jī)概率。
在一個截面上碰撞的概率高,但調(diào)用量越大分布越均勻,而且按概率使用權(quán)重后也比較均勻,有利于動態(tài)調(diào)整提供者權(quán)重。
RoundRobinLoadBalance
輪循,按公約后的權(quán)重設(shè)置輪循比率。
存在慢的提供者累積請求問題,比如:第二臺機(jī)器很慢,但沒掛,當(dāng)請求調(diào)到第二臺時就卡在那,久而久之,所有請求都卡在調(diào)到第二臺上。
LeastActiveLoadBalance
最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機(jī),活躍數(shù)指調(diào)用前后計數(shù)差。
使慢的提供者收到更少請求,因?yàn)樵铰奶峁┱叩恼{(diào)用前后計數(shù)差會越大。
ConsistentHashLoadBalance
一致性Hash,相同參數(shù)的請求總是發(fā)到同一提供者。
當(dāng)某一臺提供者掛時,原本發(fā)往該提供者的請求,基于虛擬節(jié)點(diǎn),平攤到其它提供者,不會引起劇烈變動。
Dubbo的集群容錯和負(fù)載均衡同樣也是Dubbo本身的高級特性.正如我們在說自定義擴(kuò)展的時候一樣,這兩個特征同樣也可以進(jìn)行自定義擴(kuò)展,用戶可以根據(jù)自己實(shí)際的需求來擴(kuò)展他們從而滿足項(xiàng)目的實(shí)際需求.
dubbo負(fù)載均衡是如何實(shí)現(xiàn)的
負(fù)載均衡通俗來講就是一個選擇的問題,在集群環(huán)境中,不可能每次都讓一個服務(wù)器都來處理所有的請求,當(dāng)消費(fèi)者調(diào)用服務(wù)時,客戶端會選擇,也必須選擇一個服務(wù)器來進(jìn)行處理,考慮各服務(wù)器的負(fù)載,來進(jìn)行分壓,避免單個服務(wù)器響應(yīng)同一請求,容易造成服務(wù)器宕機(jī)、崩潰等問題。
dubbo的負(fù)載均衡主要是向外暴露的一個接口:loadBalance,位于dubbo的cluster包下,可見該接口是專門用于管理集群的,方法中也只存在一個方法:
通過select方法,從眾多的Invoker(dubbo封裝的類,代表客戶端的調(diào)用者)選擇出一個調(diào)用者,URL就是調(diào)用者發(fā)起的URL請求鏈接,從這個URL中可以獲取很多請求的具體信息,Invocation表示的是調(diào)用的具體過程。
同時dubbo實(shí)現(xiàn)了一個抽象類AbstractLoadBlance,實(shí)現(xiàn)接口LoadBalance,而該抽象類AbstractLoadBalance的各個子類,便實(shí)現(xiàn)了dubbo的負(fù)載均衡策略。
在抽象類AbstractLoadBalance中,實(shí)現(xiàn)了接口LoadBalance的select方法:
在方法中實(shí)現(xiàn)了調(diào)用者的判斷,如非空、單一服務(wù),通過后調(diào)用真正的doSelect方法,從而獲取服務(wù)。
而doSelect方法是一個抽象方法,意味著具體的策略均由繼承該抽象類的子類來實(shí)現(xiàn),該父類在select中只進(jìn)行服務(wù)者的校驗(yàn)。
另外,在AbstractLoadBalance中,實(shí)現(xiàn)了getWeight方法,顧名思義,該方法用于獲取服務(wù)的權(quán)重:
首先通過調(diào)用者的URL(URL為Invoker實(shí)體中的一個屬性,同樣由dubbo封裝而成)獲取基本的權(quán)重,如果權(quán)重大于0,會獲取服務(wù)啟動時間,再用當(dāng)前的時間-啟動時間就是服務(wù)到目前為止運(yùn)行了多久,因此這個upTime就可以理解為服務(wù)啟動時間,再獲取配置的預(yù)熱時間,如果啟動時間小于預(yù)熱時間,就會再次調(diào)用獲取權(quán)重。這個預(yù)熱的方法其實(shí)dubbo針對JVM做出的一個很契合的優(yōu)化,因?yàn)镴VM從啟動到起來都運(yùn)行到最佳狀態(tài)是需要一點(diǎn)時間的,這個時間叫做warmup,而dubbo就會對這個時間進(jìn)行設(shè)定,然后等到服務(wù)運(yùn)行時間和warmup相等時再計算權(quán)重,這樣就可以保障服務(wù)的最佳運(yùn)行狀態(tài)!
具體負(fù)債均衡策略再看下這個圖,dubbo實(shí)現(xiàn)了4種負(fù)載均衡策略,分別是:
RandomLoadBalance(隨機(jī)調(diào)用);
RoundRobinLoadBlance(輪詢調(diào)用);
LeastActiveLoadBlance(最少活躍數(shù)調(diào)用);
ConsistentHashLoadBalance(一致性Hash算法);
這里就只說一下dubbo的默認(rèn)負(fù)載均衡策略RandomLoadBalance,也就是隨機(jī)調(diào)用。
為什么說該策略是dubbo的默認(rèn)策略呢。這里我們就得回到LoadBalance接口的源碼上看了。
LoadBalance接口同時擁有一個@SPI的注解,該注解標(biāo)注了dubbo的默認(rèn)策略為RandomLoadBalance:
@SPI(RandomLoadBalance.class)publicinterfaceLoadBalance{//...}RandomLoadBalance(隨機(jī)調(diào)用)基于AbstractLoadBalance抽象類,該策略子類重寫了父類的doSelect方法,在方法中,會首先遍歷每個提供服務(wù)的機(jī)器,通過父類的getWeight方法,獲取每個服務(wù)的權(quán)重,然后累加權(quán)重值,判斷每個服務(wù)的提供者權(quán)重是否相同。
如果每個調(diào)用者的權(quán)重不相同,并且每個權(quán)重大于0,那么就會根據(jù)權(quán)重的總值生成一個隨機(jī)數(shù),再用這個隨機(jī)數(shù),根據(jù)調(diào)用者的數(shù)量每次減去調(diào)用者的權(quán)重,直到計算出當(dāng)前的服務(wù)提供者隨機(jī)數(shù)小于0,就選擇那個提供者。
另外,如果每個機(jī)器的權(quán)重的都相同,那么權(quán)重就不會參與計算,直接選擇隨機(jī)算法生成的某一個選擇,完全隨機(jī)。源碼:
如果說在業(yè)務(wù)場景中,不希望使用該策略,也可以通過注解@Reference來指定使用dubbo的哪一個負(fù)載均衡策略:
@Reference(loadbalance="roundrobin")
其中“roundrobin”為實(shí)現(xiàn)子類中的常量NAME,便可以指定使用策略RoundRobinLoadBlance(輪詢調(diào)用)。
基于篇幅就不再一一介紹另外幾個策略,有興趣的可以看dubbo源碼,一起進(jìn)步~
(歡迎關(guān)注頭條號【居家程序員】,在努力的思考怎么讓題目與內(nèi)容不相符中)
——沒事待在家里不出門的居家程序員。(我不想脫發(fā)!)dubbo性能高嗎
dubbo性能高的。
ApacheDubbo(incubating)|?d?b??|是一款高性能、輕量級的開源JavaRPC框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯和負(fù)載均衡,以及服務(wù)自動注冊和發(fā)現(xiàn)。
Dubbo是一個分布式服務(wù)框架,致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案、服務(wù)治理方案。
什么是負(fù)載均衡,為何要做負(fù)載均衡
一、什么是負(fù)載均衡
當(dāng)單個節(jié)點(diǎn)的服務(wù),無法支持當(dāng)前的大量請求時,我們會部署多個節(jié)點(diǎn),即所謂的集群,此時要使每個節(jié)點(diǎn)收到的請求均勻的算法,這個策略就是所謂的負(fù)載均衡了。
負(fù)載均衡
常見的負(fù)載均衡算法,有權(quán)重隨機(jī)、Hash、輪詢。
1.權(quán)重隨機(jī)
這個是最簡單,也是最常用的負(fù)載均衡算法,即每個請求過來,會隨機(jī)到任何一個服務(wù)節(jié)點(diǎn)上,主流的rpc框架Dubbo,默認(rèn)使用基于權(quán)重隨機(jī)算法。
2.Hash
可以將客服端即請求端的ip,通過hash計算,得到一個數(shù)值,再取服務(wù)節(jié)點(diǎn)數(shù)的模,分配到對應(yīng)的服務(wù)節(jié)點(diǎn)上。
3.輪詢
將請求按照順序,依次分配到節(jié)點(diǎn)1、節(jié)點(diǎn)2、節(jié)點(diǎn)3等節(jié)點(diǎn)上,如此循環(huán)往復(fù)。
二、為什么要做負(fù)載均衡想想如果沒有負(fù)載均衡算法,我們的請求有可能都打到同一節(jié)點(diǎn)上,有可能將這個節(jié)點(diǎn)給打死,而其他節(jié)點(diǎn)的機(jī)器閑置著沒有提供服務(wù),浪費(fèi)資源。所以這就是負(fù)載均衡算法存在的意義了,可以將請求合理分發(fā)到各個節(jié)點(diǎn),實(shí)現(xiàn)真正意義上多個節(jié)點(diǎn)提供服務(wù)的效果。
dubbo調(diào)用耗時如何優(yōu)化
Dubbo是一個高性能、輕量級的分布式服務(wù)框架,但是在調(diào)用過程中,如果涉及到復(fù)雜的業(yè)務(wù)邏輯或者遠(yuǎn)程調(diào)用,可能會產(chǎn)生較高的耗時。以下是一些優(yōu)化Dubbo調(diào)用耗時的建議:
1.拆分服務(wù):將復(fù)雜的服務(wù)拆分成更小的服務(wù),這樣可以減少單個服務(wù)的調(diào)用耗時,提高服務(wù)性能。
2.調(diào)整Dubbo參數(shù):可以通過調(diào)整Dubbo的參數(shù)來優(yōu)化性能。例如,可以增加線程池大小、調(diào)整超時時間等。
3.優(yōu)化網(wǎng)絡(luò):Dubbo調(diào)用過程中,網(wǎng)絡(luò)延遲是一個重要的因素。可以通過優(yōu)化網(wǎng)絡(luò)結(jié)構(gòu)、使用高速網(wǎng)絡(luò)設(shè)備、采用壓縮算法等方式來降低網(wǎng)絡(luò)延遲。
4.緩存數(shù)據(jù):對于一些頻繁調(diào)用的服務(wù),可以考慮使用緩存來減少遠(yuǎn)程調(diào)用次數(shù)。可以使用本地緩存或者分布式緩存來緩存數(shù)據(jù)。
5.異步調(diào)用:對于一些耗時的服務(wù)調(diào)用,可以采用異步調(diào)用的方式,避免阻塞主線程。可以使用異步回調(diào)、Future等方式實(shí)現(xiàn)異步調(diào)用。
6.批量調(diào)用:對于一些連續(xù)的調(diào)用,可以考慮批量調(diào)用,減少網(wǎng)絡(luò)交互次數(shù)。可以通過批量參數(shù)、批量結(jié)果等方式實(shí)現(xiàn)批量調(diào)用。
7.序列化優(yōu)化:Dubbo支持多種序列化協(xié)議,如Hessian2、Kryo、FST等。可以根據(jù)實(shí)際情況選擇合適的序列化協(xié)議來優(yōu)化序列化性能。
8.消除不必要的數(shù)據(jù)同步:在分布式系統(tǒng)中,數(shù)據(jù)同步是一個重要的安全措施。但是,過度的數(shù)據(jù)同步可能會增加Dubbo調(diào)用的耗時。可以通過減少數(shù)據(jù)同步的頻率、使用異步同步等方式來優(yōu)化性能。
9.使用負(fù)載均衡:Dubbo支持多種負(fù)載均衡策略,如隨機(jī)、輪詢、最少活躍調(diào)用等。可以根據(jù)實(shí)際情況選擇合適的負(fù)載均衡策略來平衡服務(wù)器的負(fù)載,提高Dubbo調(diào)用的性能。
總之,優(yōu)化Dubbo調(diào)用耗時需要根據(jù)實(shí)際情況進(jìn)行綜合考慮,可以從服務(wù)設(shè)計、網(wǎng)絡(luò)優(yōu)化、參數(shù)調(diào)整、緩存等方面入手,選擇合適的優(yōu)化措施來提高Dubbo調(diào)用的性能。
OK,關(guān)于dubbo負(fù)載均衡配置和nginx負(fù)載均衡怎么配置的內(nèi)容到此結(jié)束了,希望對大家有所幫助。