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

标签 java grpc distributed-system

快速免责声明,我对 gRPC 和 RPC 很陌生,所以请耐心等待
我有两个 gRPC 服务器运行在同一个 java 应用程序上,Service AService B .Service A创建 多个客户Service B然后同步调用 Service B 的各个实例
服务器 Service A有一个由 .proto 定义的 rpc 调用文件为

rpc notifyPeers(NotifyPeersRequest) returns (NotifyPeersResponse);
服务器端实现,
@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();
}
同行名单,clients是在之前的 rpc 调用中建立的。
ManagedChannel channel = ManagedChannelBuilder.forTarget(peer).usePlaintext().build();
ClientB client = new ClientB(channel);
clients.put(peer, client);
客户
rpc addPeer(AddPeerRequest) returns (AddPeerResponse);rpc addPeer(AddPeerRequest) returns (AddPeerResponse);
服务器端实现,
@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();
客户端实现,
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();
}
当我运行这个应用程序时,一个 RPC 被发送到 Service A并且创建了调用 addPeer 的客户端连接,抛出一个不明确的异常,io.grpc.StatusRuntimeException: UNKNOWN然后导致JVM关闭。我不知道如何解决这个问题,或者是否甚至可以在 gRPC 服务器中创建 gRPC 客户端连接
对于我使用的所有 gRPC 服务器实现 阻塞 stub 。<grpc.version>1.16.1</grpc.version><java.version>1.8</java.version>我几乎撞到了一堵砖墙,所以任何信息都将不胜感激

最佳答案

未知 message 是服务器端的一个异常,没有传递给客户端。
您可能需要提高服务器上的日志级别以尝试找到根本原因。
在这篇文章中 here ,
创建如下所示的 channel ,使其能够看到更有意义的错误消息:

ManagedChannel channel = NettyChannelBuilder.forAddress( host, port )
                .protocolNegotiator(ProtocolNegotiators.serverPlaintext() )

关于java - 从 gRPC 服务中调用时 gRPC 客户端不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63179318/

相关文章:

java - 当我运行程序时,我得到 "java.lang.ArithmeticException:/by zero"

c++ - proto c++ 实现 - "marked ‘override’,但不会覆盖“错误

zeromq - ZMQ/0MQ如何实现多个发布者和订阅者?

java - 没有配置 CurrentSessionContext

java - 如何使用 Java 对 AWS S3 SDK 的 getObject 方法进行单元测试?

java - 在 gRPC Java 应用程序中使客户端流同步/阻塞

service - Grpc 服务器在作为 Windows 服务运行时不监听端口 5001

java - 运行 Hadoop MapReduce 作业时如何获取文件名/文件内容作为 MAP 的键/值输入?

c# - 使用 XML-RPC 编写以 C#、Ruby 和 Java 编写的分布式应用程序

java - 获取同一个对象到Android ListView