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为湖南心莱信息 ...
随机推荐
- layer.msg 弹出不同的效果的样式
icon 1到6的不同效果 layer.msg(,time:, shift: });//一个勾 layer.msg(,time:, shift: });//一个叉 layer.msg(,time:, ...
- c代码审查软件
1. Coccinelle http://coccinelle.lip6.fr/
- nginx: [warn] conflicting server name "aaa.bbbb.com" on 0.0.0.0:80, ignored
date: 2019-08-12 16:52:44 author: headsen chen notice :个人原创 故障现象: openresty -t nginx: [warn] confli ...
- 十一、LoadRunner组成和工作原理
一.LoadRunner组成 虚拟用户发生器:Vuser Generator 压力调度和监控中心:Controller 压力生产器:Load Generator 压力结果分析工具:Analysis
- pytorch常用的padding函数
1)ReflectionPad2d CLASS torch.nn.ReflectionPad2d(padding) 使用输入边界的反射来填充输入tensor 对于N维的填充,使用torch.nn.fu ...
- Oracle中RAISE异常
转: Oracle中RAISE异常 由三种方式抛出异常 1. 通过PL/SQL运行时引擎 2. 使用RAISE语句 3. 调用RAISE_APPLICATION_ERROR存储过程 当数据库或PL/S ...
- k8s记录-使用kube-proxy让外部网络访问K8S service的ClusterIP (转载)
配置方式 kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是:修改master的/etc/kubernetes/proxy,把KUBE_P ...
- online学习和offline学习
参考:https://blog.csdn.net/a133521741/article/details/79221015 解释: (1)offline学习:每次训练完一个batch后再更新参数: (2 ...
- k8s中实现永久无法删除一个pod---也就是在deployment.yaml中定义副本数量
参照:https://www.cnblogs.com/effortsing/p/10486960.html 这里面的deployment.yaml对应的pod就是永久无法删除的
- 【Leetcode_easy】1042. Flower Planting With No Adjacent
problem 1042. Flower Planting With No Adjacent 参考 1. Leetcode_easy_1042. Flower Planting With No Adj ...