【发布时间】:2018-08-17 02:39:32
【问题描述】:
我正在尝试将 Thrift 客户端(客户端)连接到同一主机上的 Thrift 服务器(服务器);服务器和客户端必须在不同的 docker 容器中。
我正在使用 Apache Thrift 的 Python 实现,Thriftpy v0.3.9。宿主机是 Ubuntu 16.04,Docker 是 18.06.0-ce 版本,docker-compose 是 1.17.0 版本。我正在使用 python:3.6.6-alpine3.8 图像。
只要没有容器化,我就可以成功地将客户端连接到同一主机上的服务器。但是,我需要它们在容器中。
我的 docker-compose.yml:
version: "3"
services:
thrift_client:
build: .
ports:
- "6002:6000"
links:
- thrift_server
thrift_server:
image: thrift_server
ports:
- "6001:6000"
服务器运行成功。但是,客户端会出现以下异常:
"无法连接到 %s" % str(addr)) thriftpy.transport.TTransportException: TTransportException(type=1, message="Could not connect to ('thrift_server', 6000)")
我正在关注下面链接的这个小演示,只有轻微的偏差,以便使用 docker 进行操作。 https://thriftpy.readthedocs.io/en/latest/
我的 pinpong.thrift 文件:
service PingPong {
string ping(),
}
thrift_server.py:
import thriftpy
pingpong_thrift = thriftpy.load("pingpong.thrift", module_name="pingpong_thrift")
from thriftpy.rpc import make_server
class Dispatcher(object):
def ping(self):
return "pong"
server = make_server(pingpong_thrift.PingPong, Dispatcher(), 'localhost', 6000)
server.serve()
thrift_client.py:
import thriftpy
pingpong_thrift = thriftpy.load("pingpong.thrift", module_name="pingpong_thrift")
from thriftpy.rpc import make_client
client = make_client(pingpong_thrift.PingPong, 'thrift_server', 6000)
client.ping()
同样,这在主机上不使用 Docker 也能正常工作。当然,在没有 Docker 的情况下,我使用 'localhost' 代替 'thrift_server' 作为客户端。
【问题讨论】:
-
您的 YAML 缩进似乎已关闭。你能解决这个问题吗?
-
我修好了。谢谢。
-
如果在服务器代码中将
’localhost’更改为’0.0.0.0’,它会按预期工作吗? -
是的,服务器代码可以改为“0.0.0.0”。您的建议促使我发现我在回答我自己的问题时提供的 docker 命令中存在错误。您必须在 docker 命令中使用“0.0.0.0”,或者我想是“127.0.0.1”,而不是显式使用“localhost”。相应地修正了答案。谢谢。
-
@szignal - 你找到解决方案了吗?我也有类似的情况。我有节俭的服务器和客户端。如果没有 docker,它可以正常工作,但如果服务器在容器中,客户端会收到 TSocker 读取 0 字节异常。
标签: python docker docker-compose thrift