首页 > 解决方案 > 从构造函数调用另一个 GRPC 服务

问题描述

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

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

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

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 中有没有办法在服务响应任何其他请求之前对其进行初始化?我不确定构造函数是否是一个好主意..并启动另一个线程只是为了调用另一个服务。

标签: javagrpcgrpc-java

解决方案


有两种主要方式: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);

然后代理将获悉此服务器是健康的,并通知客户端有关后端的信息。


推荐阅读