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。的更多相关文章

  1. traefik+etcd构建grpc微服务demo

    1.下载安装traefik https://github.com/containous/traefik/releases 2.下载安装etcd3 https://github.com/coreos/e ...

  2. gRPC四种模式、认证和授权实战演示,必赞~~~

    前言 上一篇对gRPC进行简单介绍,并通过示例体验了一下开发过程.接下来说说实际开发常用功能,如:gRPC的四种模式.gRPC集成JWT做认证和授权等. 正文 1. gRPC四种模式服务 以下案例演示 ...

  3. [gRPC via C#] gRPC本质的探究与实践

    鉴于内容过多,先上太长不看版: grpc 就是请求流&响应流特殊一点的 Http 请求,性能和 WebAPI 比起来只快在 Protobuf 上: 附上完整试验代码:GrpcWithOutSD ...

  4. gRPC编码初探(java)

    背景:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众 ...

  5. gRPC官方快速上手学习笔记(c#版)

    上手前准备工作 支持操作系统:windows.OS X.Linux.实例采用.net..net core sdk. The .NET Core SDK command line tools. The ...

  6. WebApi跨域问题解决

    因为第一次用webapi,并且还是前后台分离,所以设置到了跨域,在百度上找了很多解决办法,但是基本都存在缺陷,我这里分享一下我自己的经验 1.首先配置Web.config 这样配置发布到服务器就可以跨 ...

  7. gRPC快速入门记录

    为什么使用grpc 1.protocl buffer一种高效的序列化结构. 2.支持http 2.0标准化协议. http/2 1.http/2对每个源只需创建一个持久连接,在这一个连接内,可以并行的 ...

  8. ASP.NET Core gRPC 使用 Consul 服务注册发现

    一. 前言 gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍 ...

  9. Magicodes.WeiChat——版本发布历史

    购买地址:https://item.taobao.com/item.htm?id=520205558575 您可以在新标签页打开此图,以查看原始图片. Magicodes.WeiChat为湖南心莱信息 ...

随机推荐

  1. PHP7 serialize_precision 配置不当导致 json_encode() 浮点小数溢出错误

    https://blog.csdn.net/moliyiran/article/details/81179825 感谢 @地狱星星:原因已找到, 该现象只出现在PHP 7.1+版本上建议使用默认值 s ...

  2. consul_nginx_uprsync动态负载均衡

    consul_nginx_uprsync动态负载均衡 环境准备: 原理描述: 将Nginx的负载均衡后端服务器配置信息写入consul的接口中,upsync插件通过读取consul的配置,然后持久化到 ...

  3. Python3基础 全局变量 在函数内可使用,不可直接修改

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  4. xcopy命令拷贝文件夹和文件

    文件夹: xcopy /r /y 'c:123\' 'D:\123\' 文件: echo f | xcopy  /d /r /k  c:\index2.htm c:\index.htm

  5. 如何取到el-select中的label

    在el-select中我们一般都是取到value的值,但是有时候我们需要value和label都需要.那怎么方便的取到呢 在网上经常有ref="cascader"这个方法,但是经过 ...

  6. MApp_ZUI_CTL_MarqueeTextWinProc字串滚动

    /////////////////////////////////////////////////////////////////////////////// /// global MApp_ZUI_ ...

  7. Ubuntu中Qt Creator无法启动调试

    Ubuntu下安装Qt creator后无法启动调试,报错为Ptrace:Operation not permitted. 产生原因: 在Ubuntu 11.04("Natty Narwha ...

  8. Python3实现自动查询成绩(主要使用的包有Tesseract-OCR、PIL、execjs、pytesseract、BeautifulSoup)

    前提:本文仅作为技术训练,不可利用技术做非法的事. 某考试的成绩查询页面如下:查询成绩需要的数据有准考证号或者身份证.考生姓名.验证码.现在使用python来实现自动查询指定人员的考试成绩(不知道准考 ...

  9. 深入理解Flink核心技术及原理

    前言 Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注.本文将深入分析Flink的一些关键技术与特性,希望 ...

  10. (零)引言——关于effective Java 3th

    去年4月份那时候,读过本书的第二版本,那时候寻思着好好读完,但是事与愿违,没有读完! 现在起,寻思着再次开始读吧: 现在第三版也出版了,还有第二版的翻译问题,遂决定读第三版的英文版吧: PDF版本可以 ...