一、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的更多相关文章

  1. [gRPC] 在 .NET Core 中创建 gRPC 服务端和客户端

    gRPC 官网:https://grpc.io/ 1. 创建服务端 1.1 基于 ASP.NET Core Web 应用程序模板创建 gRPC Server 项目. 1.2 编译并运行 2. 创建客户 ...

  2. gRPC在 ASP.NET Core 中应用学习(二)

    前言: 上一篇文章中简单的对gRPC进行了简单了解,并实现了gRPC在ASP.NET Core中服务实现.客户端调用:那么本篇继续对gRPC的4中服务方法定义.其他使用注意点进一步了解学习 一.gRP ...

  3. 在.NET Core中批量注入Grpc服务

    GRPC 是谷歌发布的一个开源.高性能.通用RPC服务,尽管大部分 RPC 框架都使用 TCP 协议,但其实 UDP 也可以,而 gRPC 干脆就用了 HTTP2.还有就是它具有跨平台.跨语言 等特性 ...

  4. .net core中Grpc使用报错:The remote certificate is invalid according to the validation procedure.

    因为Grpc采用HTTP/2作为通信协议,默认采用LTS/SSL加密方式传输,比如使用.net core启动一个服务端(被调用方)时: public static IHostBuilder Creat ...

  5. .net core中Grpc使用报错:The response ended prematurely.

    当我们调用Grpc是出现下面的一堆异常时,一般是由于LTS导致的: Call failed with gRPC error status. Status code: 'Unavailable', Me ...

  6. .net core 3.0中可以使用gRPC了

    今天发现.net core下有gRPC模板了,这个可是补全了.net core下高性能RPC框架缺失这一大短板了. 使用模板创建了工程后,发现连客户端的示例也创建了. 更加给力的是,IDE是能直接识别 ...

  7. 在 ASP.NET Core 中集成 Skywalking APM

    前言 大家好,今天给大家介绍一下如何在 ASP.NET Core 项目中集成 Skywalking,Skywalking 是 Apache 基金会下面的一个开源 APM 项目,有些同学可能会 APM ...

  8. .Net Core 3.0 gRPC部署问题解决

    前言 .Net Core3.0终于如约而至的来了.在3.0中增加了许多东西.也有了许多的变化.今天我们看的就是在3.0中使用gRPC并遇到的问题.gRPC现在可以非常方便简洁的在.Net Core中使 ...

  9. 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 ...

随机推荐

  1. [oracle/sql]求员工表中每个部门里薪水最高的员工,那种sql最优?

    开始正题前,先把我的数据库环境列出: # 类别 版本 1 操作系统 Win10 2 数据库 Oracle Database 11g Enterprise Edition Release 11.2.0. ...

  2. Netty进阶和实战

    实现UDP单播和广播 UDP 这样的无连接协议中,并没有持久化连接这样的概念,并且每个消息(一个UDP 数据报)都是一个单独的传输单元.此外,UDP 也没有TCP 的纠错机制. 通过类比,TCP 连接 ...

  3. leetcode刷题-49字母异位词分组

    题目 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 思路 由于异位词由相同字母构成,所以可以用一个顺序的字符串作为这些字母异位词的标志,由此可以想到字典的方法 ...

  4. IIS实现Nginx功能:转发

    这个标题本身是不合理的,但是基于目前公司有一份系统是外部代理商贴牌使用,有一个老的站点是部署在IIS上,好多代理商自己的域名绑定在这个上面,而近期新版本的系统已经上线,那么需要将这些域名也转发到新的站 ...

  5. oracle数据处理之expdb/impdb

    Oracle 数据泵的使用方法 一.新建逻辑目录 最好以system等管理员创建逻辑目录,Oracle不会自动创建实际的物理目录“D:\oracleData”(务必手动创建此目录),仅仅是进行定义逻辑 ...

  6. [LeetCode]415. 字符串相加、43. 字符串相乘

    题目 415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 题解 维护一个temp表示当前两数相加+上一个进位的和. 每次更新结果的一位. 注意终止条件. 最后将 ...

  7. Noip2017 Day2 T1 奶酪

    题目描述 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z =0,奶酪的上表面为 ...

  8. 使用phoenix连接hbase

    hbase本身不支持SQL查询,为了实现这个功能,引入了phoenix,通过它可以实现hbase的sql查询.这里记录下如何配置并使用phoenix来操作hbase. 1. 下载地址 phoenix下 ...

  9. Linux实战(17):Linux配置用户登陆时发送邮件到指定邮箱

    参考其他文章,正好有这个需求,记一笔做个记录,以防丢失. 参考链接 #!/bin/bash yum install -y mailx cat >> /etc/mail.rc<< ...

  10. Redis Cluster集群架构实现

    Redis集群简介 通过前面三篇博客的介绍<Redis基础认识及常用命令使用(一)–技术流ken>,<Redis基础知识补充及持久化.备份介绍(二)–技术流ken>,<R ...