.Net Core中使用Grpc
一、Grpc概述
gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。gRPC 默认使用protocol buffers作为接口定义语言,来描述服务接口和有效载荷消息结构。如果有需要的话,可以使用其他替代方案。
定义的服务分为4中类型:
- 单项 RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。这种最常用。
- 服务端流式 RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。
- 客户端流式 RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。
- 双向流式 RPC,即两边都可以分别通过一个读写数据流来发送一系列消息。这两个数据流操作是相互独立的,所以客户端和服务端能按其希望的任意顺序读写,例如:服务端可以在写应答前等待所有的客户端消息,或者它可以先读一个消息再写一个消息,或者是读写相结合的其他方式。每个数据流里消息的顺序会被保持。
二、.Net Core中使用Grpc
使用Grpc 就三步:定义Grpc服务、实现Grpc服务、调用Grpc服务。
2.1 定义Grpc服务
1、在VS中选择.Net Core创建类库
2、引入Google.Protobuf、Grpc.Core包
3、创建proto文件,定义一个SsmServer服务,服务中提供两个方法,一个最简单的单项RPC方法,一个双向流式RPC。后面这个文件会生成一个同名的C#类文件。
syntax = "proto3"; //语法指定proto3
package ShenDa.SSM.Grpc; //后面生成C#文件的命名空间 import "Protos/Common.proto";
import "Protos/Health.proto";
import "Protos/User.proto";//指定定义服务中使用的参数的位置 service SsmService{
//健康检查 单项 RPC
rpc Health(EmptyRequest) returns (HealthResponse){}
//双向流
rpc User_Add(stream UserAddRequest) returns(stream UserAddResponse){}
}
定义的Health.proto文件
syntax = "proto3";
package ShenDa.SSM.Grpc; message HealthResponse{ //返回参数
bool Success=1; //每个字段必须要指定序号
string Message=2;
}
以上服务就定义完成了。现在需要将这个proto文件生成C#文件,可以使用命令,也可以使用工具。在这里我使用工具生成。
5、引用Grpc.Tools ,然后在工程文件中指定要生成的proto文件。
<ItemGroup>
<Protobuf Include="Protos\User.proto" />
<Protobuf Include="Protos\Health.proto" />
<Protobuf Include="Protos\Common.proto" />
<Protobuf Include="Protos\SsmService.proto" />
</ItemGroup>
生成项目,就会在 obj文件夹中生成对应的C#文件。其他文件都是生成对应的实体类,但是定义的服务的proto文件,比较特殊,它会生成一个同名的类文件,类中包含
- 一个抽象类,名称为服务名+Base。其中包含我们定义的虚两个方法
- 一个部分类,名称为服务名+Client,继承 ClientBase<服务名Client>
以上所有的Grpc服务都已经定义完了。因为客户端不可能每个都通过添加应用项目的方式使用,所以我们还需要打包客户端Nuget包。
6、生成Nuget包,提供给客户端使用
通过VS设置打包生成Nuget包,生成Grpc客户端Nuget包。
2.2 实现Grpc服务
通过VS的GRPC模板创建项目,定义实现类并继承上面生成的抽象类,然后重写我们定义的方法。
public partial class SsmServiceImpl : SsmService.SsmServiceBase
{
public override async Task<HealthResponse> Health(EmptyRequest request, ServerCallContext context)
{
var response = new HealthResponse()
{
Message = string.Empty,
Success = true
}; return await Task.FromResult(response);
}
}
配置Grpc服务
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<SsmServiceImpl>();//注入服务的实现。
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
});
});
}
项目结构截图:

2.3 客户端调用Grpc
1、添加引用Google.Protobuf、Grpc.Core、Grpc.Net.Client 还有刚才生成的Nuget包 ShenDa.SSM.Grpc
2、调用
class Program
{
static async Task Main(string[] args)
{ var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new SsmServiceClient(channel); await HealthCheck(client);
} public static async Task HealthCheck(SsmServiceClient client)
{
var response = await client.HealthAsync(new EmptyRequest()); System.Console.WriteLine(response.Success ? "健康" : "连接失败");
}
}
.Net Core中使用Grpc的更多相关文章
- [gRPC] 在 .NET Core 中创建 gRPC 服务端和客户端
gRPC 官网:https://grpc.io/ 1. 创建服务端 1.1 基于 ASP.NET Core Web 应用程序模板创建 gRPC Server 项目. 1.2 编译并运行 2. 创建客户 ...
- gRPC在 ASP.NET Core 中应用学习(二)
前言: 上一篇文章中简单的对gRPC进行了简单了解,并实现了gRPC在ASP.NET Core中服务实现.客户端调用:那么本篇继续对gRPC的4中服务方法定义.其他使用注意点进一步了解学习 一.gRP ...
- 在.NET Core中批量注入Grpc服务
GRPC 是谷歌发布的一个开源.高性能.通用RPC服务,尽管大部分 RPC 框架都使用 TCP 协议,但其实 UDP 也可以,而 gRPC 干脆就用了 HTTP2.还有就是它具有跨平台.跨语言 等特性 ...
- .net core中Grpc使用报错:The remote certificate is invalid according to the validation procedure.
因为Grpc采用HTTP/2作为通信协议,默认采用LTS/SSL加密方式传输,比如使用.net core启动一个服务端(被调用方)时: public static IHostBuilder Creat ...
- .net core中Grpc使用报错:The response ended prematurely.
当我们调用Grpc是出现下面的一堆异常时,一般是由于LTS导致的: Call failed with gRPC error status. Status code: 'Unavailable', Me ...
- .net core 3.0中可以使用gRPC了
今天发现.net core下有gRPC模板了,这个可是补全了.net core下高性能RPC框架缺失这一大短板了. 使用模板创建了工程后,发现连客户端的示例也创建了. 更加给力的是,IDE是能直接识别 ...
- 在 ASP.NET Core 中集成 Skywalking APM
前言 大家好,今天给大家介绍一下如何在 ASP.NET Core 项目中集成 Skywalking,Skywalking 是 Apache 基金会下面的一个开源 APM 项目,有些同学可能会 APM ...
- .Net Core 3.0 gRPC部署问题解决
前言 .Net Core3.0终于如约而至的来了.在3.0中增加了许多东西.也有了许多的变化.今天我们看的就是在3.0中使用gRPC并遇到的问题.gRPC现在可以非常方便简洁的在.Net Core中使 ...
- ASP.NET Core 3.0 gRPC 双向流
目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 认证授权 一.前言 在前一文 <ASP.NE ...
随机推荐
- AMQP 概论
AMQP 是应用层协议的一个开放标准,为面向消息的中间件设计.基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制.目标是实现一种在全行业广泛使用的标准消 ...
- TP6.0 一对多模型关联 hasMany
本文测试关联方法都采用预载入查询 $data = Article::with('comments')->select(); halt($data->toArray()); 1. 创建数据表 ...
- php bypass disable function
前言 最近开学,事太多了,好久没更新了,然后稍微闲一点一直在弄这个php bypass disable function,一开始自己的电脑win10安装蚁剑的插件,一直报错.怀疑是必须linux环境. ...
- 关于TCP建立连接
TCP大家大多称之为"三次握手".今天看了一篇文章,学到了"三步握手". TCP建立连接,客户端发送SYN给服务端,服务端接收到请求回应ACK.服务端发送SYN ...
- Spring事务管理(编码式、配置文件方式、注解方式)
1.事务(https://www.cnblogs.com/zhai1997/p/11710082.html) (1)事务的特性:acdi (2)事务的并发问题:丢失修改,脏读,不可重复读 (3)事务的 ...
- Linux系统编程 —互斥量mutex
互斥量mutex 前文提到,系统中如果存在资源共享,线程间存在竞争,并且没有合理的同步机制的话,会出现数据混乱的现象.为了实现同步机制,Linux中提供了多种方式,其中一种方式为互斥锁mutex(也称 ...
- springboot实现防重复提交和防重复点击
背景 同一条数据被用户点击了多次,导致数据冗余,需要防止弱网络等环境下的重复点击 目标 通过在指定的接口处添加注解,实现根据指定的接口参数来防重复点击 说明 这里的重复点击是指在指定的时间段内多次点击 ...
- Java基础——锁
1.锁 当一个共享资源被多方访问时为了避免发生冲突而施加的一种机制 2.乐观锁和悲观锁 Java中锁在宏观分为乐观锁和悲观锁 乐观锁:是一种乐观思想,认为多读少写,一般情况下数据在修改时不会出现冲突, ...
- Django-发送注册、忘记密码邮件验证-send_mail
用户邮箱注册.发送验证码流程图 那,如何解决? 1. setting配置邮箱参数 # 邮箱设置,需要在邮箱中开启smtp服务 # 提供服务的主机域名 EMAIL_HOST = 'smtp.163.c ...
- PageRank算法(网页排名)
Google用它来体现网页的相关性和重要性