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

时间:2020-07-30 18:35:01

标签: java grpc distributed-system

快速免责声明,对于gRPC和RPC来说,我一般是新手,所以请耐心等待

我有两个gRPC服务器在同一Java应用程序Service AService B上运行。 Service A创建Service B多个客户端,然后同步调用Service B

的各种实例

服务器

Service A的rpc调用由.proto文件定义为

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();
}

运行此应用程序时,对Service A进行RPC,并创建了调用addPeer的客户端连接,则会抛出一个模棱两可的异常,io.grpc.StatusRuntimeException: UNKNOWN然后导致JVM去关机。我不知道如何解决此问题,也不知道是否有可能在gRPC服务器中创建gRPC客户端连接

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

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

我几乎撞墙了,所以任何信息都会感激

2 个答案:

答案 0 :(得分:1)

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

在此帖子here中, 创建如下所示的频道,使其能够查看更有意义的错误消息:

composer require doctrine/common:2.13.3 --update-with-dependencies

  - Downgrading doctrine/persistence (2.0.0 => 1.3.7): Loading from cache
  - Downgrading doctrine/common (3.0.2 => 2.13.3): Loading from cache

答案 1 :(得分:0)

如果A和B在同一个应用程序中,您是否考虑过直接调用函数或至少使用InProcessChannelBuilderInProcessServerBuilder

如其他地方所述,在当前设置中,您可以尝试提高服务器端的日志级别(在B中),以查看异常的来源。