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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

一、異常信息分析

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創建失敗,有的說屬性自動裝配失敗,但后半部分都比較統一,都是:No provider available for the service ……,服務沒有可以使用的提供者,完整意思就是:對于消費者(consumer-ip)而言,在zookeeper注冊中心(zookeeper-url)沒有可用的提供者(No provider available for the service com.test.rpc.OrgRPC),消費者訪問提供者的時候失敗了;

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

網上解決辦法整合:

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

**我的解決方法:**主要的報錯信息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這個問題的報錯是沒有服務的提供者,因為我的項目是service層給controller層提供服務,所以service
層是服務的提供者,因為報錯是沒有服務的提供者,所以問題就在service的dubbo的服務有沒有正常的提供,最后發現自己的spring的web.xml的文件忘記加入加載spring容器的配置了,導致不能正常的發布服務!所以下次出現問題的時候,多看看異常信息,這個問題導致我花了幾個小時,結果網上的解答都沒有解決我的問題,最后還是自己看報錯解決了!

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

先說一下整個系統框架的基本構造:

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

  • dubbo-admin作為監控中心,與zookeeper使用相同服務器,tomcat部署占用8080端口

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

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

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

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

  • 要說dubbo協議開放了20880端口,那8080端口應該也開放啊?

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

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

##1)、用dubbo協議在20880端口暴露服務

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

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

從監控中心可以看到如圖:

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

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

##2)、端口開放情況

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

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

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

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

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

##三、總結一下:

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

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

  • consumer的8080開放給所有provider

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

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

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

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

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

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

現在免費分享大家,在下面我的公眾號 程序員的技術圈子 回復 面試 即可獲取。

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

1、老鐵們,關注我的原創微信公眾號「程序員的技術圈子」,專注于 Java、數據結構和算法、微服務、中間件等技術分享,保證你看完有所收獲。

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

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

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。