从 gRPC 服务中调用时 gRPC 客户端不工作

Igg*_*ydv 6 java distributed-system grpc

快速免责声明,我对 gRPC 和 RPC 很陌生,所以请耐心等待

我有两个 gRPC 服务器运行在同一个 java 应用程序上,Service A并且Service B. Service A创建多个客户端Service B,然后同步到做的各种实例调用Service B

服务器

Service A有一个由.proto文件定义的 rpc 调用

rpc notifyPeers(NotifyPeersRequest) returns (NotifyPeersResponse);
Run Code Online (Sandbox Code Playgroud)

服务器端实现,

@Override
public void notifyPeers(NotifyPeersRequest request, StreamObserver<NotifyPeersResponse> responseObserver) {
    logger.debug("gRPC 'notifyPeers' request received");
    String host = request.getHost();
    
   
    for (PeerClient c : clients.values()) {   
        c.addPeer(host);    // <----  this call
    }

    NotifyPeersResponse response = NotifyPeersResponse.newBuilder()
            .setResult(result)
            .build();

    responseObserver.onNext(response);
    responseObserver.onCompleted();
}
Run Code Online (Sandbox Code Playgroud)

对等点列表clients是在之前的 rpc 调用中建立的。

ManagedChannel channel = ManagedChannelBuilder.forTarget(peer).usePlaintext().build();
ClientB client = new ClientB(channel);
clients.put(peer, client);
Run Code Online (Sandbox Code Playgroud)

客户端

rpc addPeer(AddPeerRequest) returns (AddPeerResponse);rpc addPeer(AddPeerRequest) returns (AddPeerResponse);
Run Code Online (Sandbox Code Playgroud)

服务器端实现,

@Override
public void addPeer(AddPeerRequest addPeerRequest, StreamObserver<AddPeerResponse> responseObserver)  {
    logger.info("gRPC 'addPeer' request received");
    boolean result = peer.addPeer(host);
    AddPeerResponse response = AddPeerResponse.newBuilder()
                .setResponse(result)
                .build();
    responseObserver.onNext(response);
    responseObserver.onCompleted();
Run Code Online (Sandbox Code Playgroud)

客户端实现,

public boolean addPeer(String host) {
    AddPeerRequest request = AddPeerRequest.newBuilder().setHost(host).build();
    logger.info("Sending 'addPeer' request");
    AddPeerResponse response = blockingStub.addPeer(request);
    return response.getResponse();
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个应用程序,并创建一个 RPCService A并创建调用 的客户端连接时 addPeer,会抛出一个不明确的异常,io.grpc.StatusRuntimeException: UNKNOWN然后导致 JVM 关闭。我不知道如何解决这个问题,或者是否可以在 gRPC 服务器中创建 gRPC 客户端连接

对于我所有的 gRPC 服务器实现,我都使用阻塞存根。

<grpc.version>1.16.1</grpc.version> <java.version>1.8</java.version>

我几乎撞到了一堵砖墙,所以任何信息都将不胜感激

edu*_*nti 2

UNKNOWN消息是服务器端未传递给客户端的异常您可能需要提高服务器上的日志级别才能尝试找到根本原因。

在这篇文章中创建如下所示的通道,使其能够看到更有意义的错误消息:

ManagedChannel channel = NettyChannelBuilder.forAddress( host, port )
                .protocolNegotiator(ProtocolNegotiators.serverPlaintext() )
Run Code Online (Sandbox Code Playgroud)