之前写了一篇Dubbo服务从Provider到Consumer的Demo,这几天讲实际编写的Dubbo服务功能放到测试服务器和生产服务器上部署又遇到了三个问题,在此做一篇续给大家提醒。
问题环境:
两台测试服务器,部署在阿里云上,只有内网网卡;
多台生产服务器,部署在阿里云上,有内网网卡和外网网卡;
之所以提到这个是因为后面的一个问题就是由此产生的,后面会详细描述。
有关的配置以及Provider和Consumer端的代码可以查阅我的这篇博文:
Dubbo服务环境搭建以及Dubbo服务的提供者和消费者配置详解,在此不再赘述。
问题一: 部署测试服务器,以下是Provider端配置:
<dubbo:application name="sms_dubbo_provider" />
<dubbo:registry address="zookeeper://11.12.13.14:2181" check="false"/>
<dubbo:protocol host="11.12.13.14" name="dubbo" port="20889"></dubbo:protocol>
<dubbo:service interface="yourpackage.ISendMessageService" ref="sendMessageService" timeout="1200000" />
用consumer端访问后报出无法找到服务的错误:
client(url: dubbo://11.12.13.14:20889/yourpackage.ISendMessageService?application=sms_dubbo_provider&codec=dubbo&dubbo=2.5.3&heartbeat=60000&interface=yourpackage.ISendMessageServicemethods=getOrderByPhone,getMemberByPhone&pid=&4439&revision=0.0.1-SNAPSHOT&side=provider&timeout=1200000×tamp=1490081969782) failed to connect to server /11.12.13.14:20889, error message is:Connection refused
证明Provider无法触及到,找不到这个服务提供者。打开Dubbo监控,类似于一下页面:
我这里有一个服务请忽略,此时应该是没有任何的记录在这里显示,同时统计画面中也会显示提供者为0。因此可以证明此时的服务Provider没有部署成功。
这里就要提到之前的问题环境了,我此时部署的是测试服务器,他们只有内网的网卡,也就是说,host中我指定的是我测试服务器的外网IP,阿里云服务在接到这个host的时候就会按照这个IP去找我的服务提供者然后提供给zookeeper纳入管理,但是由于服务器只有内网IP,他只能映射成阿里云识别的内网地址,因此无法找到这个IP,自然不能成功对外开放出服务来,此时部署不会报错,但是消费的时候就会报出以上的错误,同时也监控不到这个Provider。
那我们只要交给他自己去找本地的IP其实就可以了,因此这里:
<dubbo:protocol host="localhost" name="dubbo" port="20889"></dubbo:protocol>
我们将host写成localhost。这样就会找到一个阿里云自己的内网IP地址,这里有两台测试服务器,就会生成两个IP地址对应的服务。
可以看到这是一个DubboProvider的详情,主机名的位置会显示一个内网IP。
反推生产环境,host就可以写你部署Dubbo Provider的那台生产服务器的外网地址。
问题二:生产环境中在相互独立的项目中,提供不同的Dubbo Provider。
我第一次部署了一个项目,其中包含多个接口服务,作为一个Dubbo Provider,也就是提供一套Provider配置。当我需要在另外一个项目中(此时这个项目是独立于之前的项目,并且没有依赖关系的),配置另一个Dubbo Provider的时候看看我都遇到了什么问题:
首先,看以下报错信息:
org.jboss.netty.channel.ChannelException: Failed to bind to: /11.12.13.14:20889
Caused by:
java.net.BindException: Address already in use
很明显这是一个端口占用的问题。因为是两个项目中的两个Provider,我的配置文件在这一行都用了20889的端口号:
<dubbo:protocol host="11.12.13.14" name="dubbo" port="20892"></dubbo:protocol>
这个错误属于入门级别,两个独立的项目中的配置很容易就会复制黏贴,而且忘记修改port。所以算是提个醒吧。
而且当出现这个错误时还会想到上面的这行配置是不是不能相同:
<dubbo:application name="dubbo_provider" />
可以明确说,这行是能用同样的名字的,而且如果不用同样的名字,后部署上的Provider会在Dubbo监控页面报出黄色警告:
点开后会看到黄色警告的详细信息:
可以看到,dubbo对外提供的是一个整体的应用,可以提供不同的接口服务在应用中,所以application name应该写一样的名字,当你要独立出一套应用在不同的机器上部署时可以用不同的名字。配置成一样的以后就不会显示⚠️了。
OK,谢谢你看到这里,我遇到的问题就是这些,因为没有大规模并发,所以问题还是比较简单的,算是给初学者提个醒吧。