在工作和學(xué)習的過(guò)程中,具體運用Dubbo的時(shí)候遇到了很多的問(wèn)題,這些問(wèn)題一方面讓自己進(jìn)一步了解所謂的dubbo,另一方面通過(guò)對它們的總結和分析能夠在工作中加倍的提高效率,接下來(lái)將會(huì )對遇到的和別人總結的一些常見(jiàn)的問(wèn)題進(jìn)行匯總.
1.增加提供服務(wù)版本號和消費服務(wù)版本號.
這個(gè)具體來(lái)說(shuō)不算是一個(gè)問(wèn)題,而是一種問(wèn)題的解決方案,在我們的實(shí)際工作中會(huì )面臨各種環(huán)境資源短缺的問(wèn)題,也是很實(shí)際的問(wèn)題,剛開(kāi)始我們還可以提供一個(gè)服務(wù)進(jìn)行相關(guān)的開(kāi)發(fā)和測試,但是當有多個(gè)環(huán)境多個(gè)版本,多個(gè)任務(wù)的時(shí)候就不滿(mǎn)足我們的需求,這時(shí)候我們可以通過(guò)給提供方增加版本的方式來(lái)區分.這樣能夠剩下很多的物理資源,同時(shí)為今后更換接口定義發(fā)布在線(xiàn)時(shí),可不停機發(fā)布,使用版本號.
引用只會(huì )找相應版本的服務(wù),例如
<dubbo:serviceinterface=“com.xxx.XxxService”ref=“xxxService” version=“1.0” />
<dubbo:referenceid=“xxxService”interface=“com.xxx.XxxService” version=“1.0”/>
dubbo服務(wù)的版本號在項目中非常實(shí)用,如果后續系列允許的話(huà),我會(huì )專(zhuān)門(mén)對dubbo的版本進(jìn)行一個(gè)詳細的文章說(shuō)明.
2.dubbo reference注解問(wèn)題
@Reference只能在springbean實(shí)例對應的當前類(lèi)中使用,暫時(shí)無(wú)法在父類(lèi)使用;如果確實(shí)要在父類(lèi)聲明一個(gè)引用,可通過(guò)配置文件配置dubbo:reference,然后在需要引用的地方跟引用springbean一樣就可以了.
3.服務(wù)超時(shí)問(wèn)題.
此問(wèn)題也是在項目中非常常見(jiàn)的一個(gè)問(wèn)題,但是這個(gè)問(wèn)題背后可能是各種原因導致.
目前如果存在超時(shí),情況基本都在如下:
(1) 一種情況是服務(wù)請求超時(shí).
客戶(hù)端耗時(shí)大,也就是超時(shí)異常時(shí)的client elapsedxxx,這個(gè)是從創(chuàng )建Future對象開(kāi)始到使用channel發(fā)出請求的這段時(shí)間,中間沒(méi)有復雜操作,只要CPU沒(méi)問(wèn)題基本不會(huì )出現大耗時(shí),頂多1ms屬于正常IOThread繁忙,默認情況下,dubbo協(xié)議一個(gè)客戶(hù)端與一個(gè)服務(wù)提供者會(huì )建立一個(gè)共享長(cháng)連接,如果某個(gè)客戶(hù)端處于特別繁忙而且一直往一個(gè)服務(wù)提供者塞請求,可能造成IOThread阻塞,一般非常特殊的情況才會(huì )出現服務(wù)端工作線(xiàn)程池中線(xiàn)程全部繁忙,接收消息后塞入隊列等待,如果等待時(shí)間比預想長(cháng)會(huì )引起超時(shí)網(wǎng)絡(luò )抖動(dòng),如果上述情況都排除了,還出現在請求發(fā)出后,服務(wù)接收請求前超過(guò)預想時(shí)間,只能歸類(lèi)到網(wǎng)絡(luò )抖動(dòng)了,需要SA一起查看問(wèn)題服務(wù)自身耗時(shí)大,這個(gè)需要應用自身做好耗時(shí)統計,當出現這種情況的時(shí)候需要用數據來(lái)說(shuō)明問(wèn)題及規劃優(yōu)化方案,建議采用緩存埋點(diǎn)的方式統計服務(wù)中各個(gè)執行階段的耗時(shí)情況,最終如果超過(guò)預想時(shí)間則把緩存統計的耗時(shí)情況打日志,減少日志量,且能夠得到更明確的信息現在我們應用使用過(guò)程中發(fā)現兩種類(lèi)型的耗時(shí),一種我們目前只能歸類(lèi)到網(wǎng)絡(luò )抖動(dòng),后續需要找運維一起關(guān)注這個(gè)問(wèn)題,另外一種是由于一些歷史原因,數據庫查詢(xún)容易發(fā)生抖動(dòng),總有一個(gè)時(shí)間點(diǎn)會(huì )突然多出很多超時(shí)。
(2) 二大類(lèi)的情況是調用的版本不對.
在上面我們已經(jīng)說(shuō)了具體的版本問(wèn)題,如果你調用的對方版本不對的話(huà),就相當于你的消費者沒(méi)有提供者.所以會(huì )出現超時(shí),此時(shí)只需要把版本對應好即可.
(3)提供者的服務(wù)被禁止.
這是一種人為的控制,通過(guò)監控中心我們可以對具體的服務(wù),以及它的權重進(jìn)行控制,當我將一個(gè)具體的服務(wù)禁止之后消費者就調不到相關(guān)的服務(wù),此時(shí)就會(huì )出現超時(shí)的問(wèn)題.解決方案,取消禁止即可.注意這里有一定時(shí)間的緩存,實(shí)際操作的時(shí)候應該注意.
4.服務(wù)保護
服務(wù)保護的原則上是避免發(fā)生類(lèi)似雪崩效應,盡量將異??刂圃诜?wù)周?chē)?,不要擴散開(kāi)。說(shuō)到雪崩效應,還得提下dubbo自身的重試機制,默認3次,當失敗時(shí)會(huì )進(jìn)行重試,這樣在某個(gè)時(shí)間點(diǎn)出現性能問(wèn)題,然后調用方再連續重復調用,很容易引起雪崩,建議的話(huà)還是很據業(yè)務(wù)情況規劃好如何進(jìn)行異常處理,何時(shí)進(jìn)行重試。服務(wù)保護的話(huà) 考慮服務(wù)的dubbo線(xiàn)程池類(lèi)型(fix線(xiàn)程池的話(huà)考慮線(xiàn)程池大?。?、數據庫連接池、dubbo連接數限制是否都合適.
5.注冊中心的分組group和服務(wù)的不同實(shí)現group
這兩個(gè)東西完全不同的概念,使用的時(shí)候不要弄混了。registry上可以配置group,用于區分不同分組的注冊中心,比如在同一個(gè)注冊中心下,有一部分注冊信息是要給開(kāi)發(fā)環(huán)境用的,有一部分注冊信息時(shí)要給測試環(huán)境用的,可以分別用不同的group區分開(kāi),目前對這個(gè)理解還不透徹,大致就是用于區分不同環(huán)境。service和reference上也可以配置group,這個(gè)用于區分同一個(gè)接口的不同實(shí)現,只有在reference上指定與service相同的group才會(huì )被發(fā)現。
以上為5類(lèi)我們所遇到的問(wèn)題,總結下來(lái)為了以后的路走的更順暢.
聯(lián)系客服