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,本人比较懒没有完整上传解决方案,该有的都有了。
gRPC Client的负载均衡器的更多相关文章
- Building gRPC Client iOS Swift Note Taking App
gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...
- gRPC Client Middleware.
中间件想必大家不陌生,今天给大家介绍如何实现中间件以及实现gRPC的客户端中间件. 什么是中间件? https://docs.microsoft.com/zh-cn/aspnet/core/funda ...
- gRPC源码分析1-SSL/TLS
引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...
- gRPC .NET Core跨平台学习
前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...
- gRPC helloworld service, RESTful JSON API gateway and swagger UI
概述 本篇博文完整讲述了如果通过 protocol buffers 定义并启动一个 gRPC 服务,然后在 gRPC 服务上提供一个 RESTful JSON API 的反向代理 gateway,最后 ...
- 开始食用grpc(之一)
开始食用grpc(之一) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9501353.html ``` 记一次和一锅们压马路,路过一咖啡厅(某巴克),随口 ...
- gRPC 在 Python中的应用
python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. hello.proto 简介 在python ...
- Abp + gRpc 如何实现用户会话状态传递
0.背景 在实际项目当中,我们采用的是 Abp 框架,但是 Abp 框架官方并没有针对 Grpc 进行模块封装.基于此我结合 Abp 与 MagicOnion 封装了一个 Abp.Grpc 模块,它包 ...
- 基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现
0.简介 0.1 什么是 Consul Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程 ...
随机推荐
- ORACLE快速彻底Kill掉的会话(转载)
转载:http://www.cnblogs.com/kerrycode/p/4034231.html 在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid ...
- linux下USB转串口驱动的安装
ubuntu10.04,usb串口用的是moxa 1110 搞了半天没有驱动... 去官方下了个:http://www.moxa.com/support/sarch_result.aspx?type= ...
- java 倒序输出
输入五句话,用数组存储起来,然后逆序输出这五句话. import java.util.Scanner; class work1{ public static void main(String[] a ...
- VC ClistCtrl不同行背景色
大家经常用到listctrl 做表格 为了好看,要给每行设置不同背景色.很实用的一个小技巧. 1:首先在.h里添加以下消息 afx_msg void OnDrawColorForMyList(NMHD ...
- Android开发-API指南- Calendar Provider
Calendar Provider 英文原文:http://developer.android.com/guide/topics/providers/calendar-provider.html 采集 ...
- Nodejs文件服务器
最近一直在忙于一个比较大的项目,在项目中需要有个文件服务器来支持.老鸟们建议我去用NodeJs来实现,我在接手这个项目之前其实并不了解NodeJs,但是一直想去了解.借着这个机会好好去学习一下.下面是 ...
- 从100PV到1亿级PV网站架构演变
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 一个网站就像一个人,存在一个从小到大的过程.养一个网站和养一个人一样,不同时期需要不 ...
- 洛谷P1474 货币系统 Money Systems
P1474 货币系统 Money Systems 250通过 553提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 母牛们不但创 ...
- 解决ScrollView下嵌套ListView、GridView显示不全的问题
/** * 自定义gridview,解决ListView中嵌套gridview显示不正常的问题(1行半) * @author wangyx * @version 1.0.0 2012-9-14 */ ...
- Android内存泄漏分析
周末去上海参加了安卓巴士组织的技术论坛,去了才发现自己基础很渣..... 其中提到了android的内存泄漏的问题,回来马上度娘(虽说度娘很渣),整理如下: 一.单例造成的内存泄漏 因为单例的静态特性 ...