GRPC代替webapi Demo。
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。
gRPC 的主要优点是:
- 现代高性能轻量级 RPC 框架。
- 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
- 可用于多种语言的工具,以生成强类型服务器和客户端。
- 支持客户端、服务器和双向流式处理调用。
- 使用 Protobuf 二进制序列化减少对网络的使用。
这些优点使 gRPC 适用于:
- 效率至关重要的轻量级微服务。
- 需要多种语言用于开发的 Polyglot 系统。
- 需要处理流式处理请求或响应的点对点实时服务。
以上来自微软的文档:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/index?view=aspnetcore-3.0
个人理解:
- gRPC采用HTTP/2协议,二进制传输,相比json,xml速度更快,更节省流量。
- 支持流,只需要建立一次连接,适合服务间通讯。
- 规范的接口标准。
- 跨语言。
补充:
Restful是一种架构风格,关注的是资源。
通过每次http请求把资源拿过来,但资源怎么用是客户端的事情。
gRpc是rpc的一个实现框架,因此关注其中的rpc远程过程调用。
意思是在客户端调用服务器方法就像调用本地方法一样。如果这样做,那么服务器就必须要有相应的处理的方法(参数和返回值)。
grpc在proto文件中定义了方法名和返回值,在各种语言中,我们只需要在服务器和客户端实现相应的方法即可。
以下Demo主要体现了服务端与客户端以流式RPC的方式,并对比webapi的方式。
*必须使用http/2,因此需要在服务器上监听端口设置。
//支持无tls的http/2。
webBuilder.ConfigureKestrel(options =>
{
options.ListenLocalhost(, o => o.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2);
});
*客户端需要设置
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
C#自动生成代码,客户端需要从nuget安装:
Google.Protobuf
Grpc.Core
Grpc.Net.ClientFactory
Grpc.Tools
项目文件:
<ItemGroup>
<Protobuf Include="Protos\Duplicate.proto" GrpcServices="Client">
</Protobuf>
</ItemGroup>
服务的需要
Grpc.Tools
Grpc.AspNetCore.Server
Grpc.AspNetCore
项目文件:
<ItemGroup>
<Protobuf Include="Protos/Duplicate.proto" GrpcServices="Server" />
</ItemGroup>
该Demo模拟了一个判重的服务器和客户端。
public interface IDuplicate
{
/// <summary>
/// 将标签进入判重。
/// </summary>
/// <param name="tag">标签。</param>
/// <returns>保存成功后将返回一个值。</returns>
bool EntryDuplicate(string tag); /// <summary>
/// 判断标签是否已经存在。
/// </summary>
/// <param name="tag">标签。</param>
/// <returns>如果标签存在则返回true。</returns>
bool DuplicateCheck(string tag); /// <summary>
/// 删除一条标签。
/// </summary>
/// <param name="tag">标签。</param>
/// <returns>返回结果。</returns>
bool RemoveItem(string tag);
}
Proto配置:
syntax = "proto3"; // 命名空间。
option csharp_namespace = "GrpcServer.Protos"; package Duplicate; service Duplicater{ // 进队列接口。
rpc EntryDuplicate(stream EntryRequset) returns (stream EntryResponse); // 判重接口。
rpc DuplicateCheck(stream DuplicateCheckRequset) returns (stream DuplicateCheckResponse);
} // 进队列请求。
message EntryRequset{
// tag=1,表示在传输过程中,此数据的名字就是1。
string tag=;
} // 进队后响应。
message EntryResponse{
bool result=;
string msg=;
} // 判重请求。
message DuplicateCheckRequset{
string tag=;
} // 判重后响应。
message DuplicateCheckResponse{
bool result=;
}
Demo中主要实现了入判重的方法。
/// <summary>
/// 入判重。
/// </summary>
/// <param name="requestStream">请求流。</param>
/// <param name="responseStream">响应流。</param>
/// <param name="context">上下文。</param>
/// <returns></returns>
public override async Task EntryDuplicate(IAsyncStreamReader<EntryRequset> requestStream, IServerStreamWriter<EntryResponse> responseStream, ServerCallContext context)
{
while (await requestStream.MoveNext())
{
var result = _memoryDuplicate.EntryDuplicate(requestStream.Current.Tag);
var msg = string.Empty;
if (result)
msg = $"{requestStream.Current.Tag} 入判重成功。";
else
msg = $"{requestStream.Current.Tag} 入判重失败,已有重复的数据";
_logger.LogInformation(msg); await responseStream.WriteAsync(new EntryResponse { Result = result, Msg = msg });
} _logger.LogInformation("本次请求已完成");
}
由客户端告知流传输结束,然后释放连接:
var token = new CancellationToken();
var response = Task.Run(async () =>
{
while (await entry.ResponseStream.MoveNext(token))
{
if (entry.ResponseStream.Current.Result)
Console.WriteLine($"{entry.ResponseStream.Current.Msg}");
else
Console.WriteLine($"{entry.ResponseStream.Current.Msg}入判重失败。");
}
});
for (int i = ; i < length; i++)
{
SpinWait.SpinUntil(() => false, );
var msg = random.Next(, ).ToString();
await entry.RequestStream.WriteAsync(new EntryRequset { Tag = msg });
} Console.WriteLine("等待释放链接。");
await entry.RequestStream.CompleteAsync();
entry.Dispose();
Console.WriteLine("完成");
Grpc:

WebApi:

github地址:https://github.com/yeqifeng2288/GrpcDemo
GRPC代替webapi Demo。的更多相关文章
- traefik+etcd构建grpc微服务demo
1.下载安装traefik https://github.com/containous/traefik/releases 2.下载安装etcd3 https://github.com/coreos/e ...
- gRPC四种模式、认证和授权实战演示,必赞~~~
前言 上一篇对gRPC进行简单介绍,并通过示例体验了一下开发过程.接下来说说实际开发常用功能,如:gRPC的四种模式.gRPC集成JWT做认证和授权等. 正文 1. gRPC四种模式服务 以下案例演示 ...
- [gRPC via C#] gRPC本质的探究与实践
鉴于内容过多,先上太长不看版: grpc 就是请求流&响应流特殊一点的 Http 请求,性能和 WebAPI 比起来只快在 Protobuf 上: 附上完整试验代码:GrpcWithOutSD ...
- gRPC编码初探(java)
背景:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众 ...
- gRPC官方快速上手学习笔记(c#版)
上手前准备工作 支持操作系统:windows.OS X.Linux.实例采用.net..net core sdk. The .NET Core SDK command line tools. The ...
- WebApi跨域问题解决
因为第一次用webapi,并且还是前后台分离,所以设置到了跨域,在百度上找了很多解决办法,但是基本都存在缺陷,我这里分享一下我自己的经验 1.首先配置Web.config 这样配置发布到服务器就可以跨 ...
- gRPC快速入门记录
为什么使用grpc 1.protocl buffer一种高效的序列化结构. 2.支持http 2.0标准化协议. http/2 1.http/2对每个源只需创建一个持久连接,在这一个连接内,可以并行的 ...
- ASP.NET Core gRPC 使用 Consul 服务注册发现
一. 前言 gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍 ...
- Magicodes.WeiChat——版本发布历史
购买地址:https://item.taobao.com/item.htm?id=520205558575 您可以在新标签页打开此图,以查看原始图片. Magicodes.WeiChat为湖南心莱信息 ...
随机推荐
- PHP7 serialize_precision 配置不当导致 json_encode() 浮点小数溢出错误
https://blog.csdn.net/moliyiran/article/details/81179825 感谢 @地狱星星:原因已找到, 该现象只出现在PHP 7.1+版本上建议使用默认值 s ...
- consul_nginx_uprsync动态负载均衡
consul_nginx_uprsync动态负载均衡 环境准备: 原理描述: 将Nginx的负载均衡后端服务器配置信息写入consul的接口中,upsync插件通过读取consul的配置,然后持久化到 ...
- Python3基础 全局变量 在函数内可使用,不可直接修改
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- xcopy命令拷贝文件夹和文件
文件夹: xcopy /r /y 'c:123\' 'D:\123\' 文件: echo f | xcopy /d /r /k c:\index2.htm c:\index.htm
- 如何取到el-select中的label
在el-select中我们一般都是取到value的值,但是有时候我们需要value和label都需要.那怎么方便的取到呢 在网上经常有ref="cascader"这个方法,但是经过 ...
- MApp_ZUI_CTL_MarqueeTextWinProc字串滚动
/////////////////////////////////////////////////////////////////////////////// /// global MApp_ZUI_ ...
- Ubuntu中Qt Creator无法启动调试
Ubuntu下安装Qt creator后无法启动调试,报错为Ptrace:Operation not permitted. 产生原因: 在Ubuntu 11.04("Natty Narwha ...
- Python3实现自动查询成绩(主要使用的包有Tesseract-OCR、PIL、execjs、pytesseract、BeautifulSoup)
前提:本文仅作为技术训练,不可利用技术做非法的事. 某考试的成绩查询页面如下:查询成绩需要的数据有准考证号或者身份证.考生姓名.验证码.现在使用python来实现自动查询指定人员的考试成绩(不知道准考 ...
- 深入理解Flink核心技术及原理
前言 Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注.本文将深入分析Flink的一些关键技术与特性,希望 ...
- (零)引言——关于effective Java 3th
去年4月份那时候,读过本书的第二版本,那时候寻思着好好读完,但是事与愿违,没有读完! 现在起,寻思着再次开始读吧: 现在第三版也出版了,还有第二版的翻译问题,遂决定读第三版的英文版吧: PDF版本可以 ...