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. MySQL 正则(Regular Expression) 邮箱(Email)

    MySQL 正则表达式 | 菜鸟教程https://www.runoob.com/mysql/mysql-regexp.html (1条消息)常用正则表达式—邮箱(Email) - Samuel - ...

  2. Typescript中的类 Es5中的类和静态方法和继承(原型链继承、对象冒充继承、原型链+对象冒充组合继承)

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  3. 手动卸载wine-stable卸载

    装了wine发现运行TIM全都乱码,于是手动卸载wine: 删除文件:(参考https://blog.csdn.net/taizhoufox/article/details/5496568) ~/.w ...

  4. 安装ORACLE服务出现Oracle Net Configuration Assistant 失败问题【我】

    安装ORACLE服务出现Oracle Net Configuration Assistant 失败问题 本地安装oracle11g,报错提示: 参考下面文章: 报错原因: 主要是对文件系统的访问权限问 ...

  5. PL-SQL Developer 配置使用Oracle客户端连接

    没有在本地安装Oracle 的用户必须下载一个instantclient(即使客户端), 路径指向这里,才能正常使用 下载 instantclient-basic-nt-11.2.0.3.0.zip ...

  6. PAT 甲级 1068 Find More Coins (30 分) (dp,01背包问题记录最佳选择方案)***

    1068 Find More Coins (30 分)   Eva loves to collect coins from all over the universe, including some ...

  7. Spring MVC入门的实例

      作为Spring MVC入门,以XML配置的方式为例.首先需要配置Web工程的web.xml文件. 代码清单14-1:web.xml配置Spring MVC <?xml version=&q ...

  8. HTML中设置在浏览器中固定位置fixed定位

    之前的博文 HTML布局排版之制作个人网站的文章列表,中链接到的文章本身,也需要返回到列表主页,可在每个文章页面加导航条,也可以只加个返回到列表主页的链接.刚开始是想在博文最下方,加个返回文章列表的链 ...

  9. IIS+PHP本地开发环境配置

    打开Win7系统自带IIS.如图只要点击两下,CGI一定要勾选上!完成后打开浏览器输入127.0.0.1测试一下,如果能打开页面说明iis开启成功. 安装PHP.不同版本的PHP会有所不同,这里使用的 ...

  10. Cas(03)——Cas Server中各配置文件介绍

    Cas Server中各配置文件介绍 Cas Server中所有的配置文件都是放在WEB-INF目录及其子目录下的. 在WEB-INF/classes下的配置文件有: l  cas-theme-def ...