Protocol buffers GRPC负载均衡器示例

Protocol buffers GRPC负载均衡器示例,protocol-buffers,load-balancing,rpc,grpc,Protocol Buffers,Load Balancing,Rpc,Grpc,我正在尝试使用GRPC/Java构建具有负载平衡的服务器集管理机制 通过查看API文档,有如下类: 负载平衡器、RoundRobinLoadBalancer工厂等 从名字看,他们似乎应该做我想做的事。 然而,我找不到任何使用这些类的代码示例,即使我很努力地在谷歌上搜索 另一方面,我发现一些欺骗/节俭的例子如下: 我想知道是否有人可以分享一些工作GRPC的例子?谢谢 gRPC与计算机协同工作。NameResolver向LoadBalancer发送地址,LoadBalancer决定是否建立连接()和

我正在尝试使用GRPC/Java构建具有负载平衡的服务器集管理机制

通过查看API文档,有如下类: 负载平衡器、RoundRobinLoadBalancer工厂等

从名字看,他们似乎应该做我想做的事。 然而,我找不到任何使用这些类的代码示例,即使我很努力地在谷歌上搜索

另一方面,我发现一些欺骗/节俭的例子如下:

我想知道是否有人可以分享一些工作GRPC的例子?谢谢

gRPC与计算机协同工作。NameResolver向LoadBalancer发送地址,LoadBalancer决定是否建立连接()和每个请求

名称解析程序和/或负载平衡器可用于通道

虽然有接口,但是没有很多常用的实现,而没有基本的DnsNameResolver和RoundRobinLoadBalancer。PickFirstBalancerFactory是默认的“LoadBalancer”,实际上不进行平衡


如果您有一个在DNS中具有多个地址的地址,则在使用RoundRobinLoadBalancer时将观察到循环行为。但是,我猜您希望从某些服务发现系统(如ZooKeeper)获取地址。您需要为此实现名称解析器。如果您熟悉您选择的discovery系统,这应该不难。

我们刚刚发布了一个非常简单的示例,可以在这里找到:

包grpc
进口(
“google.golang.org/grpc/naming”
)
类型staticResolver结构{
更新[]*naming.Update
}
类型staticWatcher结构{
更新chan[]*naming.Update
}
func NewStaticResolver(addr[]字符串)naming.Resolver{
var ups[]*naming.Update
对于u,a:=范围地址{
ups=append(ups,&naming.Update{naming.Add,a,“”})
}
返回和静态解析器{ups}
}
func(w*staticWatcher)Next()([]*naming.Update,错误){

return我刚刚从Kidong Lee的github存储库中找到了一个Java版本示例:

/**
*领事名称解析程序使用。
*
*
*@param serviceName领事服务名称。
*@param concurhost concur代理主机。
*@param-consolport-consol代理端口。
*@param ignoreConsul如果为true,则不使用consul。相反,将使用静态节点列表。
*@param hostPorts静态节点列表,例如Arrays.asList(“host1:port1”、“host2:port2”)
*/
公共HelloWorldClientWithNameResolver(字符串serviceName,
字符串作为主机,
国际领事馆,
布尔IgnoreConsor,
列出主机端口){
字符串consuaddr=“consul://”+consulthost+:“+consultport;
int pauseInSeconds=5;
channel=ManagedChannel Builder
.forTarget(顾问)
.loadBalancerFactory(RoundRobinLoadBalancerFactory.getInstance())
.nameResolverFactory(新的ConsultNameResolver.ConsultNameResolverProvider(serviceName、pauseInSeconds、IgnoreConsor、hostPorts))
.usePlaintext(真)
.build();
blockingStub=GreeterGrpc.新blockingStub(通道);
}

您可以从本报告中找到更多示例。

非常感谢!您有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
}
/**
 * Consul NameResolver Usage.
 *
 *
 * @param serviceName consul service name.
 * @param consulHost consul agent host.
 * @param consulPort consul agent port.
 * @param ignoreConsul if true, consul is not used. instead, the static node list will be used.
 * @param hostPorts the static node list, for instance, Arrays.asList("host1:port1", "host2:port2")
 */
public HelloWorldClientWithNameResolver(String serviceName,
                                        String consulHost,
                                        int consulPort,
                                        boolean ignoreConsul,
                                        List<String> hostPorts) {

    String consulAddr = "consul://" + consulHost + ":" + consulPort;

    int pauseInSeconds = 5;

    channel = ManagedChannelBuilder
            .forTarget(consulAddr)
            .loadBalancerFactory(RoundRobinLoadBalancerFactory.getInstance())
            .nameResolverFactory(new ConsulNameResolver.ConsulNameResolverProvider(serviceName, pauseInSeconds, ignoreConsul, hostPorts))
            .usePlaintext(true)
            .build();

    blockingStub = GreeterGrpc.newBlockingStub(channel);
}