怎么在ASP.NET Core中引入gRPC服务模板
怎么在ASP.NET Core中引入gRPC服务模板?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
ASP.NET 是什么
ASP.NET 是开源,跨平台,高性能,轻量级的 Web 应用构建框架,常用于通过 HTML、CSS、JavaScript 以及服务器脚本来构建网页和网站。
gRPC的简单介绍
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。 有关 gRPC 基础知识的详细信息,请参阅 gRPC 文档页。
gRPC 的主要优点是:
现代高性能轻量级 RPC 框架。
协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
可用于多种语言的工具,以生成强类型服务器和客户端。
支持客户端、服务器和双向流式处理调用。
使用 Protobuf 二进制序列化减少对网络的使用。
这些优点使 gRPC 适用于:
效率至关重要的轻量级微服务。
需要多种语言用于开发的 Polyglot 系统。
需要处理流式处理请求或响应的点对点实时服务。
ASP.NET Core 3.0上gRPC服务模板初体验
创建gRPC服务
1 .打开VS2019 从 Visual Studio“文件”菜单中选择“新建” > “项目”。(由于我是新打开的VS,所以按照如下图所示创建新项目)
2.如下图所示,选择创建《ASP.NET Core Web 应用程序》,然后点击下一
3.在此页面按照下图所示,输入项目名称,位置,解决方案名称,然后点击右下角的“创建”按钮进行创建。
4.你以为上述步骤中点击“创建”就结束了嘛?说好的要创建gRPC服务模板的,所以,点击上面的创建后会弹出如下图所示,让你选择服务模板的窗口,这里按照下图所示选择gRPC服务模板,然后再次点击右下角的创建,才是真正的创建项目。
5.创建成功后,会出现如下图所示的项目结构
6.至此,我们就创建好了一个gRPC服务的模板,接下来我们先测试一番,然后再好好的看下这个模板的结构吧
测试gRPC服务
1.首先打开HelloGrpc.Server
这个服务端的工作目录,然后Shift+鼠标右键
弹出如下图所示的右键菜单,如图所示打开ps窗口
2.输入dotnet run
命令运行此gRPC服务端项目,如下图所示,说明服务端启动正常,并开始监听对应的端口。
3.同样的方法,我们启动客户端,这时候客户端会向该服务端发送一条包含具有其名称“GreeterClient”的消息的问候信息。 该服务端将发送一条消息“Hello GreeterClient”作为响应,并显示在命令提示符中。如下图所示:
4.至此,gRPC服务模板创建的服务端以及客户端测试成功。下面我们就好好的探究一下这个服务模板吧。
gRPC模板解析
在HelloGrpc.Server
服务的端项目中有如下几个文件
greet.proto:greet.proto 文件定义
Greeter
gRPC,且用于生成 gRPC 服务器资产。Services 文件夹:包含
Greeter
服务的实现。appSettings.json:包含配置数据,如 Kestrel 使用的协议。(熟悉ASP.NET Core的你一定很熟悉)
Program.cs:包含 gRPC 服务的入口点。(熟悉ASP.NET Core的你一定很熟悉)
Startup.cs:
IWebHostBuilder
的启动配置文件,包含配置应用行为的代码。(熟悉ASP.NET Core的你一定很熟悉)
gRPC 客户端 HelloGrpc.Client
文件:
Program.cs 包含 gRPC 客户端的入口点和逻辑。
下面我们再打开每个文件看看里面究竟是什么东东吧。
proto文件
proto
GRPC使用约定优先的API开发方法。默认情况下,使用协议缓冲区(Protobuf)作为接口设计语言(IDL)。这个.proto
文件包含:
GRPC服务的定义。
在客户端和服务器之间发送的消息。
有关Protobuf文件语法的更多信息,请参见正式文件(原型).
如我们模板中创建的greet.proto
文件内容如下:
syntax="proto3"; packageGreet; //Thegreetingservicedefinition. serviceGreeter{ //Sendsagreeting rpcSayHello(HelloRequest)returns(HelloReply){} } //Therequestmessagecontainingtheuser'sname. messageHelloRequest{ stringname=1; } //Theresponsemessagecontainingthegreetings. messageHelloReply{ stringmessage=1; }
定义
Greeter
服务。这个
Greeter
服务定义SayHello
请求。SayHello
发送HelloRequest
消息并接收HelloResponse
信息:那么你可能要问了,这个.proto文件是如何包含在项目中的呢,其实,如果你打开.csproject文件就会看到,通过将该文件添加到
<Protobuf>
的ItemGroup中即可,如下所示:
<ItemGroup> <ProtobufInclude="..\Protos\*.proto"GrpcServices="Server"/> <ContentInclude="@(Protobuf)"LinkBase=""/> </ItemGroup>
C#对.proto文件的工具支持
工具包Grpc.Tools 被用来从.proto文件生成C#文件。生成的资产(文件)具有如下特性:
每次构建项目时都会根据需要进行生成。
生成的文件不会被添加到项目或签入源代码管理。
生成的C#文件是包含在OBJ目录。
服务器和客户端项目都需要此包。Grpc.Tools
可以通过在VisualStudio中使用包管理器或添加<PackageReference>
到项目文件:
XML复制
<PackageReferenceInclude="Grpc.Tools"Version="1.19.0-pre1"PrivateAssets="All"/>
工具包在运行时并不是必需的,因此,应该用PrivateAssets="All"
.
Services 文件夹中的具体的gRPC服务
我们知道Grpc.Tools
工具包将根据.proto文件的定义翻译并生成对应的C#类型的文件。
对于服务器端资产,将生成一个抽象的服务基类型。基类型包含在.proto文件中包含的所有GRPC调用的定义。然后,您将创建从此基类型派生的具体服务实现,并实现GRPC调用的逻辑。对于前面描述的greet.proto
示例,将生成包含虚拟SayHello
方法的抽象GreeterBase
类型。具体的实现GreeterService
重写该方法并实现处理GRPC调用的逻辑。正如HelloGrpc.Server
项目中的Services\GreeterService.cs
中的代码
publicclassGreeterService:Greeter.GreeterBase { publicoverrideTask<HelloReply> SayHello(HelloRequestrequest,ServerCallContextcontext) { returnTask.FromResult(newHelloReply { Message="Hello"+request.Name }); } }
对于客户端,将生成一个具体的客户端类型中的GRPC调用。.proto文件被转换为可以调用的具体类型上的方法。为greet.proto
前面描述的示例,一个具体的GreeterClient
类型生成。这个GreeterClient
类型包含SayHello
方法,可以调用该方法来启动对服务器的GRPC调用。
publicclassProgram { staticasyncTaskMain(string[]args) { //IncludeportofthegRPCserverasanapplicationargument varport=args.Length>0?args[0]:"50051"; varchannel=newChannel("localhost:"+port,ChannelCredentials.Insecure); varclient=newGreeter.GreeterClient(channel); varreply=awaitclient.SayHelloAsync( newHelloRequest{Name="GreeterClient"}); Console.WriteLine("Greeting:"+reply.Message); awaitchannel.ShutdownAsync(); Console.WriteLine("Pressanykeytoexit..."); Console.ReadKey(); } }
默认情况下,分别生成服务器和客户端资产。.proto文件包含在<Protobuf>
项目组。若要确保仅在服务器项目中生成服务器资产,GrpcServices
属性设置为Server
.
XML复制
<ItemGroup> <ProtobufInclude="..\Protos\*.proto"GrpcServices="Server"/> <ContentInclude="@(Protobuf)"LinkBase=""/> </ItemGroup>
类似地,属性设置为Client
在仅在客户项目中生成。
Startup
在Startup
中我们发现跟普通的ASP.NET Core程序有所不同,具体的如下图所示:在ConfigureServices
服务中引入了gRPC服务,然后在Configure
加入了路由
而这里需要引入三个与gRPC相关的nuget包
Grpc.AspNetCore.Server
Google.Protobuf对于Protobuf消息API。
Grpc.Tools
这里需要说明的是
ASP.NET Core 中间件和功能共享路由管道,因此可以将应用程序配置为服务其他请求处理程序。其他请求处理程序(如MVC控制器)可以与配置的GRPC服务路由并行工作。
其他需要说明的内容
与ASP.NET Core 接口的集成
GRPC服务可以完全访问ASP.NETCore功能,如依赖注入(Di)和日志功能。例如,服务实现可以通过构造函数解析DI容器中的记录器服务:
publicclassGreeterService:Greeter.GreeterBase { publicGreeterService(ILogger<GreeterService>logger) { } }
默认情况下,GRPC服务可以解析具有任意生存期的其他DI服务(Singleton, Scoped, or Transient)。
在GRPC方法中解析HttpContext
GRPC 应用程序接口提供对某些HTTP/2消息数据的访问,例如method, host, header, and trailers。访问是通过ServerCallContext
参数传递给每个GRPC方法:
publicclassGreeterService:Greeter.GreeterBase { publicoverrideTask<HelloReply> SayHello(HelloRequestrequest,ServerCallContextcontext) { returnTask.FromResult(newHelloReply { Message="Hello"+request.Name }); } }
ServerCallContext
不提供对所有ASP.NET 接口中HttpContext
的完全访问。GetHttpContext
扩展方法提供对表示ASP.NET API中底层HTTP/2消息的httpContext的完全访问:
publicclassGreeterService:Greeter.GreeterBase { publicoverrideTask<HelloReply>SayHello(HelloRequestrequest, ServerCallContextcontext) { varhttpContext=context.GetHttpContext(); returnTask.FromResult(newHelloReply { Message="Usinghttps:"+httpContext.Request.IsHttps }); } }
请求体数据速率限制
默认情况下,Kestrel服务器设置为最小请求主体数据速率。对于客户端流式和双工流式的请求,此速率可能不满足,并且连接可能超时。当GRPC服务包括客户端流和双工流调用时,必须禁用最小请求正文数据速率限制:
publicclassProgram { publicstaticvoidMain(string[]args) { CreateHostBuilder(args).Build().Run(); } publicstaticIHostBuilderCreateHostBuilder(string[]args)=> Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder=> { webBuilder.UseStartup<Startup>(); webBuilder.ConfigureKestrel((context,options)=> { options.Limits.MinRequestBodyDataRate=null; }); }); }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。
推荐阅读
-
ASP.NET怎么实现登出系统并清除Cookie
-
CentOS下怎么实现Mono和Asp.net
CentOS下怎么实现Mono和Asp.net这篇文章主要介绍“C...
-
ASP.NET的Core AD域登录过程怎么实现
ASP.NET的Core AD域登录过程怎么实现本文小编为大家详细...
-
ASP.NET MVC中两个配置文件的作用是什么
-
ASP.NET MVC过滤器执行顺序是什么
-
ASP.NET Core Zero模块系统的示例分析
ASP.NET Core Zero模块系统的示例分析这篇文章主要为...
-
asp.net多级分类统计列表怎么实现
asp.net多级分类统计列表怎么实现本篇内容介绍了“asp.ne...
-
C#怎么用ASP.NET Core开发学生管理系统
-
ASP.net中aspx与cs函数怎么实现互调
ASP.net中aspx与cs函数怎么实现互调,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇...
-
ASP.NET中怎么优化站点构建托管资源
这篇文章将为大家详细讲解有关ASP.NET中怎么优化站点构建托管资源,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完...