gpt4 book ai didi

java - 如何让grpc客户端调用多个服务器?

转载 作者:行者123 更新时间:2023-12-02 09:41:36 26 4
gpt4 key购买 nike

到目前为止,我已经构建了一个简单的客户端-服务器架构并管理它的工作。我能够发送请求并返回有效的响应。

我的问题是如何使客户端拥有多个 grpc 服务器以便能够分发工作。假设我有一个主服务器(客户端),它将请求发送到位于不同机器上的多个服务器(因此具有不同的IP)。在客户端有什么可以帮助我的吗?有一个主机和端口列表并创建一个负载均衡器/托管 channel 工厂?问题是我希望在分布式系统中将多台机器连接到一台主机。 grpc 中的每个请求都是一个文件,服务器(工作程序)计算它并返回响应。

谢谢。到目前为止,这是使用 grpc 的客户端/服务器代码,运行得非常好。

Client side

@Component
public class DocumentParserClient {

private static final Logger LOGGER = LoggerFactory.getLogger(DocumentParserClient.class);
private static final String GRPC_HOST = "localhost";
private static final int GRPC_PORT_I1 = 6565;
private static final int GRPC_PORT_I2 = 6566;

private ManagedChannel managedChannel;
private WikiDocParserGrpc.WikiDocParserBlockingStub wikiDocParserBlockingStub;

@PostConstruct
private void init() {
this.managedChannel = ManagedChannelBuilder.forAddress(GRPC_HOST, GRPC_PORT_I1).usePlaintext(true).build();
this.wikiDocParserBlockingStub = WikiDocParserGrpc.newBlockingStub(managedChannel);
}

public String parseDocument(WikiOWrapperDto wikiOWrapperDto) {
long start = System.currentTimeMillis();
LOGGER.info("client sending {}",start);
WikiOWrapper wikiOWrapper = GrpcDtoTransform.wrapINPUTFromDtoToGRPC(wikiOWrapperDto);
LOGGER.info("client parsing {}", System.currentTimeMillis() - start);
TokenCompressorDoc tokenCompressorDoc = wikiDocParserBlockingStub.parseWikiDOC(wikiOWrapper);
LOGGER.info("client received {}", System.currentTimeMillis() - start);
return "Success";
}

}

Server side

@GRpcService
public class WikiDocParserGrpcService extends WikiDocParserGrpc.WikiDocParserImplBase {

private static final Logger LOGGER = LoggerFactory.getLogger(WikiDocParserGrpcService.class);
private JSoupParser jSoupParser;

@Autowired
public WikiDocParserGrpcService(JSoupParser jSoupParser) {
this.jSoupParser = jSoupParser;
}

@Override
public void parseWikiDOC(WikiOWrapper wikiOWrapper, StreamObserver<TokenCompressorDoc> responseObserver) {
long start = System.currentTimeMillis();
LOGGER.info("server received {}", start);
WikiOWrapperDto wikiOWrapperDto = GrpcDtoTransform.wrapOUTPUTfromGrpcToDto(wikiOWrapper);
TokenCompressorDocDto tokenCompressorDocDto = jSoupParser.parseJsonParseWrapperFromObject(wikiOWrapperDto);
responseObserver.onNext(GrpcDtoTransform.wrapOUTPUTFromGRPCToDto(tokenCompressorDocDto));
responseObserver.onCompleted();
LOGGER.info("server responded in {}", System.currentTimeMillis()- start);
}
}

最佳答案

查看此处总结的方法以及每种方法的优缺点:

https://grpc.io/blog/loadbalancing/

您最重要的决定是是否 (a) 充实您的客户端以包含管理多个服务器名册的代码并确定如何将流量路由到它们; (b) 使用外部代理或负载均衡器来抽象此决策。

如果您选择选项 (b),我鼓励您关注 L7 (HTTP/2) 负载平衡而不是 TCP。 gRPC 需要 HTTP/2 并使用 session 进行流式传输。因此,路由比 L7 和 REST 更复杂。越来越多的经过行业验证的代理包括 Envoy , NGINXHAProxy支持HTTP/2和gRPC。

关于java - 如何让grpc客户端调用多个服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57028012/

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