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

时间:2018-07-15 04:35:45

标签: java grpc grpc-java

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

我的代码在这里看起来有些混乱……在GreetingServiceImpl的构造函数中,我正在启动一个Thread来获取 在不同端口上运行的GreetingServiceRepository服务提供某种问候列表?

因此,用例是这样的……有一个GRPC服务GreetingsRepository,其中包含问候和 我要自定义响应,以便可以返回自定义响应,这是一个调用GreetingsRepository的GreetingServiceImpl。 对于每个请求。...

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 个答案:

答案 0 :(得分:1)

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

然后,代理将了解此服务器的运行状况,并通知客户端有关后端的信息。