Dubbo中No provider available for the service异常

昨天碰到了这个异常,原因是容器初始化失败,就是消费者没有获得服务。

在网上搜了很多解决方案,都没能解决

最终发现是linux发布zookeeper后,防火墙没有关闭。


再复习一下dubbo+zookeeper与提供者、消费者之间关系

以下内容转载自:http://blog.csdn.net/javaloveiphone/article/details/52290292


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协议在20880端口暴露服务,当然如果你不配置,dubbo默认使用20880端口暴露服务,所有消费者都是通过20880端口进行,对于消费者而言,提供者服务器8080端口是透明的,也就是说提供者服务器端口号可以任意改变,服务也不会有任何影响,消费者无需关心。 

所以上面的异常解决办法是开放20880端口给消费者,而不是8080端口给消费者。

从监控中心可以看到如图:

这里写图片描述

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

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

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开放给管理员用户,便于通过浏览器监控注册中心服务的情况 

- 总结:注册中心只负责服务注册和目录发布,安全授权,实际的服务访问仍然是两个组件之间的点对点连接完成,这种方式下整个架构下获取更高的性能,同时服务管理平台也不容易成为大并发服务访问下的单点瓶颈






你可能感兴趣的:(JavaEE相关知识)