gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:05:59 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com