英文:
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' 请求已接收");
String host = request.getHost();
for (PeerClient c : clients.values()) {
c.addPeer(host); // <---- 此调用
}
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' 请求已接收");
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("发送 'addPeer' 请求");
AddPeerResponse response = blockingStub.addPeer(request);
return response.getResponse();
}
当我运行此应用程序并且对Service A
进行RPC调用并创建客户端连接以调用addPeer
时,会抛出模棱两可的异常io.grpc.StatusRuntimeException: UNKNOWN
,然后导致JVM关闭。我不知道如何修复这个问题,或者是否在gRPC服务器内部创建gRPC客户端连接是否可行。
对于我所有的gRPC服务器实现,我都使用阻塞的 stubs。
<grpc.version>1.16.1</grpc.version>
<java.version>1.8</java.version>
我几乎陷入了困境,所以任何信息都将不胜感激。
英文:
Quick disclaimer, I am very new to gRPC and RPC in general, so please have patience
I have two gRPC servers running on the same java application, Service A
and Service B
.
Service A
creates multiple clients of Service B
which then synchronously makes calls to the various instances of Service B
The server
Service A
has a rpc call defined by the .proto
file as
rpc notifyPeers(NotifyPeersRequest) returns (NotifyPeersResponse);
the server side implementation,
@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();
}
The list of peers, clients
are built up in previous rpc calls.
ManagedChannel channel = ManagedChannelBuilder.forTarget(peer).usePlaintext().build();
ClientB client = new ClientB(channel);
clients.put(peer, client);
The client
rpc addPeer(AddPeerRequest) returns (AddPeerResponse);rpc addPeer(AddPeerRequest) returns (AddPeerResponse);
the server side implementation,
@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();
the client side implementation,
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();
}
When I run this application, and an RPC is made to Service A
and the client connection is created that calls addPeer
, an ambiguous exception is thrown, io.grpc.StatusRuntimeException: UNKNOWN
which then causes the JVM to shut down. I have no idea how to fix this, or whether it is even possible to create an gRPC client connection within a gRPC server
for all of my gRPC server implementations I'm using blocking stubs.
<grpc.version>1.16.1</grpc.version>
<java.version>1.8</java.version>
I've pretty much hit a brick wall, so any information will be appreciated
答案1
得分: 1
UNKNOWN消息是服务器端的异常,未传递给客户端。
您可能需要增加服务器上的日志级别以尝试查找根本原因。
在此帖子这里中,
像下面这样创建通道,可以使您看到更有意义的错误消息:
ManagedChannel channel = NettyChannelBuilder.forAddress( host, port )
.protocolNegotiator(ProtocolNegotiators.serverPlaintext() )
英文:
The UNKNOWN message is an exception on the server side that was not passed to the client.
You probably need to increase the log level on the server to try to find the root cause.
In this post here ,
creating the channel like below, enable it to see a more meaningful error message:
ManagedChannel channel = NettyChannelBuilder.forAddress( host, port )
.protocolNegotiator(ProtocolNegotiators.serverPlaintext() )
答案2
得分: 0
如果A和B在同一个应用程序中,您是否考虑过进行直接函数调用,或者至少使用InProcessChannelBuilder和InProcessServerBuilder?
如其他地方所提到的,在当前设置中,您可以尝试增加服务器端(B)的日志级别,以查看异常的源头。
英文:
If A and B are in the same application have you considered making direct function calls or at least using the InProcessChannelBuilder and InProcessServerBuilder?
As mentioned elsewhere, in the current setup you can try increasing the log level on the server side (in B) to see the source of the exception.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论