/----------原问题----------/(问题已经解决,答案在后文)
如题,项目使用的是dubbo+nacos,在本地上启动provider端和customer端,可以正常访问。 (provider和customer端同时部署到服务器上,也可以正常访问)
但是,把provider端部署到linux服务器上,再从本地启动customer端就访问不了,一直显示超时(两者分开部署,访问显示超时)...
org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2019-10-21 11:32:02.027, end time: 2019-10-21 11:32:12.047, client elapsed: 1 ms, server elapsed: 10018 ms, timeout: 10000 ms, request: Request [id=5, version=2.0.2, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=sayHello, parameterTypes=[], arguments=[], attachments={path=com.braisedpanda.suanfa.service.TestService, activelimit_filter_start_time=1571628722027, interface=com.braisedpanda.suanfa.service.TestService, version=1.0.0, timeout=10000}]], channel: /172.215.1.27:50876 -> /172.17.0.2:20880
at org.apache.dubbo.remoting.exchange.support.DefaultFuture.doReceived(DefaultFuture.java:189) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.remoting.exchange.support.DefaultFuture.received(DefaultFuture.java:153) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.remoting.exchange.support.DefaultFuture$TimeoutCheckTask.run(DefaultFuture.java:252) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.common.timer.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:648) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.common.timer.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:727) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.common.timer.HashedWheelTimer$Worker.run(HashedWheelTimer.java:449) ~[dubbo-2.7.3.jar:2.7.3]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_211]
网页报错:
配置:
部署linux:
网上各种方法都试过了,折腾一周了还是不行,
设置timeout时间,关闭Linux防火墙,删除了连接数据的代码,直到后来我甚至怀疑服务器有问题,又租了台服务器测试还是不行.......
快要崩溃了...
希望有大佬能指出问题...
/----------以下是问题解决方案----------/
####先说下问题出现的原因:
dubbo服务部署在linux服务器上时,它默认使用的是linux系统的内网,对外暴露的是内网的地址,这就导致我本地项目访问该服务器服务时,访问不通,出现超时错误。这就解释了为什么服务端和消费端同时部署在本地,或者同时部署在服务器上时,可以畅通无阻的访问了。
如图片所示,我原先注册的服务全是172开头的内网,本地访问不通。后来修改了之后,dubbo对外暴露外网,可以顺利访问。
至于如何让dubbo在linux部署时暴露外网服务,网上有很多教程,说什么修改linux hosts主机名和公网ip,修改linux DNS地址,甚至还有禁用linux网卡..
这些我都试过了,全都没用~ 每个人的情况都不一样,可能对有些人有用
####我的解决办法:
1、 我在项目配置中添加了:
spring.cloud.nacos.discovery.ip=39.98.131.xxx
(这个ip地址,是你要部署服务器的公网地址。 比如你要部署到公网地址为39.98.131.588这台服务器上, 那上面就写39.98.131.588)
2、docker 运行镜像时,添加 DUBBO_IP_TO_REGISTRY语句
docker run -d -e DUBBO_IP_TO_REGISTRY=39.98.131.xxx -e DUBBO_PORT_TO_REGISTRY=20880 -p 20880:20880 --name xxx xxxx(镜像名称)
这下,这个问题终于解决了,真的坑,折腾我好久了,麻蛋~
下面贴上我的配置,仅供参考,方面同样被这个问题困扰的小伙伴早点脱困
bootstrap.yml
##应用名称
spring:
main:
allow-bean-definition-overriding: true
# profiles:
# active: public
cloud:
nacos:
discovery:
enabled: true
register-enabled: true
server-addr: ${spring.cloud.nacos.config.server-addr}
namespace: ${spring.cloud.nacos.config.namespace}
config:
server-addr: 47.98.135.xxx:8848
group: provider
namespace: c229ab10-2e39-4444-be97-048b3a5ef49d
file-extension: yaml
application.properties
spring.application.name=balance-suanfa-provider
dubbo.application.name=balance-suanfa-provider
dubbo.scan.base-packages=com.braisedpanda.suanfa.service
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
#这个本地测试就注释吧,部署到服务器上时,根据服务器公网填写
#spring.cloud.nacos.discovery.ip=39.98.131.xxx
dubbo.registry.address=nacos://47.98.135.xxx:8848
dubbo.provider.loadbalance=myRoundRobin
#dubbo.provider.actives=8
#dubbo.provider.executes=8
dubbo.provider.dispatcher=message
dubbo.provider.threadpool=cached
dubbo.provider.timeout=50000
dubbo.provider.delay=-1
dubbo.application.dump-directory=/tmp
dubbo.provider.cluster=failfast
dubbo.consumer.check=false
dubbo.registry.check=false
附上两篇有用的参考连接:
https://juejin.im/post/5b2072016fb9a01e2d704431