GRPC代替webapi Demo。
2021-05-17 08:27
标签:优点 remove namespace use result pac option 允许 http请求 gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。 gRPC 的主要优点是: 这些优点使 gRPC 适用于: 以上来自微软的文档:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/index?view=aspnetcore-3.0 个人理解: 补充: Restful是一种架构风格,关注的是资源。 通过每次http请求把资源拿过来,但资源怎么用是客户端的事情。 gRpc是rpc的一个实现框架,因此关注其中的rpc远程过程调用。 意思是在客户端调用服务器方法就像调用本地方法一样。如果这样做,那么服务器就必须要有相应的处理的方法(参数和返回值)。 grpc在proto文件中定义了方法名和返回值,在各种语言中,我们只需要在服务器和客户端实现相应的方法即可。 以下Demo主要体现了服务端与客户端以流式RPC的方式,并对比webapi的方式。 *必须使用http/2,因此需要在服务器上监听端口设置。 *客户端需要设置 C#自动生成代码,客户端需要从nuget安装: Google.Protobuf Grpc.Core Grpc.Net.ClientFactory Grpc.Tools 项目文件: 服务的需要 Grpc.Tools Grpc.AspNetCore.Server Grpc.AspNetCore 项目文件: 该Demo模拟了一个判重的服务器和客户端。 Proto配置: Demo中主要实现了入判重的方法。 由客户端告知流传输结束,然后释放连接: Grpc: WebApi: github地址:https://github.com/yeqifeng2288/GrpcDemo GRPC代替webapi Demo。 标签:优点 remove namespace use result pac option 允许 http请求 原文地址:https://www.cnblogs.com/yeqifeng2288/p/11762579.html
//支持无tls的http/2。
webBuilder.ConfigureKestrel(options =>
{
options.ListenLocalhost(5000, o => o.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2);
});
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
public interface IDuplicate
{
///
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=1;
}
// 进队后响应。
message EntryResponse{
bool result=1;
string msg=2;
}
// 判重请求。
message DuplicateCheckRequset{
string tag=1;
}
// 判重后响应。
message DuplicateCheckResponse{
bool result=1;
}
///
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 = 0; i )
{
SpinWait.SpinUntil(() => false, 200);
var msg = random.Next(0, 2000).ToString();
await entry.RequestStream.WriteAsync(new EntryRequset { Tag = msg });
}
Console.WriteLine("等待释放链接。");
await entry.RequestStream.CompleteAsync();
entry.Dispose();
Console.WriteLine("完成");
上一篇:Windows 10/Win10命令大全通用(Win8,Win7)
下一篇:.Net Core 遇到 “'windows-1252' is not a supported encoding name.”
文章标题:GRPC代替webapi Demo。
文章链接:http://soscw.com/index.php/essay/86631.html