首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我的gRPC客户端无法连接到托管在同一台计算机上的容器式gRPC服务器

我的gRPC客户端无法连接到托管在同一台计算机上的容器式gRPC服务器
EN

Stack Overflow用户
提问于 2022-06-16 13:36:39
回答 1查看 604关注 0票数 0

我正在实现一个gRPC客户端和服务器应用程序,其中包含了我的gRPC服务器。其思想是使用Unix域套接字在客户端和服务器之间进行通信。我的应用程序正常工作,直到我的服务器没有被装上容器。

当我封装我的gRPC服务器时,问题就出现了。在这种情况下,我的客户端无法到达gRPC服务器。下面是我收到的错误消息。

代码语言:javascript
运行
复制
   raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
        status = StatusCode.UNAVAILABLE
        details = "failed to connect to all addresses"
        debug_error_string = "{"created":"@1655378324.763238318","description":"Failed to pick subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":3217,"referenced_errors":[{"created":"@1655378324.763237121","description":"failed to connect to all addresses","file":"src/core/lib/transport/error_utils.cc","file_line":165,"grpc_status":14}]}"

我正在寻求一些帮助,以了解在我的gRPC客户端或服务器代码中需要哪些修改才能完成这项工作。

gRPC客户端代码:

代码语言:javascript
运行
复制
    import grpc
    import greeting_pb2 as pb2
    import greeting_pb2_grpc as pb2_grpc

class HelloWorldClient(object):
def __init__(self):
    self.host = 'localhost'
    self.server_port = 50051

    #self.channel = grpc.insecure_channel('{}:{}'.format(self.host, self.server_port), options=(('grpc.enable_http_proxy', 0),))
    #self.channel = grpc.insecure_channel('unix:///var/run/test.sock', options=(('grpc.enable_http_proxy', 0),))
    self.channel = grpc.insecure_channel('unix:///service/test.sock', options=(('grpc.enable_http_proxy', 0),))
    self.stub = pb2_grpc.GreeterStub(self.channel)

def get_url(self, message):
    message = pb2.Request(name=message)
    return self.stub.SayHello(message)

if __name__ == '__main__':
    client = HelloWorldClient()
    result = client.get_url(message="Billi")
    print(f'{result}')

gRPC服务器代码:

代码语言:javascript
运行
复制
import grpc
from concurrent import futures
import time
import greeting_pb2_grpc as pb2_grpc
import greeting_pb2 as pb2


import sys
print("Python version")
print (sys.version)

class HelloWorldService(pb2_grpc.GreeterServicer):
    def __init__(self, *args, **kwargs):
        pass

    def SayHello(self, request, context):
        message = request.name
        print("Python version")
        result = f'Hello {message}! Glad to hear from you!'
        result = {'message':result}

        return pb2.Response(**result)

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    pb2_grpc.add_GreeterServicer_to_server(HelloWorldService(), server)
    server.add_insecure_port('unix:///service//test.sock')
    print("Ready To Start")
    server.start()
    print("Server Started")
    server.wait_for_termination()


if __name__ == '__main__':
    serve()

客户端和服务器都运行在同一台主机上,但服务器在Docker容器中运行。我已经在主机和码头容器中创建了一个名为"service“的文件夹,并在运行docker容器时将此路径挂载到套接字上。

代码语言:javascript
运行
复制
docker run -v /service/test.sock:/service/test.sock:rw grpc_sock_new

根据我的理解,解决问题的关键是下面的代码行。

代码语言:javascript
运行
复制
server.add_insecure_port('unix:///service//test.sock')

请指点。

EN

回答 1

Stack Overflow用户

发布于 2022-06-17 11:55:03

在gRPC服务器代码:server.add_insecure_port('unix:///service//test.sock')中,您可能使用的斜杠数比这一行中所要求的要多

试着用这个代替:server.add_insecure_port('unix:///service/test.sock')

编辑: 1

  1. 当您在系统中本地运行时,上面介绍的客户机、服务器代码应该工作得很好,因为这两个代码本质上都运行在同一台计算机上,并且可以很容易地到达所引用的套接字文件。
  2. 如果服务器和客户端都打包在单个容器中运行,则很有可能运行,因为两者都可以访问容器作用域的本地套接字。
  3. 如果您在两个不同的容器中运行服务器和客户机

您应该使用对接绑定挂载在您的对接主机上共享一个套接字到两个容器。请参阅在容器之间共享主机套接字。 Ex:docker run -d --name "server" -v /var/run/test.sock:/var/run/test.sock server_image:version

参考资料:

  1. gRPC中的名称解析。
  2. 这个答案在StackOverflow
  3. 在容器之间共享主机套接字。
  4. 码头装订骑警官方文件
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72646803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档