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为湖南心莱信息 ...
随机推荐
- Blockchain & BPM
http://www.infoq.com/cn/news/2018/07/blockchain-BPM?utm_source=notification_email&utm_campaign=n ...
- composer Changed current directory to没反应
根据官方手册执行composer global require "laravel/installer" 显示Changed current directory to C:/User ...
- MacBook Pro设置外接显示器竖屏显示 切换主显示器
切换主显示器设置 有一些使用 Mac 电脑的用户,比如笔记本用户,可能会由于屏幕太小想外接一个更大的显示器,也或是有多显示输出的需求.当 Mac 电脑上有了多个显示器以后,此时便会有主副显示区之分了. ...
- [转][linux][centos]嵌入式 Linux下编译并使用curl静态库
#x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...
- linux6 x86-64 RPM包安装mysql5.7.20
注意版本和此次更新时间 2017-12-03 版本:mysql-5.7.20-1.el6.x86_64 环境:linux6.x 官方下载地址: wget https://dev.mysql.co ...
- linux传输文件lrzsz
linux传输文件
- Python初级 2 记住内存和变量的练习
一.数据类型: 数字:3, 5, 100, 50.35 字符串:"abc","wang" 字符串或数字可以由名字来表示,名字也叫变量 二.算术表达式: 形如3 ...
- 【Leetcode_easy】944. Delete Columns to Make Sorted
problem 944. Delete Columns to Make Sorted 题意:其实题意很简单,但是题目的description给整糊涂啦...直接看题目标题即可理解. solution: ...
- 02点睛Spring4.1-Java Config
转载:https://www.iteye.com/blog/wiselyman-2210376 2.1 java config spring的java config主要使用@Configuration ...
- 微服务Consul系列之服务注册与服务发现
在进行服务注册之前先确认集群是否建立,关于服务注册可以看上篇微服务Consul系列之集群搭建的介绍,两种注册方式:一种是注册HTTP API.另一种是通过配置文件定义,下面讲解的是基于后者配置文件定义 ...