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

标签 java grpc grpc-java

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

我这里的代码看起来有点困惑...在 GreetingServiceImpl 的构造函数中,我启动一个线程只是为了获取 来自在不同端口上运行的 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) 延迟启动服务器,直到相关服务准备就绪;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);

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

关于java - 从构造函数调用另一个 GRPC 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51345296/

相关文章:

java - Android java-grpc 客户端到 python-grpc 服务器

java - 如何根据条件从数据库中删除数据?

tomcat - 无法加载任何给定的库 : [netty-tcnative-linux-x86_64, netty-tcnative]

java - 贪吃蛇游戏——无法驾驭蛇

java - 如何在gRPC拦截器中访问消息请求?

grpc - improbable-eng/grpc-web 响应关闭,没有标题

java - 将服务重定向到双向 grpc

grpc - 如何让 gRPC 服务器和客户端处于同一进程以实现双向通信(不是服务器/客户端流)

java - 如何在 Android 中查找名称以特定字符串开头的文件夹中的文件

Java-仅在某些区域绘制