解决grpc连接Dial成功状态却变为TransientFailure

这篇具有很好参考价值的文章主要介绍了解决grpc连接Dial成功状态却变为TransientFailure。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 如有帮助,欢迎留下足迹哦!

详情如下


code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 192.168.31.33:9001: 
connectex: No connection could be made because the target machine actively refused it."

此时连接状态为 TransientFailure

目录

背景

现象汇总

分析与解决

总结与附录


背景


GRPC客户端与服务端建立连接时我们都知道需要先Dial,报该错时实际上Dial操作是成功的,此时err为nil,但调用rpc接口时失败,报了该错。

现象汇总


1,  将客户端与服务端均放在本机,且地址写本机地址时也报改错,Dial成功,调用rpc接口失败;
Dial成功时的连接状态为Connecting,调用rpc接口失败前的连接状态变为TransientFailure;
    
  这两状态是什么意思呢?看下源码:

    const (
    // Idle indicates the ClientConn is idle. Idle 表示 ClientConn 处于空闲状态。
    Idle State = iota
    // Connecting indicates the ClientConn is connecting.  Connecting 表示 ClientConn 正在连接。
    Connecting
    // Ready indicates the ClientConn is ready for work. Ready 表示 ClientConn 已准备好工作。
    Ready
    // TransientFailure indicates the ClientConn has seen a failure but expects to recover.  TransientFailure 表示 ClientConn 已经看到失败但希望恢复。
    TransientFailure
    // Shutdown indicates the ClientConn has started shutting down.  Shutdown 表示 ClientConn 已经开始关闭。
    Shutdown
)


2, 将客户端与服务端均放在本机,且地址写127.0.0.1时成功,调用rpc接口也成功,一切正常;

3,将客户端与服务端均放在不同主机,且启动服务地址写127.0.0.1、客户端连接地址写服务端ip时失败也报改错,Dial成功,调用rpc接口失败;

不禁让人纳闷,到底是哪的问题?

分析与解决

以上现象出现时,服务端所在主机已开放了端口号为9001的tcp端口,因此排除端口开放问题;

另外,客户端与服务端均在本机时可成功,而在不同主机不成功,就说明了大概率还是网络不通方面的问题;

与此同时进行抓包,发现有从客户端流向服务端主机的包且端口正确,但来回都是R.和S的标记交替着,服务端给客户端一直回复R. 表明连接异常一直在被重置,同时这样的回复实际也和服务端未启动服务时的情形一致;

根据以上现象,基本确定是客户端没有识别到服务端的启动(实际上服务端启动着)

最终一步步摸排得知,启动服务时监听地址写的是:

net.Listen("tcp", fmt.Sprintf("%s:%s", "127.0.0.1", 9001))

以下几种写法均正常:

net.Listen("tcp", fmt.Sprintf(":%s", 9001))
net.Listen("tcp", fmt.Sprintf("%s:%s", "本机IP", 9001))
net.Listen("tcp", fmt.Sprintf("%s:%s", "0.0.0.0", 9001))

其中第一、三个启动后打印出来的服务地址是[::]:9001
第二种是 ip:9001

总结与附录

那么总结一下原因,实际上就是127.0.0.1启动时仅本机可连接成功,只作用在本机,因为它是本机回环地址,
正常的网络包从3层进入2层,然后发出去,而发向回环地址的包,直接在IP层短路了,也就是发到IP层时直接被IP层接收、不再向下发送;
也就是说对于本机单机测试时可以直接用127.0.0.1。

1、如果监听地址是127.0.0.1:port,表示仅监听环回接口的数据,即本机发送给本机port端口的数据,其他主机发送过来的数据无法接收到。
2、如果监听地址是0.0.0.0:port,表示监听所有网络接口的数据,包括回环接口和其他网络接口,所有本机和其他主机发送的数据都可以接收到。
3、如果监听地址是本机ip:port,表示仅监听本机ip对应的网络接口。仅接收目的地址是本机ip的数据。(对本机发送给本机这种情况,如果目的主机地址是127.0.0.1则,收不到,仅当目的主机地址是本机ip时能够收到)。

实际上0.0.0.0风险较大,建议使用本机IP为妥。文章来源地址https://www.toymoban.com/news/detail-767910.html

到了这里,关于解决grpc连接Dial成功状态却变为TransientFailure的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PHP连接Apache不成功的解决方法

    PHP是一种在Web开发中非常常用的编程语言,但在使用PHP时,有时会遇到连接Apache不成功的问题。这个问题主要是因为服务器的配置问题所导致的。在本文中,我们将探讨如何解决PHP连接Apache不成功的问题。 检查配置文件 首先,我们需要检查PHP和Apache的配置文件是否正确。在

    2023年04月11日
    浏览(38)
  • 成功解决:CentOS7中无法连接网络

    centos的ip地址是ens33条目中的inet值。如果ens33 没有 inet 这个属性,那么就没法通过IP地址连接虚拟机。 修改ens33网卡的配置 修改为yes 然后再次查看ip、发现成功

    2024年02月11日
    浏览(50)
  • Navicat数据库连接成功,密码忘记如何解决

    文章转载自:Navicat已经成功连接,密码忘记的解决方法_铁打的阿秀的博客-CSDN博客 解决方法 目录 解决方法 一:通过注册表找到数据库连接的密码,再通过PHP解密 二.通过Navicat导出连接,找到连接密码,再通过PHP进行解密 一:通过注册表找到数据库连接的密码,再通过PHP解

    2024年02月11日
    浏览(47)
  • 【fly-iot飞凡物联】(12):EMQX 5.1使用docker 本地部署,接入到Actorcloud的数据库中,成功连接创建的设备,可以控制设备访问状态

    本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/108971807 fly-iot飞凡物联专栏: https://blog.csdn.net/freewebsys/category_12219758.html 未经博主允许不得转载。 博主CSDN地址是:https://blog.csdn.net/freewebsys 博主掘金地址是:https://juejin.cn/user/585379920479288 博主知乎地址是:https://www.zh

    2024年02月11日
    浏览(55)
  • 成功解决Android设备adb连接后显示device unauthorized

    在电脑通过USB连接新的Android设备,想要通过adb来进行一些操作时,却发现命令提示符上在输入下面命令后显示设备未授权的信息也就是\\\"unauthorized\\\" 有人提出的解决方案是打开Android设备的 开发者选项 中的 USB调试 ,但笔者在之前已经打开了,由此可知问题并不与此相关。 通过

    2024年02月13日
    浏览(51)
  • SpringCloudAlibaba 应用webSocket,解决连接成功后会立刻断开等问题

    最近公司有个大屏,需要做一个实时报警的功能,这就用到了webSocket技术,这个帖子就用来记录学习过程中的遇到的问题,如下是想要达到的效果图  1.第一步肯定是先导入依赖 这里记录第一个坑点,就是可能有的小伙伴会在启动的时候报错,这个是因为websocket和tomcat有冲突

    2024年02月11日
    浏览(57)
  • Kafka-Eagle安装及连接成功web端登陆不了问题解决

    kafka自身并没有集成监控管理系统,因此对kafka的监控管理比较不便,好在有大量的第三方监控管理系统来使用,常见的有: Kafka Eagle KafkaOffsetMonitor Kafka Manager(雅虎开源的Kafka集群管理器) Kafka Web Console 还有JMX接口自开发监控管理系统 以下是3.1.0版TV页面 Kafka-Eagle安装 安装包

    2024年02月08日
    浏览(48)
  • “已成功与服务器建立连接,但是在登录过程中发生错误“的解决方法

    对于上述问题,我也曾被折磨得不轻。 网上找了很多方法,很多就是每个屁用! 别轻易就重新注册一个新的,否则后面可能还需要花时间去把它删了。 首先,我们会看到连接成功但是登陆不上的报错图。  电脑不同,可能也会有所不同。但大致内容就是上述那样。 方法一:

    2024年02月06日
    浏览(131)
  • 关于我在配置zookeeper出现,启动成功,进程存在,但是查看状态却没有出现Mode:xxxxx的问题和我的解决方案

            在我输入:zkServer.sh status 之后出现报错码. 报错码: ZooKeeper JMX enabled by default Using config: /opt/software/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Error contacting service. It is probably not running.          我开始去查看我的日志:         日志上面确实有警告

    2024年02月02日
    浏览(57)
  • 解决手机ADB连接状态为offline的问题

    解决手机ADB连接状态为offline的问题 在进行 Android 开发过程中,我们经常需要使用 ADB(Android Debug Bridge)工具与手机建立连接,以便进行调试和测试。然而,有时候我们可能会遇到手机连接状态显示为\\\"offline\\\"的问题,这会导致无法正常进行调试操作。下面我将介绍一种解决这

    2024年02月08日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包