GRPC 负载均衡实现

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: gRPC 是google开源的非常优秀的RPC框架,支持PYTHON/JAVA/PHP/GO/C/C++/C#/NODEJS/RUBY 等编程语言,在跨语言调用十分方便。

导读

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变化,实时更新可用地址列表
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
4月前
|
负载均衡 算法 微服务
基于gRPC的注册发现与负载均衡的原理和实战
基于gRPC的注册发现与负载均衡的原理和实战
|
5月前
|
消息中间件 存储 负载均衡
消息队列 MQ使用问题之如何在grpc客户端中设置负载均衡器
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
缓存 负载均衡 算法
Nginx实现负载均衡(整合SpringBoot小demo)
Nginx实现负载均衡(整合SpringBoot小demo)
372 4
Nginx实现负载均衡(整合SpringBoot小demo)
|
负载均衡 Linux 调度
使用keepalived(HA)+LVS实现高可用负载均衡群集,调度器的双机热备
使用keepalived(HA)+LVS实现高可用负载均衡群集,调度器的双机热备
191 1
使用keepalived(HA)+LVS实现高可用负载均衡群集,调度器的双机热备
|
负载均衡 网络协议 应用服务中间件
nginx实现负载均衡
nginx实现负载均衡
339 0
nginx实现负载均衡
|
弹性计算 负载均衡 Kubernetes
【视频】第四讲-负载均衡ALB+实验三-使用ALB实现灰度发布|学习笔记
快速学习【视频】第四讲-负载均衡ALB+实验三-使用ALB实现灰度发布。
【视频】第四讲-负载均衡ALB+实验三-使用ALB实现灰度发布|学习笔记
|
域名解析 tengine 负载均衡
使用nginx的负载均衡机制实现用户无感更新服务
用户请求的转发是接口服务在部署时必须要做的一步。
|
负载均衡 Java 开发者
自定义实现负载均衡|学习笔记
快速学习自定义实现负载均衡
自定义实现负载均衡|学习笔记
|
存储 负载均衡 NoSQL
nginx反向代理做负载均衡以及使用redis实现session共享配置详解
nginx反向代理做负载均衡以及使用redis实现session共享配置详解
568 0
nginx反向代理做负载均衡以及使用redis实现session共享配置详解
|
域名解析 弹性计算 缓存
阿里云云计算ACP实验考试之使用负载均衡实现https与http的混合访问(下)
阿里云云计算ACP实验考试之使用负载均衡实现https与http的混合访问(下)
416 0
阿里云云计算ACP实验考试之使用负载均衡实现https与http的混合访问(下)