java - gRPC - 找不到方法

标签 java protocol-buffers grpc-java

我有三个非常简单的微服务(Spring Boot),它们使用 gRPC 进行通信。我最初编写了两个服务:一个客户端(GreeterClient)和一个服务(GreeterService)。客户端将请求消息传递给服务,服务将响应返回给客户端。我能够让这两项服务协同工作。

添加第三个服务后,现服务组织如下:

GreeterClient:将请求消息传递给 GreeterService,等待响应。

GreeterService:收到来自 GreeterClient 的请求后,调用 GreetingProviderService 进行“问候”,并期待响应。一旦收到响应,就会对 GreeterClient 做出响应并返回。

GreetingProviderService:收到 GreeterService 的调用后,返回响应。

每个微服务都包含在自己的项目中。第四个项目仅包含定义 RPC 服务和消息的 protobuf 文件。每个微服务项目都将其作为依赖项引用。

我遇到了 GreeterService 无法找到 GreetingProviderService getGreeting “端点”的问题。 GreeterClient 找到 GreeterService 端点没有问题。我不知道出了什么问题。

下面是来自 GreeterService 的控制台的一部分:

2020-01-23 10:52:49.671 DEBUG 5108 --- [-worker-ELG-1-3] io.grpc.netty.NettyClientHandler         : [id: 0x758853f0, L:/127.0.0.1:55380 - R:/127.0.0.1:9310] OUTBOUND HEADERS: streamId=3 headers=GrpcHttp2OutboundHeaders[:authority: 127.0.0.1:9310, :path: /edu.mit.ll.GreetingProvider/GetGreeting, :method: POST, :scheme: http, content-type: application/grpc, te: trailers, user-agent: grpc-java-netty/1.25.0, grpc-accept-encoding: gzip] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false 2020-01-23 10:52:49.677 DEBUG 5108 --- [-worker-ELG-1-3] io.grpc.netty.NettyClientHandler         : [id: 0x758853f0, L:/127.0.0.1:55380 - R:/127.0.0.1:9310] OUTBOUND DATA: streamId=3 padding=0 endStream=true length=5 bytes=0000000000
2020-01-23 10:52:49.743 DEBUG 5108 --- [-worker-ELG-1-3] io.grpc.netty.NettyClientHandler         : [id: 0x758853f0, L:/127.0.0.1:55380 - R:/127.0.0.1:9310] INBOUND HEADERS: streamId=3 headers=GrpcHttp2ResponseHeaders[:status: 200, content-type: application/grpc, grpc-status: 12, grpc-message: Method not found: edu.mit.ll.GreetingProvider/GetGreeting] streamDependency=0 weight=16 exclusive=false padding=0 endStream=true
2020-01-23 10:52:49.751 DEBUG 5108 --- [-worker-ELG-1-3] io.grpc.netty.NettyClientHandler         : [id: 0x758853f0, L:/127.0.0.1:55380 - R:/127.0.0.1:9310] OUTBOUND RST_STREAM: streamId=3 errorCode=8
2020-01-23 10:52:49.752 ERROR 5108 --- [ault-executor-0] io.grpc.internal.SerializingExecutor     : Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed@1f8dda93

io.grpc.StatusRuntimeException: UNIMPLEMENTED: Method not found: edu.mit.ll.GreetingProvider/GetGreeting
        at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:240)
        at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:221)
        at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:140)
        at edu.mit.ll.grpc.GreetingProviderGrpc$GreetingProviderBlockingStub.getGreeting(GreetingProviderGrpc.java:138)
        at edu.mit.ll.service.GreeterService.sayHello(GreeterService.java:46)
        at edu.mit.ll.grpc.GreeterGrpc$MethodHandlers.invoke(GreeterGrpc.java:217)
        at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:172)
        at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:331)
        at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:814)
        at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
        at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

Protobuf 文件:

greeter.proto:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "edu.mit.ll.grpc";

package edu.mit.ll;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

provider.proto:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "edu.mit.ll.grpc";

import "google/protobuf/empty.proto";

package edu.mit.ll;

service GreetingProvider {
  rpc GetGreeting(google.protobuf.Empty) returns (Greeting) {}
}

message Greeting {
  string greeting = 1;
}

GreeterClient.java:

@Service
public class GreeterClient {
  ...
  @PostConstruct
  public void init() {
    channel = ManagedChannelBuilder.forAddress("127.0.0.1", 9110).usePlaintext()
        .keepAliveWithoutCalls(true).build();
    greeterStub = GreeterGrpc.newBlockingStub(channel);

    taskExecutor.execute(new Runner());
  }

  private class Runner implements Runnable {
    @Override
    public void run() {
        ...
        log.info("making request ...");
        HelloRequest request = HelloRequest.newBuilder().setName(name).build();
        HelloReply reply = greeterStub.sayHello(request);
        log.info("reply: {}", reply.getMessage());
        ...
      }
    }
  }
}

GreeterClient application.yml:

...
grpc:
  port: 9210

GreeterService.java:

@GRpcService
public class GreeterService extends GreeterImplBase {
  ...
  @PostConstruct
  public void init() {
    channel = ManagedChannelBuilder.forAddress("127.0.0.1", 9310).usePlaintext()
        .keepAliveWithoutCalls(true).build();
    providerStub = GreetingProviderGrpc.newBlockingStub(channel);
  }

  @Override
  public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
    Greeting greeting = providerStub.getGreeting(Empty.newBuilder().build());
    HelloReply reply = HelloReply.newBuilder().setMessage(greeting + " " + request.getName())
        .build();
    responseObserver.onNext(reply);
    responseObserver.onCompleted();
  }
}

GreeterService application.yml:

...
grpc:
  port: 9110

GreetingProviderService.java:

public class GreetingProviderService extends GreetingProviderImplBase {
  private static final String[] GREETINGS = { ... };
  ...
  @Override
  public void getGreeting(Empty request, StreamObserver<Greeting> responseObserver) {
    int index = random.nextInt(GREETINGS.length);
    Greeting greeting = Greeting.newBuilder().setGreeting(GREETINGS[index]).build();
    responseObserver.onNext(greeting);
    responseObserver.onCompleted();
  }
}

GreetingProviderService application.yml:

...
grpc:
  port: 9310

最佳答案

[捂脸]

事情总是简单的。我忽略了将 @GRpcService 注释添加到 GreetingProviderService。

添加后,问题就解决了。

关于java - gRPC - 找不到方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59883299/

相关文章:

python - Tensorflow:创建 tf.NodeDef() 并设置属性

python - Python Protobuf 中高效的消息字段设置

java - 将 Google Protocol Buffers 与 Java NIO 结合使用?

java - 如何使用 keystore 在 grpc 中使用 java 启用 ssl

java - 强制 Hibernate 插入而不使用 Select 语句

java - 从线程获取InputObjectStream

Java:使用 FileChannel 写入文件会使文件缩小?

java - INFO : HTTP Status: '404' -> incorrect JSON status mapping for 'unknown error' with GeckoDriver, Firefox 和 Selenium 通过 Java

java - 在 GRPC 中拦截/记录请求和响应

grpc - 如何在 gRPC 的 responseObserver.onError() 中传输详细的异常消息