我一直在尝试让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现成的负载平衡特性来实现一些工作,作为不同方法之间的比较点。
非常感谢!
暂无答案!
目前还没有任何答案,快来回答吧!