Dan*_*ern 3 java kubernetes grpc grpc-java
我一直在尝试让 GRPC 的负载平衡在部署到 Kubernetes 集群的 Java 应用程序中工作,但并没有取得太大成功。似乎没有太多关于此的文档,但从在线示例中我可以看到,我现在应该能够在设置 ManagedChannel 时使用 '.defaultLoadBalancingPolicy("round_robin")' (在更高版本的 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();
}
Run Code Online (Sandbox Code Playgroud)
然后grpc-receiver充当GRPC服务器:
Server server = ServerBuilder.forPort(6565)
.addService(new GreetingServiceImpl()).build();
Run Code Online (Sandbox Code Playgroud)
我正在将这些应用程序部署到 Kubernetes 集群(暂时在 minikube 本地运行),并且我为 grpc-receiver 应用程序创建了一个 Service 作为无头服务,这样就可以实现 GRPC 负载均衡。
为了测试失败的请求,我做了两件事:
通过上述两种方法,我可以在测试运行期间让一部分请求失败。现在我正在尝试让 GRPC 的重试机制发挥作用。通过阅读稀疏的文档,我正在执行以下操作:
return NettyChannelBuilder.forAddress(host, port)
.defaultLoadBalancingPolicy("round_robin")
.enableRetry()
.maxRetryAttempts(10)
.usePlaintext().build();
Run Code Online (Sandbox Code Playgroud)
然而,这似乎没有效果,我根本看不到重试失败的请求。
我看到这仍然被标记为 @ExperimentalApi 功能,那么它是否应该按预期工作并且是否已实现?
如果是这样,我是否遗漏了一些明显的东西?我还需要做些什么才能重试工作吗?
有任何文档可以更详细地解释如何执行此操作吗?
首先十分感谢...
ManagedChannelBuilder.enableRetry().maxRetryAttempts(10) 不足以使重试发生。重试需要定义了 RetryPolicy 的服务配置。一种方法是使用 RetryPolicy 设置默认服务配置,请参阅https://github.com/grpc/grpc-java/tree/v1.35.0/examples中的重试示例
maxRetryAttempts() 的 javadoc 存在一些混乱,在https://github.com/grpc/grpc-java/pull/7803中得到了澄清
| 归档时间: |
|
| 查看次数: |
8343 次 |
| 最近记录: |