日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DUBBO 使用问题记录

發(fā)布時間:2023/12/18 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DUBBO 使用问题记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前些天發(fā)現(xiàn)了一個巨牛的人工智能學習網(wǎng)站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到教程。

官方ISSUE參考

https://github.com/alibaba/dubbo/issues

?

注冊中心ZookeeperRegistry.doSaveProperties warn

2014-10-1419:56:51WARN? [com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry.doSaveProperties(221)]? [DUBBO] Failed to save registry store file, cause: Can not loc

k the registry cache file /homearch/.dubbo/dubbo-registry-192.168.1.109.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.re

gistry.file=xxx.properties, dubbo version:2.5.3, current host:192.168.1.22

java.io.IOException: Can not lock the registry cache file /homearch/.dubbo/dubbo-registry-192.168.1.109.cache, ignore and retry later, maybe multi java process use t

he file, please config: dubbo.registry.file=xxx.properties

????????at com.alibaba.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:193)

????????at com.alibaba.dubbo.registry.support.AbstractRegistry$SaveProperties.run(AbstractRegistry.java:150)

????????at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

????????at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

????????at java.lang.Thread.run(Thread.java:744)

2014-10-1419:56:51WARN? [com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry.doSaveProperties(221)]? [DUBBO] Failed to save registry store file, cause: Can not loc

k the registry cache file /homearch/.dubbo/dubbo-registry-192.168.1.109.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.re

gistry.file=xxx.properties, dubbo version:2.5.3, current host:192.168.1.22

java.io.IOException: Can not lock the registry cache file /homearch/.dubbo/dubbo-registry-192.168.1.109.cache, ignore and retry later, maybe multi java process use t

he file, please config: dubbo.registry.file=xxx.properties

????????at com.alibaba.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:193)

????????at com.alibaba.dubbo.registry.support.AbstractRegistry$SaveProperties.run(AbstractRegistry.java:150)

????????at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

????????at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

????????at java.lang.Thread.run(Thread.java:744)

?

原因:

dubbo會默認會在本地緩存注冊中心的信息文件,默認路徑在//home/[user]/.dubbo/dubbo-registry-192.168.1.109.cache一個服務(wù)有多個應(yīng)用有用到dubbo的時候更新注冊中心的本地緩存,在更新本地緩存沖突時,就報了上面的warning;

如何消除這個warn:

在dubbo.properties文件里加入; dubbo.registry.file=/home/xxx/app/dubbo-registry.propertiesPS:Dubbo將自動加載classpath根目錄下的dubbo.properties,可以通過JVM啟動參數(shù):-Ddubbo.properties.file=/home/xxx/dubbo.properties 改變?nèi)笔∨渲梦恢谩?

影響:

?這個warn可以忽略,只在存儲文件的時候才報,存儲的文件在AbstractRegistry構(gòu)造函數(shù)里加載;是在啟動的時候用

?

錯誤的服務(wù)提供者IP注冊到中心

?

hostname解析錯誤或者可能是使用了VPN,啟動了dubbo服務(wù)提供者應(yīng)用,又連了正式環(huán)境的注冊中心;

?一旦dubbo獲取的ip錯誤后(撥了vpn 本機IP就會有多個),

?這種情況即使提供者服務(wù)停掉,目前dubbo沒有能力清除這類錯誤的提供者;

?(需要修改源碼測試,需要客戶端重新更細包,因為清除動作client端)

?這種情況同樣發(fā)生在測試的dubbo注冊中心;

??

規(guī)避方案:

  • 線上最好直接把10.10.10.10服務(wù)器的2181端口,做ip限制,VPN撥上的IP過濾掉(@旭峰,看能不能做到)
  • 團隊人員行為控制;
  • 撥VPN又需要調(diào)試dubbo提供者的應(yīng)用時,指定DUBBO服務(wù)的主機綁定?
  • 發(fā)現(xiàn)這種情況的解決方法:

  • 到dubbo管理后臺,禁用錯誤的服務(wù)提供者;
  • Dubbo主機綁定說明:?

    ? 缺省主機IP查找順序:?

    • 通過LocalHost.getLocalHost()獲取本機地址(hostname做解析,從而獲取IP地址的,ping hostname)。
    • 如果是127.*等loopback地址,則掃描各網(wǎng)卡,獲取網(wǎng)卡IP。

    ?

    ?注冊的地址如果獲取不正確,比如需要注冊公網(wǎng)地址,可以:


    1. 可以在/etc/hosts中加入:機器名 公網(wǎng)IP,比如:?

    test1 205.182.23.201?

    2. 在dubbo.xml中加入主機地址的配置:

    <dubbo:protocol?host="205.182.23.201">

    3. 或在dubbo.properties中加入主機地址的配置:

    dubbo.protocol.host=205.182.23.201 或?JAVA_OPTIONS="-Ddubbo.protocol.host=192.168.1.111

    怎么樣一次訪問調(diào)用集群中所有節(jié)點?

    配置下消費者端即可。dubbo已經(jīng)支持廣播調(diào)用《broadcast》

    <dubbo:referenceid="testservice"interface="xxx.TestService"timeout="8000"cluster="broadcast"/>

    spring jar包沖突

    我們現(xiàn)在用的spring是3,而dubbo引用的是2.5.6,會造成jar包沖突,需要排除

    錯誤信息:WARN:oejuc.AbstractLifeCycle:FAILED ModelViewController: java.lang.NoSuchFieldError: APPLICATION_CONTEXT_ID_PREFIX

    解決辦法:<dependency>

    ????????????<groupId>com.alibaba</groupId>

    ????????????<artifactId>dubbo</artifactId>

    ????????????<version>2.4.9</version>

    ????????????????<exclusions>

    ????????????????<exclusion>

    ????????????????????<groupId>org.springframework</groupId>

    ????????????????????<artifactId>spring</artifactId>

    ????????????????</exclusion>

    ????????????</exclusions>

    </dependency>

    異步調(diào)用問題

    ??dubbo的異步調(diào)用發(fā)現(xiàn)個問題

    A?-----[異步]-->????B???--[同步調(diào)用]-->C

    B同步dubbo調(diào)用C,就會直接返回null

    如果B調(diào)用C后,下一步還有同步調(diào)用D,D返回的會正確;

    ?

    ?

    服務(wù)端開發(fā)不注冊到中心

    開發(fā)調(diào)試的時候:開發(fā)的dubbo服務(wù)不要注冊到注冊中心。不注冊的方法如下,建議用1或2
    1:啟動jvm參數(shù):-Ddubbo.registry.address=192.168.1.109:2183?register=false
    2:改properties:<dubbo:registry address="192.168.1.109:2183?register=false"/> ?

    3:dubbo.xml 配置:<dubbo:registry address="192.168.1.109:2183" register="false" />(上線要改回來)

    ?

    dubbo-monitor-simple

    ?

    里面有個配置dubbo.statistics.directory=${user.home}/monitor/statistics

    下面的監(jiān)控是寫文件的,導(dǎo)致服務(wù)器的文件過多,幾個月下來inode都要滿了。

    定期清理,或者用dubbo-monitor-x吧,入mysql

    ?

    oschina有一個開源項目:http://git.oschina.net/handu/dubbo-monitor?

    ?

    狀態(tài)被禁用,管理后臺設(shè)置無效

    不知道什么原因,管理后臺看服務(wù)是禁用狀態(tài),而且啟用不成功,感覺是哪里配置寫進去的地方寫錯,具體原因沒分析,

    解決方法就是去登錄zookeeper里手段刪除配置節(jié)點

    zkCli.sh -server 192.168.1.23:2183

    ?delete?/dubbo/xxxx.xxxx.Service/configurators/xxxxxxx

    ?

    DUBBO的回調(diào)問題,指導(dǎo)文檔是(試用)生產(chǎn)上慎用;

    provider <--consumer: ?正常調(diào)用

    provider -->consumer: ?回調(diào)

    例子里,消費的端配置是

    <dubbo:reference?id="callbackService"?interface="com.callback.CallbackService"?/>

    CallbackService callbackService = (CallbackService) context.getBean("callbackService");callbackService.addListener("http://10.20.160.198/wiki/display/dubbo/foo.bar", new CallbackListener(){public void changed(String msg) {System.out.println("callback1:" + msg);} });

    注意點1:初始化的時候,必須調(diào)用callbackService.addListener后,provider在調(diào)用回調(diào)服務(wù),客戶端才能收到。

    注意點2: provider如果重啟了,consumer如果沒有重啟,這時候如果provider直接進行回調(diào)是掉不通的。

    如果你重現(xiàn)再consumer里再callbackService.addListener,那就可以了。

    ?

    原因跟回調(diào)實現(xiàn)有關(guān),dubbo的回調(diào)暴露,CallbackServiceCodec實現(xiàn)consumer的接口暴露。

    1.callbackService.addListener

    2.-->CallbackServiceCodec(tcp進行callback的編碼)、并export回調(diào)服務(wù)

    3.--tcp傳輸編碼-->

    4.provider收到編碼,CallbackServiceCodec.decode解碼知道consumer有回調(diào)接口暴露,生成invoker

    5.這個時候provider就可以調(diào)用invoker了。

    ?

    所以,如果provider重啟了,內(nèi)存里的callbackService 的invoker就沒有了。

    剛開始看到回調(diào),以為能很好的解決相互依賴,實現(xiàn)provider對consumer的調(diào)用,

    ?

    比如場景:

    業(yè)務(wù)系統(tǒng)--依賴-->配置中心。

    配置中心后臺修改了配置,想下發(fā)到業(yè)務(wù)系統(tǒng)(廣播調(diào)用)。

    用回調(diào)有很多問題:1.上面provider重啟問題,2.回調(diào)沒有類似的廣播調(diào)用。

    這種場景大致的dubbo擴張方案(如果誰有解決方案,多謝指導(dǎo)):

    看了下如果通過回調(diào)機制擴展,有相當大麻煩(按目前對他的理解程度),所以比較簡單的

    1.provider發(fā)布share包時候,直接包consumer暴露成一個provider,就是讓他相互依賴。

    2.通過注冊中心zookeeper,建立監(jiān)聽和通知機制(相對會破壞一點,原來的注冊中心定位)

    ?

    管理中心的服務(wù)注冊信息不同步

    重新發(fā)布服務(wù)后,發(fā)現(xiàn)管理中心的服務(wù)信息沒有更新,包括PID TS,以為應(yīng)用沒更新。

    這類問題可以直接登錄zookeeper進行查看,

    zkCli.sh -server 192.168.1.23:2183

    ?

    擴展點自動激活

    dubbo開發(fā)文檔,自動激活,filter是從ProtocolFilterWrapper 調(diào)ExtensionLoader.getActivateExtension

    @Activate // 無條件自動激活 public class XxxFilter implements Filter {// ... }

    其實需要加上

    <span style="color:#7f9f7f">@Activate(group = {"provider","consumer"})</span>

    ExtensionLoader.getActivateExtension

    private boolean isMatchGroup(String group, String[] groups) {if (group == null || group.length() == 0) {return true;}if (groups != null && groups.length > 0) {for (String g : groups) {if (group.equals(g)) {return true;}}}return false; } boolean isMatchGroup(String group, String[] groups) {if (group == null || group.length() == 0) {return true;}if (groups != null && groups.length > 0) {for (String g : groups) {if (group.equals(g)) {return true;}}}return false; }

    ?

    廣播地址綁定失敗:Can't assign requested address mac dubbo

    <dubbo:registry address="multicast://224.5.6.7:1234"/>registry address="multicast://224.5.6.7:1234"/>

    ?

    This was caused by an IPv6 address being returned from?java.net.NetworkInterface.getDefault(). I'm on a Macbook and was using wireless -- p2p0 (used for AirDrop) was returned as the default network interface but my p2p0 only has an IPv6?ether?entry [found by running?ipconfig].

    Two solutions, both of which worked for me (I prefer the first because it works whether you are using a wired or wireless connection)

  • Start the JVM with?-Djava.net.preferIPv4Stack=true. This caused?java.net.NetworkInterface.getDefault()?to return my vboxnet0 network interface -- not sure what you'll get if you're not running a host-only VM.
  • Turn off wireless and use a wired connection
  • ?

    總結(jié)

    以上是生活随笔為你收集整理的DUBBO 使用问题记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。