从构造函数调用另一个 GRPC 服务

Calling another GRPC service from a constructor

在 GRPC 中...在响应任何请求之前调用另一个 GRPC 服务最有效的方法是什么?

我这里的代码看起来有点乱...在 GreetingServiceImpl 的构造函数中,我启动了一个 Thread 只是为了获取 来自不同端口上的 GreetingServiceRepository 服务 运行 的某种问候语列表?

所以用例是这样的...有一个 GRPC 服务 GreetingsRepository,其中包含问候语列表和 调用 GreetingsRepository 的 GreetingServiceImpl。我想自定义响应以便我可以 return 自定义响应 对于每个请求....

public class MyGrpcServer {
  static public void main(String [] args) throws IOException, InterruptedException {
    Server server = ServerBuilder.forPort(8080)
        .addService(new GreetingServiceImpl()).build();

    System.out.println("Starting server...");
    server.start();
    System.out.println("Server started!");
    server.awaitTermination();
  }

  public static class GreetingServiceImpl extends GreetingServiceGrpc.GreetingServiceImplBase {

    public GreetingServiceImpl(){
        init();
    }
    public void init(){
        //Do initial long running task
        //Like running a thread that will call another service from a repository
        Thread t1 = new Thread(){
            public void run(){
                //Call another grpc service
                 ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8081)
                    .usePlaintext(true)
                    .build();

                GreetingServiceRepository.eGreetingServiceRepositoryBlockingStub stub =
                    GreetingServiceRepositoryGrpc.newBlockingStub(channel);
                //Do something with the response
            }
        }
        t1.start();
    }

    @Override
    public void greeting(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
      System.out.println(request);

      //USE THE LIST OF GREETINGS FROM THE REPOSITORY and customize it per user
      //String greeting = "Hello there, " + request.getName();
      //String greeting = "Holla, " + request.getName();
      String greeting = "Good Morning, " + request.getName();

      HelloResponse response = HelloResponse.newBuilder().setGreeting(greeting).build();

      responseObserver.onNext(response);
      responseObserver.onCompleted();
    }
  }
}

GRPC 有没有办法在服务响应任何其他请求之前初始化服务? 我不确定构造函数是否是个好主意..并启动另一个线程只是为了调用另一个服务。

主要有两种方法:1) 延迟启动服务器,直到相关服务准备就绪,以及 2) 延迟客户端向该服务器发送请求,直到相关服务准备就绪。

延迟启动服务器直到准备就绪:

GreetingServiceImpl gsi = new GreetingServiceImpl();
Server server = ServerBuilder.forPort(8080)
    .addService(gsi).build();

System.out.println("Starting server...");
gsi.init();
server.start();

延迟客户端向此服务器发送请求取决于客户端获悉服务器地址的方式。例如,如果使用使用 Health 服务的负载平衡代理,请等待直到准备就绪,然后调用:

healthStatusManager.setStatus("", ServingStatus.SERVING);

代理随后将得知此服务器是健康的并通知客户端有关后端的信息。