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

Java 从构造函数调用另一个GRPC服务,java,grpc,grpc-java,Java,Grpc,Grpc Java,在GRPC中…在另一个GRPC服务能够响应任何请求之前,调用该服务最有效的方法是什么 我的代码看起来有点乱。。。在GreetingServiceImpl的构造函数中,我启动一个线程只是为了 来自运行在不同端口上的GreetingServiceRepository服务的某种问候语列表 所以用例是这样的。。。有一个GRPC服务问候回复,其中包含问候和问候的列表 一个称为GreetingsRepository的GreetingServiceImpl。。我想自定义响应,以便可以返回自定义响应 对于每一个

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

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

所以用例是这样的。。。有一个GRPC服务问候回复,其中包含问候和问候的列表 一个称为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();
    }
  }
}
公共类MyGrpcServer{
静态公共void main(字符串[]args)引发IOException、InterruptedException{
服务器=ServerBuilder.forPort(8080)
.addService(新的GreetingServiceImpl()).build();
System.out.println(“启动服务器…”);
server.start();
System.out.println(“服务器已启动!”);
等待终止();
}
公共静态类GreetingServiceImpl扩展了GreetingServiceGrpc.GreetingServiceImplBase{
公共问候服务impl(){
init();
}
公共void init(){
//执行初始长时间运行任务
//就像运行从存储库调用另一个服务的线程一样
线程t1=新线程(){
公开募捐{
//呼叫另一个grpc服务
ManagedChannel=ManagedChannel Builder.forAddress(“localhost”,8081)
.usePlaintext(真)
.build();
GreetingServiceRepository.egreetingServicePositionBlockingStub=
迎宾服务仓库GRPC.新船闸桶(通道);
//对回应做点什么
}
}
t1.start();
}
@凌驾
公共无效问候语(HelloRequest请求、StreamObserver响应Observer){
系统输出打印项次(请求);
//使用存储库中的问候语列表,并根据用户进行自定义
//String greeting=“你好,”+request.getName();
//字符串greeting=“Holla,”+request.getName();
String greeting=“早上好,”+request.getName();
HelloResponse response=HelloResponse.newBuilder().setGreeting(greeting.build();
responseObserver.onNext(响应);
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();
延迟客户端向该服务器发送请求取决于客户端了解服务器地址的方式。例如,如果使用使用
运行状况
服务的负载平衡代理,请等待就绪,然后调用:

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

然后,代理将了解此服务器是否正常,并通知客户端有关后端的信息。

Ohh所以这就是我所做的。。。我在init方法中启动了一个线程来调用我的问候语存储库,等待它完成,然后启动服务器。