使用Dubbo趟過(guò)的坑

最近在做一個(gè)項(xiàng)目,這個(gè)項(xiàng)目里有兩個(gè)系統(tǒng)。這是背景!

這兩個(gè)系統(tǒng)不能互相訪問(wèn)!這是坑爹的需求!

然后我不想使用數(shù)據(jù)庫(kù)共享,也不希望用rest的方式,所以我想到了用dubbo來(lái)解決!這是我的解決方案!

項(xiàng)目A的配置(服務(wù)提供者)

<!-- 提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系 -->
<dubbo:application name="projectA"/>

<!-- 用dubbo協(xié)議暴露服務(wù) -->
<dubbo:protocol name="rmi" port="20881"/>

<!-- 使用暴露服務(wù)地址 -->
<dubbo:registry id="projectARegistry" address="zookeeper://192.168.72.232:2181"/>

<!-- 注冊(cè)服務(wù) -->
<dubbo:service interface="com.company.demo.service.DemoService" ref="demoServiceImpl" registry="projectARegistry"/>

項(xiàng)目B的配置(服務(wù)消費(fèi)者)

<dubbo:application name="projectB"/>

<dubbo:registry address="zookeeper://192.168.72.232:2181"/>

<dubbo:registry id="projectARegistry" address="zookeeper://192.168.72.232:2181"/>

<!-- DemoService獲取 -->
<dubbo:reference interface="com.company.demo.service.DemoService" id="demoServiceImpl" registry="projectARegistry"/>

發(fā)現(xiàn)錯(cuò)誤!

坑爹的錯(cuò)誤馬上就要出現(xiàn)了!

[http-bio-8080-exec-7] WARN o.s.remoting.rmi.RmiProxyFactoryBean- Could not connect to RMI service [rmi://192.168.72.235:20881/com.company.demo.service.DemoService] - retrying

我找了很久很久,終于在一個(gè)很不起眼的地方發(fā)現(xiàn)了一段代碼。

Caused by: org.springframework.remoting.RemoteConnectFailureException: Could not connect to remote service [rmi://192.168.72.235:20881/com.ztesoft.zsmartcity.ynzw.demo.service.DemoService]; nested exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
        java.net.ConnectException: 拒絕連接
        at org.springframework.remoting.rmi.RmiClientInterceptorUtils.convertRmiAccessException(RmiClientInterceptorUtils.java:150)
        at org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:348)
        at org.springframework.remoting.rmi.RmiClientInterceptor.refreshAndRetry(RmiClientInterceptor.java:331)
        at org.springframework.remoting.rmi.RmiClientInterceptor.handleRemoteConnectFailure(RmiClientInterceptor.java:307)
        at org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:263)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
        at com.sun.proxy.$Proxy64.list(Unknown Source)
        at com.alibaba.dubbo.common.bytecode.Wrapper0.invokeMethod(Wrapper0.java)
        at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
        at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
        at com.alibaba.dubbo.rpc.protocol.AbstractProxyProtocol$2.doInvoke(AbstractProxyProtocol.java:93)
        at com.alibaba.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:144)
        at com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:74)
        at com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
        at com.ztesoft.zsmart.pot.dubbo.filter.ConsumerTraceFilter.invoke(ConsumerTraceFilter.java:36)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
        at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:74)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
        at com.alibaba.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:48)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
        at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
        at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:77)
        ... 74 more

我特么什么時(shí)候?qū)懥?code>127.0.0.1這個(gè)地址的,我擦嘞?。。《颐髅鳙@取的是rmi://192.168.72.235:20881/com.company.demo.service.DemoService這個(gè)啊。

嘗試解決問(wèn)題

遇到這種叼問(wèn)題第一個(gè)想到的就是debug

我先是在服務(wù)注冊(cè)的地方,講協(xié)議格式改成:

<dubbo:protocol name="rmi" port="20881" host="192.168.72.235"/>
192.168.72.235是服務(wù)提供者所在服務(wù)器的ip
  1. 配置服務(wù)器上的debug端口
  2. 在idea中配置debug遠(yuǎn)程tomcat
  3. 開(kāi)始debug

他媽的,發(fā)現(xiàn)dubbo在某一個(gè)位置,講我的url的ip給改了,如下:

private void exportLocal(URL url) {
    if (!Constants.LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {
        // 他娘的,設(shè)置成127.0.0.1了
        URL local = URL.valueOf(url.toFullString()).setProtocol(Constants.LOCAL_PROTOCOL).setHost(NetUtils.LOCALHOST).setPort(0);
        // rest
        ServiceImplHolder.getInstance().pushServiceImpl(ref);
        // rest end
        Exporter<?> exporter = protocol.export(proxyFactory.getInvoker(ref, (Class) interfaceClass, local));
        exporters.add(exporter);
        logger.info("Export dubbo service " + interfaceClass.getName() + " to local registry");
    }
}

好了,沒(méi)辦法,搞不定,總不能去改dubbo的代碼吧。。。

然后我就用Naming去獲取上面那個(gè)rmi://...

Object obj = Naming.lookup("rmi://192.168.72.235:20881/com.company.demo.service.DemoService");

發(fā)現(xiàn)果然被坑了,獲取的類是代理出來(lái)的,里面果然有個(gè)127.0.0.1

真正開(kāi)始解決問(wèn)題了

  1. 在網(wǎng)上查,dubbo怎么去獲取本機(jī)ip
  2. 翻看dubbo源碼,在NetUtils中的getLocalAddress0這個(gè)方法
  3. dubbo獲取本機(jī)所有網(wǎng)卡中的ip地址,然后拿到第一個(gè)不是127.0.0.1的那個(gè)ip
  4. 設(shè)置服務(wù)器上的hosts,vim /etc/hosts
192.168.72.235  localhost hostname

# 192.168.72.235 服務(wù)器ip
# localhost
# hostname 是主機(jī)名,在/etc/sysconfig/network進(jìn)行配置

重啟服務(wù)提供者服務(wù),完美解決問(wèn)題?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,540評(píng)論 19 139
  • Dubbo是什么 Dubbo是Alibaba開(kāi)源的分布式服務(wù)框架,它最大的特點(diǎn)是按照分層的方式來(lái)架構(gòu),使用這種方式...
    Coselding閱讀 17,444評(píng)論 3 196
  • 1. 我的女兒兩歲四個(gè)月,她的性格屬于傳統(tǒng)意義上的典型的女孩。乖巧、文靜、溫柔、體貼、善解人意、愛(ài)分享,不打架。我...
    林資言閱讀 922評(píng)論 0 1
  • 一場(chǎng)冬雨 來(lái)的不早不晚 剛剛好 滋潤(rùn)著冬麥 肥沃著土地 一陣涼風(fēng) 來(lái)的不早不晚 剛剛好 吹落了秋葉 吹走了塵埃 一...
    君潤(rùn)生活閱讀 363評(píng)論 0 7
  • 《幸福的方法》一書中有很多練習(xí)方法,這是第一個(gè)嘗試——感恩周記 上個(gè)月寫了幾篇不想發(fā)表的文章,想了一下覺(jué)得這篇還是...
    115c3253903d閱讀 323評(píng)論 0 0

友情鏈接更多精彩內(nèi)容