Apache Thrift 远程服务超时

Posted

技术标签:

【中文标题】Apache Thrift 远程服务超时【英文标题】:Apache Thrift remote service timeout 【发布时间】:2013-10-26 19:39:29 【问题描述】:

我设置 Thrift 来构建两个实体和一个相应的服务。我为 C# 生成了代码,为服务器创建了一个小型控制台应用程序,为测试客户端创建了另一个。我在我的本地机器上运行了两个,它就像一个魅力。但是,当在运行 Windows Server 2012 的 Azure VM 上部署服务器时,在端口 9090 上为 TCP 创建了一个端点,我的客户端无法连接。有超时。

关于 SO 的类似问题:This one is about a php library specific problem 和 this one is about two linux machines。后一个问题接近我的问题,但我可以想象我的问题是 Windows 或 Azure VM 特定的。

我正在使用来自 NuGet 的 Thrift 0.9.0.0。我尝试了 SimpleServer 和 ThreadPoolServer。这就是我在服务器上所做的:

Thrift.Server.TServer server = new Thrift.Server.TThreadPoolServer(new TodoThriftService.Processor(new TodoThriftServiceHandler()), new TServerSocket(9090));

这就是我在客户端上做的事情:

TodoThriftService.Client client = new TodoThriftService.Client(new TBinaryProtocol(new TSocket("my.host.com", 9090)));

我也尝试了服务器 IP 地址而不是它的主机名,但它也不起作用。

netstat -an 输出是:

TCP    0.0.0.0:9090           0.0.0.0:0              LISTENING

来自客户端的 telnet 输出 (telnet my.host.com 9090):

Verbindungsaufbau zu my.host.com...Es konnte keine Verbindung mit dem Host hergestellt werden, auf Port 9090: Verbindungsfehler

德语中的“连接错误”。

当我访问服务器上的http://canyouseeme.org/ 并检查端口 9090 时,输出为:

Error: I could not see your service on 123.34.567.890 on port (9090). Reason: Connection timed out

当我在服务器上使用 Wireshark 嗅探数据包时,输出是:

1   0.000000000 12.3.456.78 12.34.567.89    TCP 66  53566 > websm [SYN] Seq=0 Win=8192 Len=0 MSS=1452 WS=256 SACK_PERM=1

还有两次重传。

注意:Wireshark 中显示的目标 IP 与 canyouseeme.org 确定的 IP 不同。

另请注意:来自我的测试客户端以及来自 canyouseeme.org 的连接尝试都显示在 Wireshark 中。

我的服务器控制台应用程序有问题吗?它在我的本地机器上运行良好。

【问题讨论】:

有人报告问题时最常用的句子:“是的,但它在我的本地机器上运行良好!”。我希望,我每次听到它都能得到一个美元。 => §1 您的开发环境极不可能与所需的产品环境相匹配。您将拥有更少的权利,更少的权限,并且可能会做更少的事情,因为环境可能被锁定和/或更好的防火墙。唯一的建议是找出连接被阻止的原因。我认为 canyouseeme 可能是对的。 嗯,当然环境不同,但这不是重点(我也没有提出任何其他要求)。当我(和其他人)指出某些东西在他们的本地机器上工作时,对于愿意提供帮助的人来说,这不仅是有用而且是必要的信息,因此他们知道什么有效,什么无效,并缩小问题的可能来源.不是吗?还是只是粗体文本部分让您感到困扰? -> 改变了它。 【参考方案1】:

因为 netstat 报告您的服务器正在在 9090 上侦听,并且因为 tcpdump 报告 SYN 数据包到达 9090,所以肯定有其他东西阻塞了客户端。 p>

在这种情况下,我怀疑是某种本地防火墙(因为数据包确实到达了,但操作系统应该用 SYN 数据包应答,而你没有看到)。检查 Windows 防火墙以确保端口 9090 已打开。

【讨论】:

谢谢安德鲁,就是这样!我将编译后的 MyThriftService.exe 添加到 Windows 防火墙中允许的应用程序中,它现在可以工作了。设置可以在这里找到:控制面板\系统和安全\Windows防火墙\允许的应用程序,然后“允许另一个应用程序”->“浏览”->“添加”。我被 Azure“端点”愚弄了——我认为它可以处理所有事情,因为它可以与 MS SQL、远程桌面和 Visual Studio Web 部署端口一起使用。

以上是关于Apache Thrift 远程服务超时的主要内容,如果未能解决你的问题,请参考以下文章

Thrift远程过程调用

RPC框架实践之:Apache Thrift

RPC框架实践之:Apache Thrift

RPC框架实践之:Apache Thrift

RPC框架实践之:Apache Thrift

RPC框架实践之:Apache Thrift