如何让GRPC的重试机制在Kubernetes集群中使用grpcjava工作?
我一直在尝试让GRPC的负载平衡在部署到Kubernetes集群的Java应用程序中工作,但没有取得太多成功。关于这一点,似乎没有太多的文档,但从网上的例子中,我可以看出,我现在应该能够使用。defaultLoadBalancingPolicy(“循环”)在设置ManagedChannel时(在GRPC Java lib的更高版本中)
更具体地说,我使用的是GRPC Java库的1.34.1版。我创建了两个Spring Boot(v2.3.4)应用程序,一个名为grpc sender,另一个名为grpc receiver
grpc sender充当grpc客户端,并将(Netty)ManagedChannel定义为:
@Bean
public ManagedChannel greetingServiceManagedChannel() {
String host = "grpc-receiver";
int port = 6565;
return NettyChannelBuilder.forAddress(host, port)
.defaultLoadBalancingPolicy("round_robin")
.usePlaintext().build();
}
然后grpc接收器充当grpc服务器:
Server server = ServerBuilder.forPort(6565)
.addService(new GreetingServiceImpl()).build();
我正在将这些应用程序部署到Kubernetes群集(目前在minikube本地运行),并为grpc接收器应用程序创建了一个服务,作为无头服务,以便实现grpc负载平衡
为了测试失败的请求,我做了两件事:
- 在测试运行期间杀死一个grpc接收器吊舱——例如,当我请求grpc发送方向grpc接收器发送5000个请求时。Grpc发送方确实检测到pod已被杀死,并刷新其接收方pod列表,并将未来的请求路由到新的pod。正如预期的那样,在击落吊舱期间正在飞行的一些请求在GRPC状态不可用的情况下失败李>
- 在grpc接收器中有一些简单的逻辑,生成一个随机数,如果该随机数低于0.2,则返回grpc内部状态,而不是OK李>
通过以上两种方法,我可以在测试运行期间获得一定比例的失败请求。现在,我正试图让GRPC的重试机制发挥作用。通过阅读稀疏文档,我做了以下工作:
return NettyChannelBuilder.forAddress(host, port)
.defaultLoadBalancingPolicy("round_robin")
.enableRetry()
.maxRetryAttempts(10)
.usePlaintext().build();
然而,这似乎没有效果,我看不出失败的请求会被重试
我看到这仍然被标记为@ExperimentalApi特性,那么它是否应该像预期的那样工作,并且已经实现了
如果是这样的话,我是否有明显的遗漏?我还需要做什么才能让重试成功
有没有更详细的文档来解释如何做到这一点
非常感谢
共 (0) 个答案