图析ASP.NET Core引入gRPC服务模板

早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把。同时记录体验的过程。如果你也想按照本文的步骤体验的话,那你得先安装.NET Core3.0预览版的SDK。至于开发工具我用的时VS2019,当然你也可以使用VS Code进行。

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";

package Greet;

// The greeting service definition.
service Greeter {
 // Sends a greeting
 rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's 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中即可,如下所示:
<ItemGroup>
 <Protobuf Include="..\Protos\*.proto" GrpcServices="Server" />
 <Content Include="@(Protobuf)" LinkBase="" />
</ItemGroup>

C#对.proto文件的工具支持

工具包Grpc.Tools 被用来从.proto文件生成C#文件。生成的资产(文件)具有如下特性:

  • 每次构建项目时都会根据需要进行生成。
  • 生成的文件不会被添加到项目或签入源代码管理。
  • 生成的C#文件是包含在OBJ目录。

服务器和客户端项目都需要此包。Grpc.Tools可以通过在VisualStudio中使用包管理器或添加<PackageReference>到项目文件:

XML复制

<PackageReference Include="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中的代码

public class GreeterService : Greeter.GreeterBase
{
 public override Task<HelloReply>
 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 argument
 var 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复制

<ItemGroup>
 <Protobuf Include="..\Protos\*.proto" GrpcServices="Server" />
 <Content Include="@(Protobuf)" LinkBase="" />
</ItemGroup>

类似地,属性设置为Client在仅在客户项目中生成。

Startup

Startup中我们发现跟普通的ASP.NET Core程序有所不同,具体的如下图所示:在ConfigureServices 服务中引入了gRPC服务,然后在Configure加入了路由

而这里需要引入三个与gRPC相关的nuget包

这里需要说明的是

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

其他需要说明的内容

与ASP.NET Core 接口的集成

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

public class GreeterService : Greeter.GreeterBase
{
 public GreeterService(ILogger<GreeterService> logger)
 {
 }
}

默认情况下,GRPC服务可以解析具有任意生存期的其他DI服务(Singleton, Scoped, or Transient)。

在GRPC方法中解析HttpContext

GRPC 应用程序接口提供对某些HTTP/2消息数据的访问,例如method, host, header, and trailers。访问是通过ServerCallContext参数传递给每个GRPC方法:

public class GreeterService : Greeter.GreeterBase
{
 public override Task<HelloReply>
 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 Task<HelloReply> 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.UseStartup<Startup>();
 webBuilder.ConfigureKestrel((context, options) =>
 {
  options.Limits.MinRequestBodyDataRate = null;
 });
 });
}

参考文章

gRPC services with C#

Tutorial: Get started with gRPC in ASP.NET Core

gRPC services with ASP.NET Core

Migrating gRPC services from C-core to ASP.NET Core

总结

今天分享的内容有点多,目的就是使记录尽可能的详细,尽可能用通俗易懂的语言来进行描述,让大家能用起来。在asp.net core3.0中把grpc服务作为第一等公民进行支持,所以我们有必要进行下了解。可能很多朋友会有疑问了,我Web API用的爽歪歪,干嘛还要用gRPC这种远程过程调用协议啊。关于这个问题,我准备再单独开一篇文章进行讲解,最后感谢大家的阅读,码字不易,多多推荐支持吧!

(0)

相关推荐

  • FFRPC应用 Client/Server使用及原理解析

    摘要: Ffrpc 进行了重构,精简了代码,代码更加清晰简洁,几乎完美的达到了我的预想.接下来将写几遍文章来介绍ffrpc可以做什么.简单总结ffrpc的特性是: Ffrpc是c++ 网络通信库 全异步 + 回调函数 机制 支持普通二进制协议.protobuf.thrift 基于Broker模式设计 设计精巧,代码量小,核心ffrpc的代码只有1000行 接口的性能监控是集成式的,使用者自动获得了接口性能数据,方便优化接口 普通二进制协议示例 Ffrpc实现了一个最基本的二进制序列化方法,基本的

  • 在Python中使用gRPC的方法示例

    本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下: 使用Protocol Buffers的跨平台RPC系统. 安装 使用 pip pip install grpcio pip install grpcio-tools googleapis-common-protos gRPC由两个部分构成,grpcio 和 gRPC 工具, 后者是编译 protocol buffer 以及提供生成代码的插件. 使用 编写protocol buffer 使用 gRPC 首先需要做的是设计 p

  • SpringBoot2.0 整合 Dubbo框架实现RPC服务远程调用方法

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互. 2)图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点. 3)图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用. 4)图中只包含 RPC

  • python使用rpc框架gRPC的方法

    概述 gRPC 是谷歌开源的一个rpc(远程程序调用)框架,可以轻松实现跨语言,跨平台编程,其采用gRPC协议(基于HTTP2). rpc: remote procedure call, 翻译过来就是是远程程序调用.具体来说,就是客户端c1需要调用服务器s1上的某个方法(函数),得到相应的返回值并传递给c1. gRPC协议 要说gRPC协议需要先了解HTTP2, 虽然HTTP1.X 协议至今仍是主流协议,但是随着我们对性能要求越来越高,和web规模的不断扩大,HTTP2就应运而生. 在这里,我们

  • Nginx配置代理gRPC的方法

    Nginx 1.13.10新增了对gRPC的原生支持.本文介绍如何配置Nginx的gRPC. 安装Nginx Nginx版本要求:1.13.10. gRPC必须使用HTTP/2传输数据,支持明文和TLS加密数据,支持流数据的交互.这是为了充分利用 HTTP/2 连接的多路复用和流式特性.所以在安装部署nginx时需要安装http/2.使用源码安装,编译时需要加入http_ssl和http_v2模块: $ auto/configure --with-http_ssl_module --with-h

  • 对python调用RPC接口的实例详解

    要调用RPC接口,python提供了一个框架grpc,这是google开源的 rpc相关文档: https://grpc.io/docs/tutorials/basic/python.html 需要安装的python包如下: 1.grpc安装 pip install grpcio 2.grpc的python protobuf相关的编译工具 pip install grpcio-tools 3.protobuf相关python依赖库 pip install protobuf 4.一些常见原型的生成

  • SpringBoot集成gRPC微服务工程搭建实践的方法

    前言 本文将使用Maven.gRPC.Protocol buffers.Docker.Envoy等工具构建一个简单微服务工程,笔者所使用的示例工程是以前写的一个Java后端工程,因为最近都在 学习微服务相关的知识,所以利用起来慢慢的把这个工程做成微服务化应用.在实践过程踩过很多坑,主要是经验不足对微服务还是停留在萌新阶段,通过本文 记录创建微服务工程碰到一些问题,此次实践主要是解决以下问题: 如何解决.统一服务工程依赖管理 SpringBoot集成gRPC 管理Protocol buffers文

  • 图析ASP.NET Core引入gRPC服务模板

    早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安装.NET Core3.0预览版的SDK.至于开发工具我用的时VS2019,当然你也可以使用VS Code进行. gRPC的简单介绍 gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. 有关 gRPC 基础知识的详细信息,请参阅 gRPC 文档页. gRPC 的主要优点是: 现代高性

  • 使用grpcui测试ASP.NET core的gRPC服务

    grpcui类似Swagger UI,可以用来测试gRPC服务,使用起来特别简单. 其原理是通过自动发现gRPC服务协议(当然前提是gRPC服务暴露了Protobuf协议),然后启动一个带界面的Web程序,用户就可以在网页中选择要调用的接口.填写参数,然后通过grpcui发起gRPC请求,最终把执行结果展示出来. 废话先不说了,直接上图,看效果: 下边来看使用方法: 这里以ASP.NET Core gRPC服务为例,对于其它语言开发的gRPC服务也完全没有问题,gRPC协议都是一样的,只不过顺手

  • ASP.NET Core中Grpc通信的简单用法

    目录: 一.简单介绍DotnetCore3.0如何将.proto文件生成对应的服务端和客户端类 二.介绍如何在服务端使用Grpc,以及Grpc需要的条件(HTTP2.TLS) 三.介绍如何创建GrpcClient,以及Grpc通讯的四种模式 四.举例如何使用Grpc 一.如何使用protobuf生成服务类 Grpc中使用协议缓冲区 (protobuf) 用作接口设计语言 (IDL),它的主要内容包含: GRPC 服务的定义. 客户端和服务器之间发送的消息. Grpc.Tools 这个工具,在每次

  • asp.net Core中同名服务注册的实现代码

    目录 1.使用.net Core自带容器 2.AutoFac中的实现 通常情况下,在使用注入时一个服务接口对应一个实现类,注入方式采用构造函数注入即可,但如果存在多个类实现同一个接口的情况下,则需要根据实际情况来选择不同的实现类. 如以下代码中的MyEmailService和EmailService都实现了IEmailService接口: public class MyEmailService : IEmailService { public string Send(string Email)

  • ASP.NET Core 3.0使用gRPC的具体方法

    一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协议,使用 Protocol Buffers 作为序列化协议. 它的主要优点: 现代高性能轻量级 RPC 框架. 约定优先的 API 开发,默认使用 Protocol Buffers 作为描述语言,允许与语言无关的实现. 可用于多种语言的工具,以生成强类型的服务器和客户端. 支持客户端,服务器双向流调

  • ASP.NET Core中引用OpenAPI服务添加示例

    目录 文章目录 前言:一.将 Swagger 引入 WebAPI 项目二.添加 OpenAPI 服务引用参考文档 前言: 本文使用 .NET Core SDK 3.1 的版本.在我们使用微服务的时候,各个微服务之间会经常调用接口,但是手动写Http请求的代码非常繁琐,在 Visual Studio 2019 的 .NET Core 项目中提供了添加连接的服务的功能,使得我们的工作变得简单容易. 一.将 Swagger 引入 WebAPI 项目 将 Swagger 引入 ASP.NET Core

  • 使用VS2022在ASP.NET Core中构建轻量级服务

    目录 1. 使用 VS2022 创建 ASP.NET Core 项目 2. 在 ASP.NET Core 中启用一个轻量级的服务 3. 在 ASP.NET Core 中使用 IEndpointConventionBuilder 扩展方法 4. 在 ASP.NET Core 中使用轻量级服务检索记录 5. 在 ASP.NET Core 中使用轻量级服务创建记录 6. 在 ASP.NET Core 中使用轻量级服务删除记录 7. ASP.NET Core 中轻量级服务的配置方法 8. 在 ASP.N

  • ASP.NET Core基础之Startup类

    ASP.NET Core必须包含Startup类.它就像 Global.asax 文件,我们传统的 .NET 应用程序.如名称建议的那样,在应用程序启动时首先执行它.在程序类的Main方法中配置主机时,可以使用UseStartup()扩展方法配置启动类.请查看下面的程序类,并重点介绍 WebBuilder.UseStartup() 方法. 名称"Startup"是按照ASP.NET Core约定进行的. 但是,您可以给Startup类指定任何名称,只需在UseStartup ()方法中

  • ASP.NET Core依赖注入详解

    目录 一.什么是依赖注入 二.使用框架提供的服务 三.注册服务 四.生命周期 五.请求服务 六.设计你的依赖服务 ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默认服务容器提供了最小功能集,并不是要取代其它容器. 一.什么是依赖注入 依赖注入(Dependency injection,DI)是一种实现对象及其合作者或依赖项之间松散耦合的技术.将类

  • 详解ASP.NET Core应用中如何记录和查看日志

    日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.LoggerFactory和LoggerProvider这三个核心对象组成.我们可以通过简单的配置实现对LoggerFactory的定制,以及对LoggerProvider添加. 一. 配置LoggerFactory 我们在上面一节演示了一个展示ASP.NET Core默认注册服务的实例,细心的读者一定会看到显

随机推荐