gRPC如何在ASP.NETCore3.0项目中使用-创新互联

这篇文章给大家介绍gRPC如何在ASP.NET Core 3.0项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

站在用户的角度思考问题,与客户深入沟通,找到章贡网站设计与章贡网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、成都网站制作、企业官网、英文网站、手机端网站、网站推广、空间域名、网络空间、企业邮箱。业务覆盖章贡地区。

一.简介

gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架。 gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建。它使用HTTP/2作为通信协议,使用 Protocol Buffers 作为序列化协议。

它的主要优点:

  • 现代高性能轻量级 RPC 框架。

  • 约定优先的 API 开发,默认使用 Protocol Buffers 作为描述语言,允许与语言无关的实现。

  • 可用于多种语言的工具,以生成强类型的服务器和客户端。

  • 支持客户端,服务器双向流调用。

  • 通过Protocol Buffers二进制序列化减少网络使用。

  • 使用 HTTP/2 进行传输

这些优点使gRPC非常适合:

  • 高性能轻量级微服务 - gRPC设计为低延迟和高吞吐量通信,非常适合需要高性能的轻量级微服务。

  • 多语言混合开发 - gRPC工具支持所有流行的开发语言,使gRPC成为多语言开发环境的理想选择。

  • 点对点实时通信 - gRPC对双向流调用提供出色的支持。gRPC服务可以实时推送消息而无需轮询。

  • 网络受限环境 - 使用 Protocol Buffers二进制序列化消息,该序列化始终小于等效的JSON消息,对网络带宽需求比JSON小

不建议使用gRPC的场景:

  • 浏览器可访问的API - 浏览器不完全支持gRPC。虽然gRPC-Web可以提供浏览器支持,但是它有局限性,引入了服务器代理

  • 广播实时通信 - gRPC支持通过流进行实时通信,但不存在向已注册连接广播消息的概念

  • 进程间通信 - 进程必须承载HTTP/2才能接受传入的gRPC调用,对于Windows,进程间通信管道是一种更快速的方法。

摘自微软官方文档

支持的语言如下:

gRPC如何在ASP.NET Core 3.0项目中使用

二.gRPC on .NET Core

gRPC 现在可以非常简单的在 .NET Core 和 ASP.NET Core 中使用,在 .NET Core 上的实现的开源地址:https://github.com/grpc/grpc-dotnet ,它目前由微软官方 ASP.NET 项目的人员进行维护,良好的接入 .NET Core 生态。

.NET Core 的 gRPC 功能如下:

  • Grpc.AspNetCore 一个用于在ASP.NET Core承载gRPC服务的框架,将 gRPC和ASP.NET Core 功能集成在一起,如:日志、依赖注入、身份认证和授权。

  • Grpc.Net.Client 基于HttpClient (HttpClient现已支持HTTP/2)的 gRPC客户端

  • Grpc.Net.ClientFactory 与gRPC客户端集成的HttpClientFactory,允许对gRPC客户端进行集中配置,并使用DI注入到应用程序中

三.使用 ASP.NET Core 创建 gRPC 服务

通过 Visual Studio 2019 (16.3.0)提供的模板,可以快速创建 gRPC 服务。

gRPC如何在ASP.NET Core 3.0项目中使用

来扒拉一下默认源码包含了什么东东。

① 配置文件appsettings.json ,多了Kestrel 启用 HTTP/2 的配置,因为 gRPC 是基于 HTTP/2 来通信的

gRPC如何在ASP.NET Core 3.0项目中使用

② PB协议文件greet.proto 用于自动生成服务、客户端和消息(表示传递的数据)的C# Class

gRPC如何在ASP.NET Core 3.0项目中使用

③ 服务类GreeterService ,服务类集成的Greeter.GreeterBase 来自于根据proto文件自动生成的,生成的类在obj\Debug\netcoreapp3.0目录下

gRPC如何在ASP.NET Core 3.0项目中使用

自动生成的类:

gRPC如何在ASP.NET Core 3.0项目中使用

Startup.cs类,将 gRPC服务添加到了终结点路由中

gRPC如何在ASP.NET Core 3.0项目中使用

⑤ csproj 项目文件,包含了 proto 文件引用

gRPC如何在ASP.NET Core 3.0项目中使用

2.运行

第一次运行会提示是否信任证书,点击“是”

gRPC如何在ASP.NET Core 3.0项目中使用

gRPC如何在ASP.NET Core 3.0项目中使用

这是因为HTTP/2需要HTTPS,尽管HTTP/2协议没有明确规定需要HTTPS,但是为了安全在浏览器实现上都要求了HTTPS,所以现在的HTTP/2和HTTPS基本都是一对。

gRPC如何在ASP.NET Core 3.0项目中使用

四. 创建 gRPC 客户端

1.添加一个.NET Core 控制台应用程序

2.通过nuget添加包:Grpc.Net.Client、Google.Protobuf、Grpc.Tools

gRPC如何在ASP.NET Core 3.0项目中使用

3.将服务的 proto 文件复制到客户端

gRPC如何在ASP.NET Core 3.0项目中使用

4.编辑客户端项目文件,添加关于proto文件的描述


 

注意GrpcServices="Client" 这里是Client和服务是不一样的

5.生成客户端项目可以通过proto文件生成类

6.添加客户端调用代码

static async Task Main(string[] args)
{
 var channel = GrpcChannel.ForAddress("https://localhost:5001");
 var client = new Greeter.GreeterClient(channel);
 var reply = await client.SayHelloAsync(
  new HelloRequest { Name = "晓晨" });
 Console.WriteLine("Greeter 服务返回数据: " + reply.Message);
 Console.ReadKey();
}

7.先启动服务,然后运行客户端

gRPC如何在ASP.NET Core 3.0项目中使用

这里可以看到,客户端成功调用了服务,收到了返回的消息。

五.自己动手写一个服务

前面我们使用的 Greeter 服务是由模板自动给我们创建的,现在我们来自己动手写一个服务。

1.定义 proto 文件LuCat.proto,并在csproj项目文件中添加描述

syntax = "proto3";

option csharp_namespace = "AspNetCoregRpcService";

import "google/protobuf/empty.proto";
package LuCat; //定义包名

//定义服务
service LuCat{
 //定义吸猫方法
 rpc SuckingCat(google.protobuf.Empty) returns(SuckingCatResult);
}

message SuckingCatResult{
 string message=1;
}

2.实现服务LuCatService.cs

public class LuCatService:LuCat.LuCatBase
{
 private static readonly List Cats=new List(){"英短银渐层","英短金渐层","美短","蓝猫","狸花猫","橘猫"};
 private static readonly Random Rand=new Random(DateTime.Now.Millisecond);
 public override Task SuckingCat(Empty request, ServerCallContext context)
 {
  return Task.FromResult(new SuckingCatResult()
  {
   Message = $"您吸了一只{Cats[Rand.Next(0, Cats.Count)]}"
  });
 }
}

3.在Startup终结点路由中注册

endpoints.MapGrpcService();

4.添加客户端调用

var catClient = new LuCat.LuCatClient(channel);
var catReply = await catClient.SuckingCatAsync(new Empty());
Console.WriteLine("调用撸猫服务:"+ catReply.Message);

5.运行测试

gRPC如何在ASP.NET Core 3.0项目中使用

六.实际使用中的技巧

技巧1

上面章节的操作步骤中,我们需要在服务和客户端之间复制proto,这是一个可以省略掉的步骤。

1.复制 Protos 文件夹到解决方案根目录(sln文件所在目录)

gRPC如何在ASP.NET Core 3.0项目中使用

2.删除客户端和服务项目中的 Protos 文件夹

3.在客户端项目文件csproj中添加关于proto文件的描述

 
 
 

4.在服务项目文件csproj中添加关于proto文件的描述

 
 
 

在实际项目中,请自己计算相对路径

5.这样两个项目都是使用的一个proto文件,只用维护这一个文件即可

gRPC如何在ASP.NET Core 3.0项目中使用

技巧2

我们在实际项目中使用,肯定有多个 proto 文件,难道我们每添加一个 proto 文件都要去更新 csproj文件?

我们可以使用MSBuild变量来帮我们完成,我们将 csproj 项目文件中引入proto文件信息进行修改。

服务端:

 
 
 

客户端:

 
 
 

示例:

gRPC如何在ASP.NET Core 3.0项目中使用

关于gRPC如何在ASP.NET Core 3.0项目中使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


本文名称:gRPC如何在ASP.NETCore3.0项目中使用-创新互联
分享地址:http://myzitong.com/article/dppdog.html