从 gRPC 服务中调用时,gRPC 客户端不工作
gRPC client not working when called from within gRPC service
快速免责声明,我对gRPC和RPC总体上还是很陌生,所以请耐心等待
我在同一个 java 应用程序上有两个 gRPC 服务器 运行,Service A
和 Service 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();
}
当我 运行 这个应用程序时,对 Service A
进行了 RPC 并创建了调用 addPeer
的客户端连接,抛出一个不明确的异常,io.grpc.StatusRuntimeException: UNKNOWN
然后导致 JVM 关闭。我不知道如何解决这个问题,或者是否有可能在 gRPC 服务器中创建 gRPC 客户端连接
对于我所有的 gRPC 服务器实现,我都使用 阻塞 存根。
<grpc.version>1.16.1</grpc.version>
<java.version>1.8</java.version>
我几乎碰壁了,所以任何信息将不胜感激
UNKNOWN 消息是服务器端的异常,未传递给客户端。
您可能需要提高服务器上的日志级别以尝试找到根本原因。
在这个posthere中,
像下面这样创建频道,让它看到更有意义的错误消息:
ManagedChannel channel = NettyChannelBuilder.forAddress( host, port )
.protocolNegotiator(ProtocolNegotiators.serverPlaintext() )
如果 A 和 B 在同一个应用程序中,您是否考虑过直接调用函数或至少使用 InProcessChannelBuilder and InProcessServerBuilder?
如其他地方所述,在当前设置中,您可以尝试提高服务器端(在 B 中)的日志级别以查看异常的来源。
快速免责声明,我对gRPC和RPC总体上还是很陌生,所以请耐心等待
我在同一个 java 应用程序上有两个 gRPC 服务器 运行,Service A
和 Service B
。
Service A
创建 Service B
的 多个客户端 ,然后同步调用 Service B
服务器
Service A
有一个由 .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 服务器实现,我都使用 阻塞 存根。
<grpc.version>1.16.1</grpc.version>
<java.version>1.8</java.version>
我几乎碰壁了,所以任何信息将不胜感激
UNKNOWN 消息是服务器端的异常,未传递给客户端。 您可能需要提高服务器上的日志级别以尝试找到根本原因。
在这个posthere中, 像下面这样创建频道,让它看到更有意义的错误消息:
ManagedChannel channel = NettyChannelBuilder.forAddress( host, port )
.protocolNegotiator(ProtocolNegotiators.serverPlaintext() )
如果 A 和 B 在同一个应用程序中,您是否考虑过直接调用函数或至少使用 InProcessChannelBuilder and InProcessServerBuilder?
如其他地方所述,在当前设置中,您可以尝试提高服务器端(在 B 中)的日志级别以查看异常的来源。