建设银行武威分行网站,汽车用品网站源码,wordpress主题 已存在,网站建设维护员是做什么的早就听说ASP.NET Core 3.0中引入了gRPC的服务模板#xff0c;正好趁着家里电脑刚做了新系统#xff0c;然后装了VS2019的功夫来体验一把。同时记录体验的过程。如果你也想按照本文的步骤体验的话#xff0c;那你得先安装.NET Core3.0预览版的SDK。至于开发工具我用的时VS201… 早就听说ASP.NET Core 3.0中引入了gRPC的服务模板正好趁着家里电脑刚做了新系统然后装了VS2019的功夫来体验一把。同时记录体验的过程。如果你也想按照本文的步骤体验的话那你得先安装.NET Core3.0预览版的SDK。至于开发工具我用的时VS2019,当然你也可以使用VS Code进行。作者依乐祝原文地址https://www.cnblogs.com/yilezhu/p/10631420.htmlgRPC的简单介绍gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。 有关 gRPC 基础知识的详细信息请参阅 gRPC 文档页。gRPC 的主要优点是现代高性能轻量级 RPC 框架。协定优先 API 开发默认使用协议缓冲区允许与语言无关的实现。可用于多种语言的工具以生成强类型服务器和客户端。支持客户端、服务器和双向流式处理调用。使用 Protobuf 二进制序列化减少对网络的使用。这些优点使 gRPC 适用于效率至关重要的轻量级微服务。需要多种语言用于开发的 Polyglot 系统。需要处理流式处理请求或响应的点对点实时服务。ASP.NET Core 3.0上gRPC服务模板初体验创建gRPC服务打开VS2019 从 Visual Studio“文件”菜单中选择“新建” “项目”。(由于我是新打开的VS所以按照如下图所示创建新项目)如下图所示选择创建《ASP.NET Core Web 应用程序》然后点击下一步在此页面按照下图所示输入项目名称位置解决方案名称然后点击右下角的“创建”按钮进行创建。你以为上述步骤中点击“创建”就结束了嘛说好的要创建gRPC服务模板的所以点击上面的创建后会弹出如下图所示让你选择服务模板的窗口这里按照下图所示选择gRPC服务模板然后再次点击右下角的创建才是真正的创建项目。创建成功后会出现如下图所示的项目结构至此我们就创建好了一个gRPC服务的模板接下来我们先测试一番然后再好好的看下这个模板的结构吧测试gRPC服务首先打开HelloGrpc.Server 这个服务端的工作目录然后Shift鼠标右键弹出如下图所示的右键菜单如图所示打开ps窗口输入dotnet run 命令运行此gRPC服务端项目如下图所示说明服务端启动正常并开始监听对应的端口。同样的方法我们启动客户端这时候客户端会向该服务端发送一条包含具有其名称“GreeterClient”的消息的问候信息。 该服务端将发送一条消息“Hello GreeterClient”作为响应并显示在命令提示符中。如下图所示至此gRPC服务模板创建的服务端以及客户端测试成功。下面我们就好好的探究一下这个服务模板吧。gRPC模板解析在HelloGrpc.Server 服务的端项目中有如下几个文件greet.protogreet.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文件protoGRPC使用约定优先的API开发方法。默认情况下使用协议缓冲区(Protobuf)作为接口设计语言(IDL)。这个.proto文件包含GRPC服务的定义。在客户端和服务器之间发送的消息。有关Protobuf文件语法的更多信息请参见正式文件(原型).如我们模板中创建的greet.proto 文件内容如下syntax proto3;package Greet;// The greeting service definition.service Greeter {// Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {}}// The request message containing the users name.message HelloRequest {string name 1;}// The response message containing the greetings.message HelloReply {string message 1;}定义Greeter服务。这个Greeter服务定义SayHello请求。SayHello发送HelloRequest消息并接收HelloResponse信息那么你可能要问了这个.proto文件是如何包含在项目中的呢其实如果你打开.csproject文件就会看到通过将该文件添加到Protobuf的ItemGroup中即可如下所示ItemGroupProtobuf Include..\Protos\*.proto GrpcServicesServer /Content Include(Protobuf) LinkBase //ItemGroupC#对.proto文件的工具支持工具包Grpc.Tools 被用来从.proto文件生成C#文件。生成的资产(文件)具有如下特性每次构建项目时都会根据需要进行生成。生成的文件不会被添加到项目或签入源代码管理。生成的C#文件是包含在OBJ目录。服务器和客户端项目都需要此包。Grpc.Tools可以通过在VisualStudio中使用包管理器或添加PackageReference到项目文件XML复制PackageReference IncludeGrpc.Tools Version1.19.0-pre1 PrivateAssetsAll /工具包在运行时并不是必需的因此应该用PrivateAssetsAll.Services 文件夹中的具体的gRPC服务我们知道Grpc.Tools工具包将根据.proto文件的定义翻译并生成对应的C#类型的文件。对于服务器端资产将生成一个抽象的服务基类型。基类型包含在.proto文件中包含的所有GRPC调用的定义。然后您将创建从此基类型派生的具体服务实现并实现GRPC调用的逻辑。对于前面描述的greet.proto示例将生成包含虚拟SayHello方法的抽象GreeterBase类型。具体的实现GreeterService重写该方法并实现处理GRPC调用的逻辑。正如HelloGrpc.Server项目中的Services\GreeterService.cs中的代码public class GreeterService : Greeter.GreeterBase{public override TaskHelloReply SayHello(HelloRequest request, ServerCallContext context){return Task.FromResult(new HelloReply { Message Hello request.Name }); }}对于客户端将生成一个具体的客户端类型中的GRPC调用。.proto文件被转换为可以调用的具体类型上的方法。为greet.proto前面描述的示例一个具体的GreeterClient类型生成。这个GreeterClient类型包含SayHello方法可以调用该方法来启动对服务器的GRPC调用。public class Program{static async Task Main(string[] args){// Include port of the gRPC server as an application argumentvar port args.Length 0 ? args[0] : 50051;var channel new Channel(localhost: port, ChannelCredentials.Insecure);var client new Greeter.GreeterClient(channel);var reply await client.SayHelloAsync(new HelloRequest { Name GreeterClient }); Console.WriteLine(Greeting: reply.Message);await channel.ShutdownAsync(); Console.WriteLine(Press any key to exit...); Console.ReadKey(); }}默认情况下分别生成服务器和客户端资产。.proto文件包含在Protobuf项目组。若要确保仅在服务器项目中生成服务器资产GrpcServices属性设置为Server.XML复制ItemGroupProtobuf Include..\Protos\*.proto GrpcServicesServer /Content Include(Protobuf) LinkBase //ItemGroup类似地属性设置为Client在仅在客户项目中生成。Startup在Startup中我们发现跟普通的ASP.NET Core程序有所不同具体的如下图所示在ConfigureServices 服务中引入了gRPC服务然后在Configure加入了路由而这里需要引入三个与gRPC相关的nuget包Grpc.AspNetCore.ServerGoogle.Protobuf对于Protobuf消息API。Grpc.Tools这里需要说明的是ASP.NET Core 中间件和功能共享路由管道因此可以将应用程序配置为服务其他请求处理程序。其他请求处理程序如MVC控制器可以与配置的GRPC服务路由并行工作。其他需要说明的内容与ASP.NET Core 接口的集成GRPC服务可以完全访问ASP.NETCore功能如依赖注入(Di)和日志功能。例如服务实现可以通过构造函数解析DI容器中的记录器服务public class GreeterService : Greeter.GreeterBase{public GreeterService(ILoggerGreeterService logger){ }}默认情况下GRPC服务可以解析具有任意生存期的其他DI服务(Singleton, Scoped, or Transient)。在GRPC方法中解析HttpContextGRPC 应用程序接口提供对某些HTTP/2消息数据的访问例如method, host, header, and trailers。访问是通过ServerCallContext参数传递给每个GRPC方法public class GreeterService : Greeter.GreeterBase{public override TaskHelloReply SayHello(HelloRequest request, ServerCallContext context) {return Task.FromResult(new HelloReply { Message Hello request.Name }); }}ServerCallContext不提供对所有ASP.NET 接口中HttpContext的完全访问。GetHttpContext扩展方法提供对表示ASP.NET API中底层HTTP/2消息的httpContext的完全访问public class GreeterService : Greeter.GreeterBase{public override TaskHelloReply SayHello(HelloRequest request, ServerCallContext context){var httpContext context.GetHttpContext();return Task.FromResult(new HelloReply { Message Using https: httpContext.Request.IsHttps }); }}请求体数据速率限制默认情况下Kestrel服务器设置为最小请求主体数据速率。对于客户端流式和双工流式的请求此速率可能不满足并且连接可能超时。当GRPC服务包括客户端流和双工流调用时必须禁用最小请求正文数据速率限制public class Program{public static void Main(string[] args){ CreateHostBuilder(args).Build().Run(); }public static IHostBuilder CreateHostBuilder(string[] args) Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder { webBuilder.UseStartupStartup(); webBuilder.ConfigureKestrel((context, options) { options.Limits.MinRequestBodyDataRate null; }); });}参考文章gRPC services with C#Tutorial: Get started with gRPC in ASP.NET CoregRPC services with ASP.NET CoreMigrating gRPC services from C-core to ASP.NET Core总结今天分享的内容有点多目的就是使记录尽可能的详细尽可能用通俗易懂的语言来进行描述让大家能用起来。在asp.net core3.0中把grpc服务作为第一等公民进行支持所以我们有必要进行下了解。可能很多朋友会有疑问了我Web API用的爽歪歪干嘛还要用gRPC这种远程过程调用协议啊。关于这个问题我准备再单独开一篇文章进行讲解最后感谢大家的阅读码字不易多多推荐支持吧