日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

dubbo+zookeeper与提供者、消费者之间端口通信问题(No provider available for the service)

發(fā)布時間:2025/3/20 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dubbo+zookeeper与提供者、消费者之间端口通信问题(No provider available for the service) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、異常信息分析

Failed to check the status of the service com.sihai.service.ItemService. No provider available for the service com.sihai.service.ItemService from the url zookeeper://192.168.131.133:2181/com.alibaba.dubbo.registry.RegistryService?application=sihai-manager-web&dubbo=2.5.3&interface=com.sihai.service.ItemService&methods=getItemById&pid=18216&revision=0.0.1-SNAPSHOT&side=consumer&timestamp=1519567537377 to the consumer 192.168.131.1 use dubbo version 2.5.3at com.alibaba.dubbo.config.ReferenceConfig.createProxy(ReferenceConfig.java:420)at com.alibaba.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:300)at com.alibaba.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:138)at com.alibaba.dubbo.config.spring.ReferenceBean.getObject(ReferenceBean.java:65)at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103)at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1585)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682)at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553)at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)at javax.servlet.GenericServlet.init(GenericServlet.java:160)at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280)at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1193)at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)at java.util.concurrent.FutureTask.run(FutureTask.java:262)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:745)

異常分析:

上面的異常,Caused by的前半部分有的說bean創(chuàng)建失敗,有的說屬性自動裝配失敗,但后半部分都比較統(tǒng)一,都是:No provider available for the service ……,服務(wù)沒有可以使用的提供者,完整意思就是:對于消費者(consumer-ip)而言,在zookeeper注冊中心(zookeeper-url)沒有可用的提供者(No provider available for the service com.test.rpc.OrgRPC),消費者訪問提供者的時候失敗了;

因為消費者沒有變,變化的是向注冊中心注冊的提供者由開發(fā)服務(wù)器變更為測試服務(wù)器,同時由于之前處理過因為【No route to host】引起的異常,所以想到可能是提供者端口不通造成的,然后從消費者服務(wù)器telnet 提供者ip 20880端口,果然如此。

網(wǎng)上解決辦法整合:

1、將提供者服務(wù)器的20880端口開放給消費者服務(wù)器ip,重新啟動消費者服務(wù)器,正常啟動。
2、可能是你沒有在spring-service的配置文件中沒有提供服務(wù)。
3、dubbo配置的時候需要一個注冊中心 這個注冊中心主要起的作用為服務(wù)做配置 每當一個服務(wù)生產(chǎn)者去注冊服務(wù)時候 會把這個生產(chǎn)者的ip跟端口號丟上去注冊中心 而服務(wù)的消費方就會從注冊中心拿到服務(wù)的ip跟端口號 放在本地文件中 底層調(diào)用netty訪問服務(wù)
昨天跟同事一塊調(diào)程序 他開服務(wù)生產(chǎn)者 我開服務(wù)調(diào)用者 后邊就出Failed to check the status of the service . No provider available for the service 這個問題 然后就去dubboadmin上邊看 服務(wù)正常啟動 但是服務(wù)提供者的ip是192.168.83.1 是同事搞虛擬機的時候弄虛擬網(wǎng)卡的地址 所以我這邊消費方拿到他的虛擬網(wǎng)卡ip才訪問不到服務(wù) 于是乎 禁用虛擬網(wǎng)卡 問題解決

**我的解決方法:**主要的報錯信息No provider available for the service com.sihai.service.ItemService from the url zookeeper://192.168.131.133:2181/com.alibaba.dubbo.registry.RegistryService?application=sihai-manager-web&dubbo=2.5.3&interface=com.sihai.service.ItemService&methods=getItemById&pid=18216&revision=0.0.1-SNAPSHOT&side=consumer&timestamp=1519567537377 to the consumer 192.168.131.1 use dubbo version 2.5.3這個問題的報錯是沒有服務(wù)的提供者,因為我的項目是service層給controller層提供服務(wù),所以service
層是服務(wù)的提供者,因為報錯是沒有服務(wù)的提供者,所以問題就在service的dubbo的服務(wù)有沒有正常的提供,最后發(fā)現(xiàn)自己的spring的web.xml的文件忘記加入加載spring容器的配置了,導(dǎo)致不能正常的發(fā)布服務(wù)!所以下次出現(xiàn)問題的時候,多看看異常信息,這個問題導(dǎo)致我花了幾個小時,結(jié)果網(wǎng)上的解答都沒有解決我的問題,最后還是自己看報錯解決了!

##二、dubbo+zookeeper與提供者provider、消費者consumer之間通信過程

先說一下整個系統(tǒng)框架的基本構(gòu)造:

  • zookeeper作為注冊中心,使用單獨服務(wù)器,占用2181端口

  • dubbo-admin作為監(jiān)控中心,與zookeeper使用相同服務(wù)器,tomcat部署占用8080端口

  • provider作為提供者,使用單獨服務(wù)器,tomcat部署占用8080端口,使用dubbo協(xié)議開放20880端口

  • consumer作為消費者,使用單獨服務(wù)器,tomcat部署占用8080端口

再看上面的異常,雖然解決了,是不是有人和我一樣有一些問題想不通:

  • provider服務(wù)器端口是8080,為什么telnet測試以及解決方案中開放的端口卻是20880?

  • 要說dubbo協(xié)議開放了20880端口,那8080端口應(yīng)該也開放啊?

  • zookeeper、provider、consumer之間端口開放和屏蔽情況到底是怎么回事?

帶著這些問題,進行了相關(guān)的驗證,最終得出如下結(jié)論,先看圖,再解釋:

##1)、用dubbo協(xié)議在20880端口暴露服務(wù)

在提供者的dubbo配置文件中,一般都配置了<dubbo:protocol name="dubbo" port="20880"/>,表明用dubbo協(xié)議在20880端口暴露服務(wù),當然如果你不配置,dubbo默認使用20880端口暴露服務(wù),所有消費者都是通過20880端口進行,對于消費者而言,提供者服務(wù)器8080端口是透明的,也就是說提供者服務(wù)器端口號可以任意改變,服務(wù)也不會有任何影響,消費者無需關(guān)心。

所以上面的異常解決辦法是開放20880端口給消費者,而不是8080端口給消費者。

從監(jiān)控中心可以看到如圖:

除了在指定端口上暴露服務(wù)之外,還可以在指定ip上暴露服務(wù),配置如下:

<dubbo:protocol name="dubbo" host="10.1.22.2" port="20880" />

##2)、端口開放情況

zookeeper作為注冊中心,provider注冊服務(wù)、consumer訂閱服務(wù)、dubbo-admin監(jiān)控服務(wù),所以zookeeper注冊中心的2181端口需要向provider、consumer、dubbo-admin開放;

一般情況下,dubbo-admin監(jiān)控中心與zookeeper注冊中心部署在相同的服務(wù)器上,zookeeper可以不考慮端口開放給dubbo-admin的情況;

consumer訂閱服務(wù),即拿到了provider在20880端口暴露的服務(wù),當consumer請求服務(wù)時,直接從consumer跳到provider,而不是consumer到zookeeper再到provider,所以provider的20880無需開放給zookeeper;

同理,provider響應(yīng)服務(wù)時,也是直接從provider到consumer,而不是provider到zookeeper再到consumer,所以consumer的8080無需開放給zookeeper;

zookeeper注冊中心是完全被動的。

##三、總結(jié)一下:

  • zookeeper的2181開放給provider、consumer、dubbo-admin

  • provider的20880開放給所有consumer,但8080服務(wù)器端口可以完全屏蔽

  • consumer的8080開放給所有provider

  • dubbo-admin的8080開放給管理員用戶,便于通過瀏覽器監(jiān)控注冊中心服務(wù)的情況

  • 總結(jié):注冊中心只負責(zé)服務(wù)注冊和目錄發(fā)布,安全授權(quán),實際的服務(wù)訪問仍然是兩個組件之間的點對點連接完成,這種方式下整個架構(gòu)下獲取更高的性能,同時服務(wù)管理平臺也不容易成為大并發(fā)服務(wù)訪問下的單點瓶頸

**注意:**當出現(xiàn)錯誤時,還是多看看后臺的異常信息,說不定就解決了,可以省去很多不必要的麻煩,浪費了很多時間!

參考:http://blog.csdn.net/javaloveiphone/article/details/52290292

點個贊,看一看,好習(xí)慣!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收錄,這是我花了 3 個月總結(jié)的一線大廠 Java 面試總結(jié),本人已拿大廠 offer。
另外,原創(chuàng)文章首發(fā)在我的個人博客:blog.ouyangsihai.cn,歡迎訪問。

最后,再分享我歷時三個月總結(jié)的 Java 面試 + Java 后端技術(shù)學(xué)習(xí)指南,這是本人這幾年及春招的總結(jié),已經(jīng)拿到了大廠 offer,整理成了一本電子書,拿去不謝,目錄如下:

現(xiàn)在免費分享大家,在下面我的公眾號 程序員的技術(shù)圈子 回復(fù) 面試 即可獲取。

有收獲?希望老鐵們來個三連擊,給更多的人看到這篇文章

1、老鐵們,關(guān)注我的原創(chuàng)微信公眾號「程序員的技術(shù)圈子」,專注于 Java、數(shù)據(jù)結(jié)構(gòu)和算法、微服務(wù)、中間件等技術(shù)分享,保證你看完有所收獲。

2、給俺點個贊唄,可以讓更多的人看到這篇文章,順便激勵下我繼續(xù)寫作,嘻嘻。

3、另外,原創(chuàng)文章首發(fā)在我的個人博客:blog.ouyangsihai.cn,歡迎訪問。

點贊是對我最大的鼓勵
↓↓↓↓↓↓

總結(jié)

以上是生活随笔為你收集整理的dubbo+zookeeper与提供者、消费者之间端口通信问题(No provider available for the service)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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