新聞中心
Dubbo是一個(gè)高性能的開源RPC框架,它的出現(xiàn)極大地簡(jiǎn)化了服務(wù)之間的調(diào)用。而在使用Dubbo時(shí),我們有時(shí)會(huì)遇到啟動(dòng)報(bào)錯(cuò)的問題,這篇文章將為大家介紹在Linux下啟動(dòng)Dubbo時(shí)遇到的一些常見的報(bào)錯(cuò)及解決方案。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供科爾沁左翼網(wǎng)站建設(shè)、科爾沁左翼做網(wǎng)站、科爾沁左翼網(wǎng)站設(shè)計(jì)、科爾沁左翼網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、科爾沁左翼企業(yè)網(wǎng)站模板建站服務(wù),10多年科爾沁左翼做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
1. java.lang.IllegalArgumentException: Property ‘zookeeper’ is required
這個(gè)錯(cuò)誤意味著Dubbo找不到zookeeper的配置文件,解決方法是在dubbo.properties配置文件中添加zookeeper的地址,例如:
dubbo.registry.address=zookeeper://127.0.0.1:2181
2. Could not find or load mn class
這個(gè)錯(cuò)誤通常是因?yàn)镃LASSPATH變量未被正確設(shè)置,解決方法是在啟動(dòng)時(shí)手動(dòng)設(shè)置CLASSPATH,例如:
java -Djava.ext.dirs=./lib com.alibaba.dubbo.contner.Mn
其中-Djava.ext.dirs=./lib表示設(shè)置類路徑為當(dāng)前目錄下的lib子目錄。
3. java.net.BindException: Address already in use: bind
這個(gè)錯(cuò)誤意味著Dubbo中指定的端口已被占用,解決方法是更換端口號(hào)或者找到占用端口的進(jìn)程并結(jié)束該進(jìn)程。
4. No provider avlable for the service
這個(gè)錯(cuò)誤意味著Dubbo找不到可用的服務(wù)提供者,解決方法是確保服務(wù)提供者已經(jīng)正確部署,并且消費(fèi)者的配置文件中指定了正確的服務(wù)提供者地址。
5. java.lang.NoClassDefFoundError: org/freemarker/template/TemplateException
這個(gè)錯(cuò)誤通常是由缺少必要的jar包導(dǎo)致的,解決方法是在CLASSPATH中添加缺失的jar包。
6. Fled to connect to server
這個(gè)錯(cuò)誤意味著Dubbo無法連接到zookeeper服務(wù)器,解決方法是檢查zookeeper的地址是否正確,并確保zookeeper服務(wù)器已經(jīng)正確部署。
7. java.lang.IllegalStateException: Fled to check the status of the service
這個(gè)錯(cuò)誤通常是由服務(wù)提供者未正常啟動(dòng)或已經(jīng)關(guān)閉導(dǎo)致的,解決方法是確保服務(wù)提供者已經(jīng)正確啟動(dòng)并運(yùn)行。
:
在使用Dubbo框架時(shí),我們可能會(huì)遇到各種不同的啟動(dòng)報(bào)錯(cuò),這時(shí)候我們需要具備一定的調(diào)試能力,有效地排除問題,并采取相應(yīng)的解決方案。在Linux下啟動(dòng)Dubbo時(shí),我們需要注意設(shè)置環(huán)境變量和CLASSPATH等路徑相關(guān)的變量,并且需要檢查zookeeper的地址是否正確,服務(wù)提供者是否已經(jīng)正確部署。當(dāng)然,最重要的是我們需要不斷地學(xué)習(xí)和實(shí)踐,掌握更多的技能和經(jīng)驗(yàn),提升自己的開發(fā)水平。
相關(guān)問題拓展閱讀:
- Dubbo——服務(wù)調(diào)用、服務(wù)暴露、服務(wù)引用過程
Dubbo——服務(wù)調(diào)用、服務(wù)暴露、服務(wù)引用過程
1、InvokerInvocationHandler jdk動(dòng)態(tài)代理
5、RegistryDirector返回Invokers
Router分為:Script 腳本路由、Condition 條件路由
6、通過MockInvokersSelector的route方法(getNormalInvokers)拿到能正常執(zhí)行的invokers
8、當(dāng)回到AbstractClusterInvoker后,執(zhí)行首納(默認(rèn)FailoverClusterInvoker,根據(jù)配置的是,F(xiàn)ailfast Cluster(快速失敗) , Failsafe Cluster(失敗安全) , Failback Cluster(失敗自動(dòng)恢復(fù)) , Forking Cluster(并行調(diào)用多個(gè)服務(wù)器,只要一個(gè)成功即返回) , Broadcast Cluster(廣播調(diào)用所有提供者,逐個(gè)調(diào)用,任意一臺(tái)報(bào)錯(cuò)則報(bào)錯(cuò)))doInvoker方法
9、FailoverClusterInvoker調(diào)用AbstractClusterInvoker的select方法
10、執(zhí)行doSelect方法
11、調(diào)用AbstractLoadbalance的select方法
12、根據(jù)配置的負(fù)載均衡策略調(diào)用對(duì)應(yīng)的(如RoundRobinLoadBalance)類的doSelect方法
13、返回invokers.get()方法
14、調(diào)用FailoverClusterInvoker的invoke方法
均繼承自抽象類AbstractDirectory
Directory 獲取 invoker 是從 methodInvokerMap 中獲取的,主要都是讀操作,那它的寫操作是在什么時(shí)候?qū)懙哪?就是在回調(diào)方法 notify 的時(shí)候操作的,也就是注冊(cè)中心有變化,則更新 methodInvokerMap 和 urlInvokerMap 的值
根據(jù)dubbo-admin配置的路由規(guī)則來過濾相關(guān)的invoker,當(dāng)我們對(duì)路由規(guī)則點(diǎn)擊啟用,就會(huì)觸發(fā) RegistryDirectory 類的 notify 方法。
notify方法調(diào)用refreshInvoker方法。
route方法的實(shí)現(xiàn)類為ConditionRoute 根據(jù)條件進(jìn)行過濾
1、調(diào)用mathThen方法
2、調(diào)用matchCondition方法
3、調(diào)用isMatch判斷
4、調(diào)用isMatchGlobPattern方法
?
集群模塊是服務(wù)提供者和服務(wù)消費(fèi)者的中間層,為服務(wù)消費(fèi)者屏蔽了服務(wù)提供者的情況,這樣服務(wù)消費(fèi)者就可以專心處理遠(yuǎn)程調(diào)用相關(guān)事宜。比如發(fā)請(qǐng)求,接受服務(wù)提供者返回的數(shù)據(jù)等。這就是Dubbo Cluster集群的作用。
通過cluster來指定集群容錯(cuò)方式
其實(shí)就是應(yīng)對(duì)出錯(cuò)情況采取的策略
用于芹磨有狀態(tài)服務(wù),盡可能讓客戶端總是向同一提供者發(fā)起調(diào)用,除非提供者掛了,再連另一臺(tái),自動(dòng)開啟延遲鏈接,以減少長(zhǎng)接數(shù)
?啟動(dòng)時(shí)服務(wù)提供者將當(dāng)前進(jìn)程啟動(dòng)時(shí)間注冊(cè)到ZK;服務(wù)消費(fèi)者發(fā)現(xiàn)該節(jié)點(diǎn)后計(jì)算服務(wù)啟動(dòng)時(shí)間(相對(duì)當(dāng)前時(shí)間),在默認(rèn)預(yù)熱時(shí)間的前20%時(shí)間內(nèi),該節(jié)點(diǎn)權(quán)重始終固定為2,這樣客戶端的負(fù)載均衡器只會(huì)分發(fā)極少的請(qǐng)求至節(jié)點(diǎn)。
?在預(yù)熱時(shí)間之后的80%時(shí)間內(nèi),該節(jié)點(diǎn)權(quán)重將隨著時(shí)間的推移而線性增長(zhǎng);待預(yù)熱時(shí)間到期后,權(quán)重自動(dòng)恢復(fù)為默認(rèn)值100;負(fù)載均衡器的內(nèi)核是一個(gè)標(biāo)準(zhǔn)的WLC算法模塊,即加權(quán)最少連接算法;
?如果某個(gè)節(jié)點(diǎn)Hang住或宕機(jī),其權(quán)重會(huì)迅速自動(dòng)調(diào)節(jié)降低,避免持續(xù)性影響;當(dāng)節(jié)點(diǎn)下線時(shí),服務(wù)端提前觸發(fā)權(quán)重調(diào)節(jié),重載默認(rèn)權(quán)重至1并發(fā)布到注冊(cè)中心,服務(wù)消費(fèi)者將迅速感知到該事件;
服務(wù)提供者優(yōu)雅下線步驟(注意這套邏輯僅在服務(wù)端執(zhí)行)在ok.htm?down=true對(duì)應(yīng)的controller中加入下列邏輯,注意嫌芹斗要判斷down是否為true,因?yàn)檎碚ffalse表示啟動(dòng)驗(yàn)證而不是關(guān)機(jī)
服務(wù)者消費(fèi)者配置
dubbo服務(wù)支持參數(shù)動(dòng)態(tài)調(diào)整,例如動(dòng)態(tài)調(diào)整權(quán)重,但dubbo實(shí)現(xiàn)方式較為特殊,并不是常規(guī)思路。
?ServiceConfig類拿到對(duì)外提供服務(wù)的實(shí)際類ref,然后通過ProxyFactory類的getInvoker方法使用ref生成一個(gè)AbstractProxyInvoker實(shí)例,到這一步就完成具體服務(wù)到Invoker的轉(zhuǎn)換(javassistProxyFacory、JdkProxyFactory),接著要做Invoker轉(zhuǎn)換到Export的過程
?服務(wù)發(fā)布:本地暴露、遠(yuǎn)程暴露
?為什么會(huì)有 本地暴露 和 遠(yuǎn)程暴露 呢?不從場(chǎng)景考慮討論技術(shù)的沒有意義是.在dubbo中我們一個(gè)服務(wù)可能既是 Provider ,又是 Consumer ,因此就存在他自己調(diào)用自己服務(wù)的情況,如果再通過網(wǎng)絡(luò)去訪問,那自然是舍近求遠(yuǎn),因此他是有 本地暴露 服務(wù)的這個(gè)設(shè)計(jì).從這里我們就知道這個(gè)兩者的區(qū)別
1、spring啟動(dòng),解析配置文件
2、創(chuàng)建dubbo標(biāo)簽解析器
3、解析dubbo標(biāo)簽
4、ServiceBean解析
5、容器創(chuàng)建完成,觸發(fā)ContextRefrestEvent
6、export暴露服務(wù)
7、duExportUrls
8、doExportUrlsFor1Protocol
9、getInvoker
10、protocol.export
11、開啟服務(wù)器 openServer()如nettyServer
12、注冊(cè)服務(wù)到注冊(cè)中心 registerProvider
Filter 在服務(wù)暴露前,做攔截器初始化,在加載所有攔截器時(shí)會(huì)過濾支隊(duì)provider生效的數(shù)據(jù)。
可以。zookeeper的信息會(huì)緩存到本地作為一個(gè)緩存文件,并且轉(zhuǎn)換成 properties 對(duì)象方便使用。建立線程池,定時(shí)檢測(cè)并連接注冊(cè)中心,失敗了就重連。
注冊(cè)服務(wù)到zk其實(shí)就是在zk上創(chuàng)建臨時(shí)節(jié)點(diǎn),當(dāng)節(jié)點(diǎn)下線或者down掉時(shí),即會(huì)刪除臨時(shí)節(jié)點(diǎn),從而使服務(wù)從可用列表中剔除。
持久節(jié)點(diǎn)
臨時(shí)節(jié)點(diǎn)
1、export的時(shí)候進(jìn)行zk訂閱
2、設(shè)置監(jiān)聽回調(diào)的地址,回調(diào)給FailbackRegistry的notify
3、創(chuàng)建持久節(jié)點(diǎn)
4、設(shè)置對(duì)該節(jié)點(diǎn)的監(jiān)聽
5、更新新的服務(wù)信息,服務(wù)啟動(dòng)和節(jié)點(diǎn)更新回調(diào),都會(huì)調(diào)用到這里
6、更新緩存文件
7、對(duì)比新舊信息是否有變化,有則重新暴露服務(wù)
高并發(fā)大業(yè)務(wù)量情況下,暫時(shí)屏蔽邊緣業(yè)務(wù)
MockClusterInvoker
?SPI 全稱為 Service Provider Interface,是一種服務(wù)發(fā)現(xiàn)機(jī)制。SPI 的本質(zhì)是將接口實(shí)現(xiàn)類的全限定名配置在文件中,并由服務(wù)加載器讀取配置文件,加載實(shí)現(xiàn)類。這樣可以在運(yùn)行時(shí),動(dòng)態(tài)為接口替換實(shí)現(xiàn)類。正因此特性,我們可以很容易的通過 SPI 機(jī)制為我們的程序提供拓展功能。SPI 機(jī)制在第三方框架中也有所應(yīng)用,比如 Dubbo 就是通過 SPI 機(jī)制加載所有的組件。不過,Dubbo 并未使用 Java 原生的 SPI 機(jī)制,而是對(duì)其進(jìn)行了增強(qiáng),使其能夠更好的滿足需求。在 Dubbo 中,SPI 是一個(gè)非常重要的模塊?;?SPI,我們可以很容易的對(duì) Dubbo 進(jìn)行拓展。如果大家想要學(xué)習(xí) Dubbo 的源碼,SPI 機(jī)制務(wù)必弄懂。接下來,我們先來了解一下 Java SPI 與 Dubbo SPI 的用法,然后再來分析 Dubbo SPI 的源碼。
關(guān)于linux dubbo啟動(dòng)報(bào)錯(cuò)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線路電信、移動(dòng)、聯(lián)通等。
本文名稱:Linux下啟動(dòng)Dubbo報(bào)錯(cuò)解決方案(linuxdubbo啟動(dòng)報(bào)錯(cuò))
文章路徑:http://www.fisionsoft.com.cn/article/cdpedph.html


咨詢
建站咨詢
