手机版

ASP.NET CORE推出的gRPC服务模板图解分析

时间:2021-08-26 来源:互联网 编辑:宝哥软件园 浏览:

听说ASP.NET的Core 3.0引入了gRPC服务模板,正好利用我家电脑刚做了新系统的情况,然后安装了VS2019体验一下。同时,记录体验过程。如果您想遵循本文中的步骤,您必须首先安装的SDK。NET Core3.0预览版。至于开发工具,我用的是VS2019。当然,也可以使用VS Code。

gRPC的简单介绍

gRPC是一个独立于语言的高性能远程过程调用(RPC)框架。有关gRPC基础知识的更多信息,请参见gRPC文档页面。

gRPC的主要优势是:

现代高性能轻量级RPC框架。协议优先考虑API开发,默认使用协议缓冲区,允许独立于语言的实现。可以用多种语言生成强类型服务器和客户端的工具。支持客户端、服务器和双向流调用。使用Protobuf二进制序列化来减少网络的使用。这些优势使gRPC适用于:

效率至关重要的轻量级微服务。多语种系统需要多种语言来开发。需要处理流请求或响应的点对点实时服务。

ASP.NET Core 3.0上gRPC服务模板初体验

创建gRPC服务

1.打开VS2019,从Visual Studio文件菜单中选择新建项目。(因为我是新打开的VS,所以创建一个新项目,如下图所示)

2.如下图所示,选择创建《ASP.NET Core Web 应用程序》,然后单击下一步

3.如下图所示,在此页面输入项目名称、位置和解决方案名称,然后点击右下角的“创建”按钮进行创建。

4.你认为以上步骤中点击“创建”就结束了吗?同意创建gRPC服务模板。因此,点击上方的Create后,会弹出如下图所示的窗口,可以选择如下图所示的一个gRPC服务模板,然后再次点击右下角的Create,这才是真正的创建项目。

5.创建成功后,将出现下图所示的项目结构

6.至此,我们已经创建了一个gRPC服务的模板。接下来,我们将首先测试它,然后好好看看这个模板的结构

测试gRPC服务

1.首先打开HelloGrpc的工作目录。服务器,然后按住鼠标右键弹出如下图所示的右键菜单,打开如图所示的ps窗口

2.输入dotnet run命令运行这个gRPC服务器项目,如下图所示,显示服务器正常启动,开始监听对应的端口。

3.同样,我们启动客户端。此时,客户端将发送一条问候消息,其中包含名为“问候客户端”的消息。服务器将发送一条消息“你好,问候客户端”作为响应,并在命令提示符下显示。如下图所示:

4.到目前为止,gRPC服务模板创建的服务器和客户端已经测试成功。让我们好好看看这个服务模板。

gRPC模板解析

HelloGrpc的最终项目中有以下文件。服务器服务

Greet.proto:文件greeter.proto定义了Greeter gRPC,用于生成gRPC服务器资产。服务文件夹:包含Greeter服务的实现。包含配置数据,比如红隼使用的协议。(你一定熟悉ASP.NET核心。)Program.cs:包含gRPC服务的入口点。(你一定熟悉ASP.NET核心。)Startup.cs:IWebHostBuilder的启动配置文件包含配置应用程序行为的代码。(您必须熟悉ASP.NET核心)gRPC客户端的hellogRPC.client文件:

Program.cs包含gRPC客户端的入口点和逻辑。

让我们再次打开每个文件,看看里面有什么。

原型文件

样机

GRPC采用惯例优先的API开发方法。默认情况下,协议缓冲区(Protobuf)用作接口设计语言(IDL)。这个。原型文件包含:

GRPC服务的定义。客户端和服务器之间发送的消息。有关Protobuf文件语法的更多信息,请参见官方文件(原型)。

例如,在我们的模板中创建的greet.proto文件的内容如下:

语法=' proto3包装问候;//问候语服务定义. service Greeter { //发送问候语rpc SayHello (HelloRequest)返回(hellorePly){ }//请求消息包含用户名. message HelloRequest {字符串名称=1;}//包含问候语的响应消息. message HelloReply { string message=1;}定义Greeter服务。这个迎宾服务定义了“说你好”请求。SayHello发送HelloRequest消息并接收HelloResponse消息:然后你可能要问,这是怎么回事。项目中包含原型文件?事实上如果你打开。csproject文件,可以通过将其添加到Protobuf的ItemGroup中来查看。如下所示:项目组protobuf include='.\ protos \ *。proto ' grp services=' server '/content include=' @(proto buf)' link base=' '//item group PC #工具支持。原型文件

Grpc工具包。工具用于从生成C#文件。原型文件。生成的资产(文件)具有以下特征:

每次构建项目时,都会根据需要生成。生成的文件不会添加到项目中,也不会签入源代码管理。生成的C#文件包含在OBJ目录中。服务器和客户端项目都需要此包。Grpc。工具可以使用VisualStudio中的包管理器或将包引用添加到项目文件中:

XML复制

包引用include=' grpc.tools '版本=' 1 . 19 . 0-pre 1 ' PrivateAssets='All '/包在运行时不是必需的,因此应该使用private assets=' All '。

服务文件夹中的具体gRPC服务

我们知道Grpc。工具工具包将根据的定义翻译并生成相应的C#类型文件。原型文件。

对于服务器端资产,将生成一个抽象的服务基类型。基类型包含中包含的所有GRPC调用的定义。原型文件。然后,您将创建一个从这个基类型派生的具体服务实现,并实现由GRPC调用的逻辑。对于前面描述的greet.proto示例,将生成一个包含虚拟SayHello方法的抽象GreeterBase类型。GreeterService的具体实现覆盖了这个方法,并实现了处理GRPC调用的逻辑。就像HelloGrpc中的服务\问候服务. cs中的代码一样。服务器项目

公开课迎宾服务:迎宾员。GreeterBase { public override tashelloreply say hello(HelloRequest请求,ServerCallContext上下文){ return Task。FromResult(新的HelloReply { Message='Hello '请求。name });}}对于客户端,将生成特定客户端类型的GRPC呼叫。那个。proto文件被转换为可以调用的具体类型的方法。对于上面由greet.proto描述的例子,生成了一个具体的GreeterClient类型。GreeterClient类型包含SayHello方法,可以调用该方法来启动对服务器的GRPC调用。

public class Program { static async Task Main(string[]args){//包含gRPC服务器的端口作为应用程序参数var port=args。长度0?args[0]: ' 50051 ';var channel=新通道(' localhost: '端口,ChannelCredentials。不安全);var客户端=新的Greeter。问候客户端(通道);var回复=等待客户端。SayHelloAsync(新HelloRequest { Name=' greater client ' });控制台。WriteLine('Greeting: '回复。消息);等待频道。shuttdowasync();控制台。写线('按任意键退出.');控制台。ReadKey();}}默认情况下,服务器和客户端资产是分开生成的。那个。proto文件包含在Protobuf项目组中。为了确保在服务器项目中只生成服务器资产,GrpcServices属性设置为Server。

XML复制

Itemgroup protobuf include='.\ protos \ *。proto ' grp services=' server '/content include=' @(proto buf)' link base=' '//item group同样,设置为Client的属性仅在客户项目中生成。

启动

在启动时,我们发现它不同于常见的ASP.NET核心程序,如下图所示:将gRPC服务引入ConfigureServices服务,然后将路由添加到Configure中

这里我们需要介绍三个与gRPC相关的nuget包

用于Protobuf消息API的grpc . aspnetcore . server Google . proto buf。Grpc。工具这里需要解释的是

ASP.NET核心中间件和功能共享路由管道,因此应用程序可以配置为服务于其他请求处理程序。其他请求处理程序(如MVC控制器)可以与配置的GRPC服务路由并行工作。

其他需要说明的内容

与ASP.NET核心接口的集成

GRPC服务可以完全访问ASP。NETCore函数,如依赖注入(Di)和日志记录函数。例如,服务实现可以通过构造函数解析DI容器中的记录器服务:

公开课迎宾服务:迎宾员。greeterbase { public greeterservice(ilogegereterservicelogger){ } }默认情况下,GRPC服务可以解析具有任意生存期的其他DI服务(Singleton、Scoped或Transient)。

用GRPC方法解析HttpContext

GRPC应用编程接口提供对一些HTTP/2消息数据的访问,如方法、主机、头和尾。访问通过服务器调用上下文参数传递给每个GRPC方法:

公开课迎宾服务:迎宾员。GreeterBase { public override tashelloreply say hello(HelloRequest请求,ServerCallContext上下文){ return Task。FromResult(新的HelloReply { Message='Hello '请求。name });}}ServerCallContext不提供对所有ASP.NET接口中的HttpContext的完全访问。GetHttpContext扩展方法提供了对在ASP.NET应用编程接口中表示底层HTTP/2消息的HttpContext的完全访问:

公开课迎宾服务:迎宾员。greet erbase { public override tashelloreply say hello(HelloRequest请求,ServerCallContext context){ var httpContext=context。GetHttpContext();返回任务。FromResult(新HelloReply { Message='使用https: ' httpContext。request . IsHttps });}}请求正文数据速率限制

默认情况下,红隼服务器被设置为最小请求正文数据速率。对于客户端流和双工流请求,可能达不到此速率,连接可能会超时。当GRPC服务包括客户端流和双工流呼叫时,必须禁用最小请求体数据速率限制:

公共类程序{ public static void Main(string[]args){ CreateHostBuilder(args)。构建()。run();}公共静态IHostBuilder CreateHostBuilder(字符串[]参数)=Host。CreateDefaultBuilder(args)。ConfigureWebHostDefaults(WebBuilder={ WebBuilder。UseStartupStartup();webBuilder。ConfigureKestrel((上下文,选项)={ options。限制。MinRequestBodyDataRate=null});});}参考文章

使用C#的gRPC服务

图图:在ASP.NET芯开始使用gRPC

ASP.NET芯的gRPC服务

将gRPC服务从C核心迁移到ASP.NET核心

总结

,今天分享的内容很多,目的是让记录尽可能详细,并尽可能用通俗易懂的语言描述,让大家都能使用。在ASP.NET Core 3.0中,grpc服务作为一级公民被支持,所以我们有必要了解一下。很多朋友可能会有疑问。我的Web API很好,那为什么要用gRPC这种远程过程调用协议呢?关于这个问题,我准备单独开一篇文章来解释一下。最后,感谢大家阅读。码字不容易。请推荐支持。

版权声明:ASP.NET CORE推出的gRPC服务模板图解分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。