GRPC 负载均衡实现

栏目: 后端 · 发布时间: 5年前

内容简介:gRPC 是google开源的非常优秀的RPC框架,支持PYTHON/JAVA/PHP/GO/C/C++/C#/NODEJS/RUBY 等编程语言,在跨语言调用十分方便。在产品环境,通常要部署多个RPC服务,已提高可用性,以及响应速度。但是 在负载均衡方面不如dubbo的组件那么丰富,但是其提供了服务发现的接口, 可以通过实现其接口,灵活实现负载均衡功能。下面通过本地配置文件,启动时注册可用的服务,可以快速实现负载均衡功能。

gRPC 是google开源的非常优秀的RPC框架,支持PYTHON/JAVA/PHP/GO/C/C++/C#/NODEJS/RUBY 等编程语言,在跨语言调用十分方便。

在产品环境,通常要部署多个RPC服务,已提高可用性,以及响应速度。但是 在负载均衡方面不如dubbo的组件那么丰富,但是其提供了服务发现的接口, 可以通过实现其接口,灵活实现负载均衡功能。

下面通过本地配置文件,启动时注册可用的服务,可以快速实现负载均衡功能。

grpc:
  hosts: host1:8080,host2:8080
复制代码

GRPC channel 创建

ManagedChannelBuilder
                // 设置连接的目标地址
                .forTarget("local")
                // 设置地址服务
                .nameResolverFactory(new LocalNameResolverProvider(configInterface))
                .enableRetry()
                .maxRetryAttempts(5)
                .keepAliveTime(5, TimeUnit.MINUTES)
                .keepAliveWithoutCalls(true)
                .keepAliveTimeout(10, TimeUnit.MINUTES)
                .idleTimeout(24, TimeUnit.HOURS)
                // 设置轮询策略
                .loadBalancerFactory(RoundRobinLoadBalancerFactory.getInstance())
                .usePlaintext()
                .build();
复制代码
  • forTarget 设置连接RPC服务的地址,比如"127.0.0.1:8080"
  • nameResolverFactory 服务发现
  • LocalNameResolverProvider 服务提供者
  • loadBalancerFactory 设置负载均衡策略
  • RoundRobinLoadBalancerFactory 轮询策略

nameResolverFactory 配置方式

  • GRPC client 通过 loadBalancerFactory 来设置负载均衡的策略,这里选择 RoundRobinLoadBalancerFactory ,即服务轮询策略。

  • 通过 nameResolverFactory 配置地址服务的发现方式,通过 NameResolverProvider 来实现服务的注册与发现。

  • 服务提供者类

// 需要实现NameResolverProvider抽象类中的相关方法
public class LocalNameResolverProvider extends NameResolverProvider {
    private final ConfigInterface configInterface;

    @Inject
    public LocalNameResolverProvider(ConfigInterface configInterface) {
        this.configInterface = configInterface;
    }

    // 服务是否可用
    @Override
    protected boolean isAvailable() {
        return true;
    }

    // 优先级默认5
    @Override
    protected int priority() {
        return 5;
    }

    // 服务发现类
    @Nullable
    @Override
    public NameResolver newNameResolver(URI targetUri, Attributes params) {
        return new LocalNameResolver(configInterface);
    }

    // 服务协议
    @Override
    public String getDefaultScheme() {
        return "local";
    }
}

复制代码
  • 服务发现类
public class LocalNameResolver extends NameResolver {
    private final ConfigInterface configInterface;

    @Inject
    public LocalNameResolver(ConfigInterface configInterface) {
        this.configInterface = configInterface;
    }

    @Override
    public String getServiceAuthority() {
        return "none";
    }

    // 配置可用服务,RPC在调用的时候,轮询选择这里配置的可用的服务地址列表
    @Override
    public void start(Listener listener) {
        LogUtils.info("LocalNameResolver start ...");
        ArrayList<EquivalentAddressGroup> addressGroups = new ArrayList<EquivalentAddressGroup>();
        // 获取rpc地址的配置列表
        // 地址格式 host1:8080,host2:8081
        Map<String, Object> config = (Map<String, Object>) this.configInterface.getRpcConfig().get("grpc");
        String[] hosts = config.get("hosts").toString().split(",");
        for (String host : hosts) {
            if (host.trim().length() > 0) {
                String[] address = host.split(":");
                List<SocketAddress> socketAddresses = new ArrayList<SocketAddress>();
                socketAddresses.add(new InetSocketAddress(address[0], Integer.parseInt(address[1])));
                addressGroups.add(new EquivalentAddressGroup(socketAddresses));
            }
        }
        listener.onAddresses(addressGroups, Attributes.EMPTY);
    }

    @Override
    public void shutdown() {

    }
}
复制代码
  • 通过以上配置, 在进行RPC调用的时候,会轮询选择注册的服务地址
  • 添加新的可用服务节点需要更新配置文件

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

虚拟化与云计算

虚拟化与云计算

《虚拟化与云计算》小组 / 电子工业出版社 / 2009-10 / 45.00元

本书系统阐述了当今信息产业界最受关注的两项新技术——虚拟化与云计算。云计算的目标是将各种IT资源以服务的方式通过互联网交付给用户。计算资源、存储资源、软件开发、系统测试、系统维护和各种丰富的应用服务,都将像水和电一样方便地被使用,并可按量计费。虚拟化实现了IT资源的逻辑抽象和统一表示,在大规模数据中心管理和解决方案交付方面发挥着巨大的作用,是支撑云计算伟大构想的最重要的技术基石。本书以在数据中心采......一起来看看 《虚拟化与云计算》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具