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×tamp=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×tamp=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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu下使用filezilla上传
- 下一篇: java网络编程(一)