如何在kubernetes集群中使用grpcjava实现grpc的循环负载平衡?

zhte4eai  于 2021-06-26  发布在  Java
关注(0)|答案(0)|浏览(321)

我一直在尝试让grpc的负载平衡在部署到kubernetes集群的java应用程序中工作,但没有取得太大的成功。关于这一点,似乎没有太多的文档,但从联机示例中我可以看到,我现在应该能够在设置managedchannel(在grpc java lib的更高版本中)时使用“.defaultloadbalancingpolicy”(“round\u robin”)。
更具体地说,我使用的是grpcjava库的1.34.1版本。我创建了两个springboot(v2.3.4)应用程序,一个称为grpcsender,另一个称为grpcreceiver。
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 receiver应用程序创建了一个无头服务:

kind: Service
apiVersion: v1
metadata:
  name: grpc-receiver
spec:
  clusterIP: None
  selector:
    app: grpc-receiver
  ports:
    - name: 'grpc'
      port: 6565
      protocol: 'TCP'
      targetPort: 6565

但是,当我尝试从grpc发送者向grpc接收者发送消息时,我在grpc发送者日志中仅看到此异常:

2021-01-08 17:46:24.494 ERROR 1 --- [ault-executor-0] io.grpc.internal.ManagedChannelImpl      : [Channel<1>: (grpc-receiver:6565)] Uncaught exception in the SynchronizationContext. Panic!
java.lang.NoSuchFieldError: NAME_RESOLVER_SERVICE_CONFIG
    at io.grpc.services.HealthCheckingLoadBalancerFactory$HealthCheckingLoadBalancer.handleResolvedAddresses(HealthCheckingLoadBalancerFactory.java:186) ~[grpc-services-1.25.0.jar!/:1.25.0]
    at io.grpc.internal.AutoConfiguredLoadBalancerFactory$AutoConfiguredLoadBalancer.tryHandleResolvedAddresses(AutoConfiguredLoadBalancerFactory.java:154) ~[grpc-core-1.34.1.jar!/:1.34.1]
    at io.grpc.internal.ManagedChannelImpl$NameResolverListener$1NamesResolved.run(ManagedChannelImpl.java:1668) ~[grpc-core-1.34.1.jar!/:1.34.1]
    at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:95) ~[grpc-api-1.34.1.jar!/:1.34.1]
    at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:127) ~[grpc-api-1.34.1.jar!/:1.34.1]
    at io.grpc.internal.ManagedChannelImpl$NameResolverListener.onResult(ManagedChannelImpl.java:1682) ~[grpc-core-1.34.1.jar!/:1.34.1]
    at io.grpc.internal.DnsNameResolver$Resolve.run(DnsNameResolver.java:333) ~[grpc-core-1.34.1.jar!/:1.34.1]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na

有谁能给我指点一下我做错了什么或遗漏了什么?
顺便说一句,我知道使用grpc进行负载平衡的其他方法,比如使用linker或istio之类的服务网格,或者仅仅使用特使代理,但是我非常希望使用grpc现成的负载平衡特性来实现一些工作,作为不同方法之间的比较点。
非常感谢!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题