这篇文章主要介绍了ASP.NET Core 3.0使用gRPC,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一.简介

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 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 服务。

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

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

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

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

自动生成的类:

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

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

2.运行

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

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

四. 创建 gRPC 客户端

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

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

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

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

<ItemGroup>
 <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>

注意 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.先启动服务,然后运行客户端

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

五.自己动手写一个服务

前面我们使用的 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<string> Cats=new List<string>(){"英短银渐层","英短金渐层","美短","蓝猫","狸花猫","橘猫"};
 private static readonly Random Rand=new Random(DateTime.Now.Millisecond);
 public override Task<SuckingCatResult> SuckingCat(Empty request, ServerCallContext context)
 {
  return Task.FromResult(new SuckingCatResult()
  {
   Message = $"您吸了一只{Cats[Rand.Next(0, Cats.Count)]}"
  });
 }
}

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

endpoints.MapGrpcService<LuCatService>();

4.添加客户端调用

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

5.运行测试

六.实际使用中的

1

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

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

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

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

 <ItemGroup>
 <Protobuf Include="..\..\Protos\greet.proto" GrpcServices="Client" Link="Protos\greet.proto" />
 </ItemGroup>

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

 <ItemGroup>
 <Protobuf Include="..\..\Protos\greet.proto" GrpcServices="Server" Link="Protos\greet.proto" />
 </ItemGroup>

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

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

2

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

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

服务端:

 <ItemGroup>
 <Protobuf Include="..\..\Protos\*.proto" GrpcServices="Server" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" />
 </ItemGroup>

客户端:

 <ItemGroup>
 <Protobuf Include="..\..\Protos\*.proto" GrpcServices="Client" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" />
 </ItemGroup>

示例:

七.总结

gRPC 现目前是一款非常成熟的高性能RPC框架,当前的生态是非常好的,很多公司的产品或者开源项目都有在使用gRPC,有了它,相信可以让我们更容易的构建.NET Core 微服务,可以让 .NET Core 更好的接入 gRPC 生态。不得不说这是 .NET Core 3.0 带来的最令人振奋的特性之一。

参考资料:

proto3 说明文档

在ASP.NET Core中创建gRPC客户端和服务

Demo 地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持爱安网。

最新资讯
特斯拉频繁裁员让员工没有安全感:像斧子悬在头上

特斯拉频繁裁员让员工

据国外媒体报道,多名特斯拉员工表示,频繁的裁员让他们感
小红书回应部分用户App访问故障:技术原因 已恢复

小红书回应部分用户Ap

7月6日晚间,部分用户发现小红书移动端App苹果和安卓系
蔚来涨幅扩大至26.65% 二季度交付10331辆汽车超预期

蔚来涨幅扩大至26.65%

蔚来汽车二季度交付了10331辆汽车,超出了此前预期上限
亚马逊和英伟达也卷入“反性骚扰运动” 150多人涉案

亚马逊和英伟达也卷入

越来越多的美国大品牌卷入到了正席卷美国游戏直播界的
蔚来汽车涨逾20% 股价突破11美元关口

蔚来汽车涨逾20% 股价

蔚来汽车涨逾20%,股价突破11美元关口,创2019年3月上旬以
美的:格力所提及中移动项目发票及技术存疑均不属实

美的:格力所提及中移动

美的官方微博发表声明表示:格力所提及在中国移动招标项
最新文章
用.NET做动态域名解析的方法示例

用.NET做动态域名解析

这篇文章主要介绍了用.NET做动态域名解析的方法示例,文
.NET Core3.1编写混合C++程序

.NET Core3.1编写混合

这篇文章主要介绍了.NET Core3.1编写混合C++程序,文中
ASP.NET Core 3.0使用gRPC的具体方法

ASP.NET Core 3.0使用

这篇文章主要介绍了ASP.NET Core 3.0使用gRPC,文中通过
ASP.NET Core 3.0 gRPC拦截器的使用

ASP.NET Core 3.0 gRP

这篇文章主要介绍了ASP.NET Core 3.0 gRPC拦截器的使
ASP.NET Core 3框架揭秘之 异步线程无法使用IServiceProvider问题

ASP.NET Core 3框架揭

这篇文章主要介绍了ASP.NET Core 3框架揭秘之异步线程
3分钟快速学会在ASP.NET Core MVC中如何使用Cookie

3分钟快速学会在ASP.N

这篇文章主要给大家介绍了关于如何通过3分钟快速学会