目录

  • .Net gRPC学习笔记
  • 什么是RPC
  • 和本地调用有什么区别
  • RPC模式
  • RPC的三个过程
  • 为什么要使用RPC
  • RPC和其他协议的区别
  • RPC使用场景
  • RPC的流程
  • RPC核心概念术语
  • 什么是gRPC
  • .NET官方的gRPC教程示例
  • 创建 gRPC 服务
  • 运行服务
  • 检查项目文件
  • 在 .NET 控制台应用中创建 gRPC 客户端
  • 添加所需的 NuGet 包
  • 用于安装包的 PMC 选项
  • 管理 NuGet 包选项以安装包
  • 添加 greet.proto
  • 创建 Greeter 客户端
  • 使用 gRPC Greeter 服务测试 gRPC 客户端
  • 自定义gRPC的常用流程
  • 自定义服务端gRPC
  • 自定义客户端gRPC

.Net gRPC学习笔记

gRPC官网:gRPC |简介gRPC

.NET官网:https://learn.microsoft.com/zh-cn/aspnet/core/grpc/?view=aspnetcore-6.0

.NET gRPC Learn:https://learn.microsoft.com/zh-cn/aspnet/core/grpc/aspnetcore?view=aspnetcore-6.0&tabs=visual-studio

RPC介绍:https://zhuanlan.zhihu.com/p/187560185

什么是RPC

RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。

过程是什么? 过程就是业务处理、计算任务,更直白的说,就是程序,就是想调用本地方法一样调用远程的过程

和本地调用有什么区别

asp.net公共方法怎么写 asp.net grpc_RPC

远程调用,就好像异地恋一样,隔着千山万水

asp.net公共方法怎么写 asp.net grpc_客户端_02

本地调用,就是女生就在你身边,近水楼台先得月 远程调用之间需要通过网络,所以响应要慢几个数量级,也不那么可靠

RPC模式

RPC采用客户端/服务端的模式,通过request-response消息模式实现

asp.net公共方法怎么写 asp.net grpc_RPC_03

RPC的三个过程

  • 1:通讯协议== 比如:你需要找人在国外干活,那么你可以直接飞过去或者打电话或者通过互联网的形式,去找人,这个找人的过程就是通讯协议
  • 2:寻址== 既然要找人干活,肯定要知道地址在哪,飞过去需要找到详细地址,打电话需要知道电话号码,互联网需要知道IP是多少
  • 3:数据序列化== 就是说,语言需要互通,才能够让别人干活,之间需要一个大家都懂的语言去交流

为什么要使用RPC

1:服务化/微服务 2:分布式系统架构 3:服务可重用 4:系统间交互调用

RPC和其他协议的区别

RMI远程方法调用是RPC的一种具体实现,webservice、restfull都是RPC,只是消息的组织形式、消息协议不同

RPC使用场景

和MQ做对比: MQ有一个中间节点queue,可以存储消息 RPC的特性: 同步调用,对于需要等待返回结果的场景,可以使用RPC 消息MQ的特性: 异步单向的消息,不需要等待消息处理完成 如果需要同步得到结果的场景,RPC比较适合,如果希望使用简单,RPC也适合,RPC操作基于接口,操作简单,使用的方式模拟本地方法的调用,异步的方式编程比较复杂

asp.net公共方法怎么写 asp.net grpc_客户端_04

RPC的流程

asp.net公共方法怎么写 asp.net grpc_客户端_05

1:客户端处理过程中调用client sub,就像调用本地方法一样,传入参数 2:client sub将参数编组为消息,然后通过系统调用向服务端发送消息 3:客户端本地的操作系统将消息从客户端发送到服务端 4:服务端将接收到的数据包传递给server sub 5:server sub将接收到的数据解组为参数 6:server sub再调用服务端的过程,过程执行的结果以反方向的相同步骤响应给客户端

sub(存根) :分布式计算中的存根是一段代码,它转换在远程过程调用(RPC)期间client和server之间传递的参数

需要处理的问题: 1:client sub、server sub的开发 2:参数的编组和解组 3:消息如何发送 4:过程结果如何表示、异常情况如何处理 5:如何实现安全的访问控制

RPC核心概念术语

1:client, 客户端 2:server,服务端 3:calls,请求 4:replier,响应 5:services,一个网络服务由一个或者多个远程程序集构成 6:programs,一个远程程序实现一个或多个远程过程 7:procedures,过程、过程的参数、结果在程序协议说明书中定义说明 8:version,为兼容程序协议变更,一个服务端可能支持多个版本的远程程序

什么是gRPC

gRPC 是谷歌开发的一种与语言无关的高性能远程过程调用 (RPC) 框架。

gRPC 的主要优点是:

  • 现代高性能轻量级 RPC 框架。
  • 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
  • 可用于多种语言的工具,以生成强类型服务器和客户端。
  • 支持客户端、服务器和双向流式处理调用。
  • 使用 Protobuf 二进制序列化减少对网络的使用。

这些优点使 gRPC 适用于:

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

.NET官方的gRPC教程示例

gRPC for ASP.NET Core 中的身份验证和授权 | Microsoft Learn

在 ASP.NET Core 中创建 .NET Core gRPC 客户端和服务器 | Microsoft Learn

创建 gRPC 服务

  • 启动 Visual Studio 2022 并选择“创建新项目”。
  • 在“创建新项目”对话框中,搜索 gRPC。 选择“ASP.NET Core gRPC 服务”,并选择“下一步” 。
  • 在“配置新项目”对话框中,为“项目名称”输入 GrpcGreeter。 将项目命名为“GrpcGreeter”非常重要,这样在复制和粘贴代码时命名空间就会匹配。
  • 选择“下一页”。
  • 在“其他信息”对话框中,选择“.NET 6.0 (长期支持)”,然后选择“创建”。

运行服务

  • 按 Ctrl+F5 以在不使用调试程序的情况下运行。
    如果尚未将项目配置为使用 SSL,Visual Studio 显示以下对话:

如果信任 IIS Express SSL 证书,请选择“是”。

将显示以下对话框:

asp.net公共方法怎么写 asp.net grpc_Visual_06

如果你同意信任开发证书,请选择“是”。

Visual Studio:

  • 启动 Kestrel 服务器。
  • 启动浏览器。
  • 导航到
http://localhost:port

,如

http://localhost:7042

  • 端口:随机分配给应用的端口号。
  • localhost:本地计算机的标准主机名。 Localhost 仅为来自本地计算机的 Web 请求提供服务。

日志显示在 https://localhost: 上侦听的服务,其中 `` 是在 Properties/launchSettings.json 中创建和设置项目时随机分配的 localhost 端口号。

控制台复制

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

备注

gRPC 模板配置为使用传输层安全性 (TLS)。 gRPC 客户端需要使用 HTTPS 调用服务器。 在 gRPC 服务项目的 Properties\launchSettings.json 文件中创建和设置项目时,将随机分配 gRPC 服务 localhost 端口号。

macOS 不支持 ASP.NET Core gRPC 及 TLS。 在 macOS 上成功运行 gRPC 服务需要其他配置。

检查项目文件

GrpcGreeter 项目文件:

  • Protos/greet.proto:定义 Greeter gRPC,并用于生成 gRPC 服务器资产。
  • Services 文件夹:包含 Greeter 服务的实现。
  • appSettings.json:包含配置数据,如 Kestrel 使用的协议。
Program.cs

,其中包含:

  • gRPC 服务的入口点。
  • 配置应用行为的代码。

在 .NET 控制台应用中创建 gRPC 客户端

  • 打开 Visual Studio 的第二个实例并选择“创建新项目”。
  • 在“创建新项目”对话框中,选择“控制台应用程序”,然后选择“下一步” 。
  • 在“项目名称”文本框中,输入“GrpcGreeterClient”,然后选择“下一步” 。
  • 在“其他信息”对话框中,选择“.NET 6.0 (长期支持)”,然后选择“创建”。

添加所需的 NuGet 包

gRPC 客户端项目需要以下 NuGet 包:

  • Grpc.Net.Client,其中包含 .NET Core 客户端。
  • Google.Protobuf 包含适用于 C# 的 Protobuf 消息。
  • Grpc.Tools,其中包含适用于 Protobuf 文件的 C# 工具支持。 运行时不需要工具包,因此依赖项标记为 PrivateAssets="All"

通过包管理器控制台 (PMC) 或管理 NuGet 包来安装包。

用于安装包的 PMC 选项
  • 从 Visual Studio 中,依次选择“工具”>“NuGet 包管理器”>“包管理器控制台”
  • 从“包管理器控制台”窗口中,运行 cd GrpcGreeterClient 以将目录更改为包含 GrpcGreeterClient.csproj 文件的文件夹。
  • 运行以下命令:
    PowerShell复制
Install-Package Grpc.Net.Client
Install-Package Google.Protobuf
Install-Package Grpc.Tools
管理 NuGet 包选项以安装包
  • 右键单击“解决方案资源管理器”>“管理 NuGet 包”中的项目 。
  • 选择“浏览”选项卡。
  • 在搜索框中输入 Grpc.Net.Client。
  • 从“浏览”选项卡中选择“Grpc.Net.Client”包,然后选择“安装” 。
  • Google.ProtobufGrpc.Tools 重复这些步骤。

添加 greet.proto

  • 在 gRPC 客户端项目中创建 Protos 文件夹。
  • 从 gRPC Greeter 服务将 Protos\greet.proto 文件复制到 gRPC 客户端项目中的 Protos 文件夹 。
  • greet.proto 文件中的命名空间更新为项目的命名空间:
    复制
option csharp_namespace = "GrpcGreeterClient";
  • 编辑 GrpcGreeterClient.csproj 项目文件:

右键单击项目,并选择“编辑项目文件”。

  • 添加具有引用 greet.proto 文件的 `` 元素的项组:
    XML复制
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>

创建 Greeter 客户端

  • 构建客户端项目,以在 GrpcGreeterClient 命名空间中创建类型。

备注

GrpcGreeterClient 类型是由生成进程自动生成的。 工具包 Grpc.Tools 基于 greet.proto 文件生成以下文件:

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs:用于填充、序列化和检索请求和响应消息类型的协议缓冲区代码。
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs:包含生成的客户端类。

有关 Grpc.Tools 自动生成的 C#

  • 使用以下代码更新 gRPC 客户端 Program.cs 文件。
    C#复制
using System.Threading.Tasks;
using Grpc.Net.Client;
using GrpcGreeterClient;

// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
  • 在前面突出显示的代码中,将 localhost 端口号 7042 替换为在 GrpcGreeter 服务项目的 Properties/launchSettings.json 中指定的 HTTPS 端口号。

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

通过以下方式创建 Greeter 客户端:

  • 实例化 GrpcChannel,使其包含用于创建到 gRPC 服务的连接的信息。
  • 使用 GrpcChannel 构造 Greeter 客户端:

C#复制

// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Greeter 客户端会调用异步 SayHello 方法。 随即显示 SayHello 调用的结果:

C#复制

// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

使用 gRPC Greeter 服务测试 gRPC 客户端

  • 在 Greeter 服务中,按 Ctrl+F5 在不使用调试程序的情况下启动服务器。
  • GrpcGreeterClient 项目中,按 Ctrl+F5 在不使用调试程序的情况下启动客户端。

客户端向该服务发送一条包含具有其名称“GreeterClient”的消息的问候信息。 该服务会发送“Hello GreeterClient”消息作为答复。 “Hello GreeterClient”答复将在命令提示符中显示:

控制台复制

Greeting: Hello GreeterClient
Press any key to exit...

gRPC 服务在写入命令提示符的日志中记录成功调用的详细信息:

控制台复制

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

通过添加以下行来更新 appsettings.Development.json 文件:

复制

"Microsoft.AspNetCore.Hosting": "Information",
"Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"

备注

本文中的代码需要 ASP.NET Core HTTPS 开发证书来保护 gRPC 服务。 如果 .NET gRPC 客户端失败并显示消息 The remote certificate is invalid according to the validation procedure.The SSL connection could not be established.,则开发证书不受信任。 要解决此问题,请参阅使用不受信任/无效的证书调用 gRPC 服务。

警告

若要将 ASP.NET Core gRPC 用于 Azure 应用服务或 IIS,则该 gRPC 具有额外的要求。

自定义gRPC的常用流程

自定义服务端gRPC

  1. 内置在Asp.Net Core项目
  2. Proto-->生成代码--->项目引用嵌入
  3. Service
  4. 注册Endpoint

自定义客户端gRPC

  1. 控制台项目---nuget
  1. Grpc.Net.Client
  2. GRPC.Tools
  3. Google.Protobuf
  1. 拷贝Proto--->项目引用嵌入-->生成代码
  2. Client实例

服务和生成
1.proto 后缀的文件--服务/客户 都需要使用---服务的契约--gRPC模板--规范,描述gRPC服务中有什么,调用需要什么参数 可以返回什么,在C#中和gRPC具体的服务之间的生成依赖于---程序集:
2.Google.Protobuf:一中序列化器(Xml/JSON)---上海人--上海话---序列化成普通话---武汉人--能听懂
3.Grpc.Net.Client--客户端调用的时候,需要的dll

一、ASP.NET Core调用GPRC
1.ASP.NET Core注册GRPCC Client调用服务,Nuget引入:Grpc.Net.ClientFactory
2.直接通过控制器支持构造函数注入Client
3.基于Client 做gRPC调用

二、gPRC支持AOP
1.client AOP + Server AOP Nuget:Grpc.Core.Api
2.通过Interceptor扩展,自定义类,然后继承Interceptor 父类
3.可以注册在服务端(支持服务端的AOP) 也可以注册在客户端(支持客户端的AOP)

三、既然gPRC是作为一个服务,就是由客户端来调用的,但是我们不然让别人随便调用---权限的认证 鉴权授权

  1. gRPC服务--ZhaoXi.gRPC.LessonServer.ZhaoxiLessonService
  2. 标记特性