一、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,本人比较懒没有完整上传解决方案,该有的都有了。

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

  1. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

  2. gRPC Client Middleware.

    中间件想必大家不陌生,今天给大家介绍如何实现中间件以及实现gRPC的客户端中间件. 什么是中间件? https://docs.microsoft.com/zh-cn/aspnet/core/funda ...

  3. gRPC源码分析1-SSL/TLS

    引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...

  4. gRPC .NET Core跨平台学习

    前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...

  5. gRPC helloworld service, RESTful JSON API gateway and swagger UI

    概述 本篇博文完整讲述了如果通过 protocol buffers 定义并启动一个 gRPC 服务,然后在 gRPC 服务上提供一个 RESTful JSON API 的反向代理 gateway,最后 ...

  6. 开始食用grpc(之一)

    开始食用grpc(之一) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9501353.html ```   记一次和一锅们压马路,路过一咖啡厅(某巴克),随口 ...

  7. gRPC 在 Python中的应用

    python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. hello.proto 简介 在python ...

  8. Abp + gRpc 如何实现用户会话状态传递

    0.背景 在实际项目当中,我们采用的是 Abp 框架,但是 Abp 框架官方并没有针对 Grpc 进行模块封装.基于此我结合 Abp 与 MagicOnion 封装了一个 Abp.Grpc 模块,它包 ...

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

    0.简介 0.1 什么是 Consul Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程 ...

随机推荐

  1. [转]使用 HttpClient 和 HtmlParser 实现简易爬虫

    http://www.ibm.com/developerworks/cn/opensource/os-cn-crawler/ http://blog.csdn.net/dancen/article/d ...

  2. VML/SVG在Web开发中一些常见的框架

    1.借鉴自: http://www.codefans.net/soft/3061.shtml 来源于网上. flowchart.js  http://adrai.github.io/flowchart ...

  3. python 实例属性之单,双下划线

    具体区别看下面例子 class A: def __init__(self,name='Andy'): self._name = name class B: def __init__(self,name ...

  4. Spring的java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!异常处理方法

    使用Spring提供的模板类HibernateDaoSupport,如果单纯的使用'命名参数'的形式编写HQL语句如: public class UserDaoImpl extends Hiberna ...

  5. TestCase--网站登录模块

    以京东的登录页面为例 测试用例设计如下: 一.功能测试 1. 什么都不输入,点击登录按钮,系统是否给出提示2. 输入正确的用户名和密码,点击登录按钮,验证是否能正确登录3. 输入错误的用户名.正确的密 ...

  6. OSChina中远程GIT仓库同步探索

    GIT平台在OSChina中的搭建帮了我们很大的忙,但如何将本地GIT仓库上传至OSChina的远程仓库,相信这是一个艰难的坎,今天我就在此总结我的成功经验,帮助大家,共同学习.由于条件有限,我全部的 ...

  7. Flex4 DataGrid实现可复制单元格,同时解决自定义GridItemRenderer出现1009错误的方法

    原创内容,如需转载,请注明出处,谢谢 最近在项目中发现Flex的DataGrid不支持内容复制,在涉及到保护敏感数据时倒是很有用处,但大部分情况下,我们还是希望客户能够直接复制DataGrid单元格中 ...

  8. mistral 工作流组件之二 思维导图

    Mistral 思维导图

  9. 【PL/SQL练习】控制结构

    1.if判断: if-then-end if: SQL> declare v_ename emp.ename%type; v_sal emp.sal%type; begin select ena ...

  10. asp.net 播放flash

    注意3点: 1.路径,swf播放器对应的是当前页面的路径,flv视频对应的是swf播放器的路径2.路径中不能出现中文3.IIS设置,IIS站点属性中的HTTP头->MIME添加MIME影射关系, ...