我正在尝试使用GRPC / Java构建具有负载平衡的服务器集管理机制。
通过查看API文档,可以使用以下类:LoadBalancer,RoundRobinLoadBalancerFactory等。
通过查看名称,似乎他们应该做我想做的事情。但是,我找不到使用这些类的任何代码示例,即使我用Google搜索非常努力。
另一方面,我发现了一些像这样的Finagle / Thrift例子:https://github.com/benjumanji/finagle-serverset-example
我想知道是否有人可以分享一些有用的GRPC示例?谢谢!
gRPC LoadBalancer与NameResolver合作。 NameResolver向LoadBalancer发送地址,LoadBalancer决定是否为每个请求建立连接(Subchannels)和picking a Subchannel。
NameResolver和/或LoadBalancer可以是用于频道的set to ManagedChannelBuilder。
虽然接口在那里,但是没有很多库存实现,而是基本的DnsNameResolver和RoundRobinLoadBalancer。 PickFirstBalancerFactory是默认的“LoadBalancer”,它实际上不做平衡。
如果您的地址在DNS中具有多个地址,则在使用RoundRobinLoadBalancer时您将观察到循环行为。但是,我想你想从一些服务发现系统中获取地址,例如ZooKeeper。您需要为此实现NameResolver。如果您熟悉您选择的发现系统,那应该不难。
我们刚刚发布了一个非常简单的例子,可以在这里找到:qazxsw poi
https://github.com/cloudtrust/lbclient/blob/master/grpc/staticResolver.go
我们希望这可以帮助您,随时询问您是否需要任何东西。
我刚从Kidong Lee的github存储库中找到了一个Java版本示例:package grpc
import (
"google.golang.org/grpc/naming"
)
type staticResolver struct{
updates []*naming.Update
}
type staticWatcher struct {
updates chan []*naming.Update
}
func NewStaticResolver(addr []string) naming.Resolver {
var ups []*naming.Update
for _,a := range addr {
ups = append(ups, &naming.Update{naming.Add, a, ""})
}
return &staticResolver{ups}
}
func (w *staticWatcher) Next() ([]*naming.Update, error) {
return <-w.updates, nil
}
func (w *staticWatcher) Close() {
close(w.updates)
}
func (r *staticResolver) Resolve(target string) (naming.Watcher, error) {
var ch chan []*naming.Update = make(chan []*naming.Update, 1)
ch <- r.updates
return &staticWatcher{ch}, nil
}
https://github.com/mykidong/grpc-java-load-balancer-using-consul/blob/master/src/test/java/io/shunters/grpc/component/grpc/HelloWorldClientWithNameResolver.java
你可以从这个回购中找到更多的例子。