2017-03-08 36 views
0

我正尝试使用GRPC/Java构建负载平衡的服务器集管理机制。GRPC loadbalander示例

通过查看API文档,有喜欢类: 负载平衡器,RoundRobinLoadBalancerFactory等

通过看名字,就好像他们应该做我想做的事情。 但是,我找不到任何使用这些类的代码示例,即使我搜索的内容非常困难。

在另一方面,我发现了一些欺骗/节俭的例子是这样的:https://github.com/benjumanji/finagle-serverset-example

我想知道如果任何人都可以分享一些工作GRPC的例子吗?谢谢!

回答

0

gRPC LoadBalancerNameResolver一起使用。 NameResolver向LoadBalancer发出地址,LoadBalancer为每个请求做出连接(Subchannels)和picking a Subchannel的决定。

NameResolver和/或LoadBalancer可以是set to ManagedChannelBuilder用于通道。

虽然接口在那里,但没有多少股票实现,而不是基本的DnsNameResolver和RoundRobinLoadBalancer。 PickFirstBalancerFactory是默认的“LoadBalancer”,实际上并没有进行平衡。

如果您的地址在DNS中有多个地址,则在使用RoundRobinLoadBalancer时,您将观察到循环法行为。但是,我想你想从某些服务发现系统(如ZooKeeper)获取地址。你将需要为此实现一个NameResolver。如果你熟悉你选择的发现系统,它不应该很难。

0

我们中庸之道发布了一个非常简单的为例,可以在这里找到:https://github.com/cloudtrust/lbclient/blob/master/grpc/staticResolver.go

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 
} 

我们希望这能帮助你,随时问,如果你需要什么。

+0

非常感谢!你有Java版本的例子吗? –