braised panda 2019-10-21 11:46 采纳率: 100%
浏览 2373
已采纳

Dubbo服务部署到服务器上,从本地访问服务器上的服务访问不通


/----------原问题----------/(问题已经解决,答案在后文)




如题,项目使用的是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

https://www.jianshu.com/p/7c29a24a917d

  • 写回答

2条回答 默认 最新

  • _鹿慕溪水 2019-10-21 16:02
    关注

    1.检测provider端是否正常启动运行
    2.在customer端所在的服务器上telent一下provider端的ip+端口号,看看是否能正常通信,同样的操作在provider端也telent一下customer端的服务器
    3.检测项目中的其他请求连接,比如数据库的连接参数是否正确,防止因为其他的请求失败导致dubbo的timeout,检测服务的提供方内部是否正常,在出现此异常时应该检查服务提供方的项目日志,看看是否是因为提供方的异常导致dubbo的timeout
    4.修改dubbo的timeout参数

    <dubbo:provider delay="-1" timeout="6000" retries="0"/>
    

    以上是我能想到的一些问题排查方法,希望能对你有所帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀
  • ¥15 mifare plus卡认证
  • ¥30 LSTM预测结果是一条直线
  • ¥15 stnodeeditor自定义控件
  • ¥15 SDO如何更改STM32的波特率
  • ¥15 uniapp的uni-datetime-picker组件在ios端不适配
  • ¥15 前端 uniapp App端在离线状态如何使用modbus 连接手机蓝牙进行读写操控机器?