我正在实现一个gRPC客户端和服务器应用程序,其中包含了我的gRPC服务器。其思想是使用Unix域套接字在客户端和服务器之间进行通信。我的应用程序正常工作,直到我的服务器没有被装上容器。
当我封装我的gRPC服务器时,问题就出现了。在这种情况下,我的客户端无法到达gRPC服务器。下面是我收到的错误消息。
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客户端代码:
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服务器代码:
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容器时将此路径挂载到套接字上。
docker run -v /service/test.sock:/service/test.sock:rw grpc_sock_new
根据我的理解,解决问题的关键是下面的代码行。
server.add_insecure_port('unix:///service//test.sock')
请指点。
发布于 2022-06-17 11:55:03
在gRPC服务器代码:server.add_insecure_port('unix:///service//test.sock')
中,您可能使用的斜杠数比这一行中所要求的要多
试着用这个代替:server.add_insecure_port('unix:///service/test.sock')
编辑: 1
您应该使用对接绑定挂载在您的对接主机上共享一个套接字到两个容器。请参阅在容器之间共享主机套接字。 Ex:
docker run -d --name "server" -v /var/run/test.sock:/var/run/test.sock server_image:version
参考资料:
https://stackoverflow.com/questions/72646803
复制相似问题