gRPC Client的负载均衡器

一、gRPC是什么?

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成 可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。

二、为什么使用gRPC?

有了 gRPC, 我们可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑- gRPC 帮你解决了不同语言间通信的复杂性以及环境的不同.使用 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新。

三、出现启动其中一个服务挂了、中间服务挂了、服务重新启动这三种情况,如何保证客户端的正常访问?

1、haproxy

缺点:每次连接都会创建一个channel,并发高的话资源消耗大,这样性能也会有问题

2、客户端负载均衡器

优点:单例,资源消耗小,性能比较好

缺点:可能还存在点问题,代码有点乱

3、zk、consul

以后改进方案

4、如果大家有更好的方案,欢迎大家拍砖,谢谢

四、相关包的引用版本是多少?

1、Grpc.Core.0.15.0

2、Grpc.HealthCheck.0.15.0-beta

3、Google.Protobuf.3.0.0-beta3

五、核心代码如下:

获取工作中的服务通道

public static Channel GetWorkingChannel(string key)
    {
      Ensure.NotNullOrEmpty(key);
      CachedItem item = null;
      _cacheMap.TryGetValue(key, out item);
      Channel currentChosenChannel = null;
      if (_cacheMap.IsNotEmpty())
      {
        foreach (var channel in item.Channels.OrderBy(o => Guid.NewGuid()))
        {
          try
          {
            if (channel.State == ChannelState.Idle || channel.State == ChannelState.Ready)
            {
              channel.ConnectAsync(DateTime.Now.AddMilliseconds(100)).Wait();
              currentChosenChannel = channel;
              break;
            }
          }
          catch
          {
            channel.ShutdownAsync().Wait();
          }
        };
      }

      if (currentChosenChannel == null) InitWorkingChannelsByKey(key);
      return currentChosenChannel;
    }

  

进行健康检查

private static bool CheckIfConnectionIsWorking(Channel serverChannel)
    {
      if (serverChannel != null)
      {
        try
        {
          var client = new Health.HealthClient(serverChannel);
          var response = client.Check(new HealthCheckRequest { Service = "HealthCheck" });
          return response.Status == HealthCheckResponse.Types.ServingStatus.Serving;
        }
        catch (Exception ex)
        {
          serverChannel.ShutdownAsync().Wait();
          return false;
        }
      }
      return false;
    }

  

定时任务维护

 private static void ExecuteMaintenance(object state)
    {
      if (Interlocked.CompareExchange(ref _executing, 1, 0) != 0)
        return;
      try
      {
        if (_cacheMap.Count == 0)
        {
          StopMaintenance();
          if (_cacheMap.Count != 0)
            StartMaintenance();
        }
        else
        {
          DateTime oldThreshold = DateTime.UtcNow - _timeout;
          var expiredItems = _cacheMap.Where(i => i.Value.Updated < oldThreshold).Select(i => i.Key);
          for (int i = 0; i < expiredItems.Count(); i++)
          {
            var key = expiredItems.ElementAt(i);
            DisposeChannelsByKey(key);
            InitWorkingChannelsByKey(key);
          }
        }
      }
      finally
      {
        Interlocked.Exchange(ref _executing, 0);
      }
    }

  

gRPC Client源代码已上传git,本人比较懒没有完整上传解决方案,该有的都有了。

时间: 2024-10-18 17:48:43

gRPC Client的负载均衡器的相关文章

gRPC客户端的负载均衡器

一.gRPC是什么? gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言.gRPC提供了一种简单的方法来精确地定义服务和为iOS.Android和后台支持服务自动生成 可靠性很强的客户端功能库.客户端充分利用高级流和链接功能,从而有助于节省带宽.降低的TCP链接次数.节省CPU使用.和电池寿命. 二.为什么使用gRPC? 有了 gRPC, 我们

gRPC helloworld service, RESTful JSON API gateway and swagger UI

概述 本篇博文完整讲述了如果通过 protocol buffers 定义并启动一个 gRPC 服务,然后在 gRPC 服务上提供一个 RESTful JSON API 的反向代理 gateway,最后通过 swagger ui 来提供 RESTful JSON API 的说明,完整代码 helloworld_restful_swagger. Helloworld gRPC Service 参考 gRPC Quick Start for Python. Install gRPC 安装 gRPC 运

gRPC GoLang Test

gRPC是Google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x +. gRPC与thrift.avro-rpc.WCF等其实在总体原理上并没有太大的区别,简而言之GRPC并没有太多突破性的创新. protobuf相对于用Json方式传输,效率有很大提高,Kubernetes也从最初的Json转换成了gRPC. gRPC 在服务端提供一个 gRPC Server,客户端的库是 gRPC Stub. 典型的场景是客户端发送请求,同

.net core grpc 实现通信

现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端.服务端通信. grpc是google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架,使用HTTP/2协议并用ProtoBuf作为序列化工具,提供跨语言.跨平台支持.下面以.net core演示如何使用grpc框架实现通信. 软件版本 .net core:2.0 grpc:1.11.0 项目结构 InstallGrpc .net framework类库 只为得到生成协议代

基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

0.简介 0.1 什么是 Consul Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程当中所需要的诸如 Rpc.Redis.Mysql 等需要调用的资源. 简而言之 Consul 就是根据 Key/Value 存储了一套所有服务的 IP/Port 集合,当你 Grpc 客户端需要请求某种服务的时候,具体的 IP 与端口不需要你自己来进行指定,而是通过与 Consul Agent 通信

[.Net Core] - 在 .NET Core 中创建 gRPC 服务端和客户端

gRPC 官网:https://grpc.io/ 1. 创建服务端 1.1 基于 ASP.NET Core Web 应用程序模板创建 gRPC Server 项目. 1.2 编译并运行 2. 创建客户端 2.1 基于控制台应用程序模板创建 gRPC Client 项目,并安装 Nuget 包(Google.Protobuf,Grpc,Grpc.Core,Grpc.Tools). 2.2 拷贝 Server 项目中的 Protos/greet.proto 文件到 Client 项目中 2.3 更新

gRPC HelloWorld测试

一.概述 What's gRPC?gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authe

【ASP.NET Core学习】远程过程调用 - gRPC使用

本文介绍在gRPC使用,将从下面几个方面介绍 什么是RPC 什么时候需要RPC 如何使用gRPC 什么是RPC RPC是Remote Procedure Call简称,翻译过来是远程过程调用.它是一个进程间的通讯技术,基于Client-Server模式,让程序像调用本地方法一样使用,而无需去关系它细节如何实现. 上面是我的理解,怕理解有错或者表达不准确,下面引用维基百科 维基百科 a remote procedure call (RPC) is when a computer program c

gRPC详解

gRPC是什么? gRPC是什么可以用官网的一句话来概括 A high-performance, open-source universal RPC framework 所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型.使用的时候客户端调用server端提供的接口就像是调用本地的函数一样.如下图所示就是一个典型的RPC结构图. RPC通信 gRPC有什么好处以及在什么场景下需要用