美文网首页
android开发之GRPC 负载均衡实现

android开发之GRPC 负载均衡实现

作者: 雨田Android开发 | 来源:发表于2021-09-08 09:02 被阅读0次

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调用的时候,会轮询选择注册的服务地址
添加新的可用服务节点需要更新配置文件

动态注册与发现

启动GRPC服务的同时,把服务的地址注册到zookeeper上
实现NameResolverstart 方法,监听zookeeper变化,实时更新可用地址列表

相关文章

  • android开发之GRPC 负载均衡实现

    gRPC 是google开源的非常优秀的RPC框架,支持PYTHON/JAVA/PHP/GO/C/C++/C#/N...

  • grpc 负载均衡

    说明 本文档介绍了 gRPC中, 负载均衡的设计思想 底层实现 每次调用的负载均衡 值得注意的是gRPC的 负载均...

  • gRPC - 负载均衡

    一、官方文档 以下内容为官方文档的中文翻译,源文档地址为:https://github.com/grpc/grpc...

  • GRPC负载均衡

    负载均衡 负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高应用的性能和可靠性。 G...

  • nginx负载均衡

    1 nginx负载均衡 负载均衡在服务端开发中算是一个比较重要的特性, nginx 提供的负载均衡可以实现上游服务...

  • 程序猿之踩坑&思考&困惑02

    应用如何实现负载均衡? 因为最近在看网络相关的书,我从DNS做内部负载均衡的角度来说下关于实现应用负载均衡的做法之...

  • 当面试官问我Nginx如何实现负载均衡,我这么答让他眼前一亮

    负载均衡介绍 在介绍Nginx的负载均衡实现之前,先简单的说下负载均衡的分类,主要分为硬件负载均衡和软件负载均衡,...

  • 关于负载均衡的总结

    负载均衡的分类 常见的分为三类,dns负载均衡,硬件负载均衡,软件负载均衡 dns负载均衡 一般实现地域级别的负载...

  • SpringBoot实现负载均衡(Nginx支撑)

    负载均衡介绍介绍在介绍Nginx的负载均衡实现之前,先简单的说下负载均衡的分类,主要分为硬件负载均衡和软件负载均衡...

  • Nginx+SpringBoot实现负载均衡

    负载均衡介绍 介绍 在介绍Nginx的负载均衡实现之前,先简单的说下负载均衡的分类,主要分为硬件负载均衡和软件负载...

网友评论

      本文标题:android开发之GRPC 负载均衡实现

      本文链接:https://www.haomeiwen.com/subject/ieamwltx.html