一、简介

简单解析一下gRPC,gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架。

特点:

  • 跨语言
  • 内容protobuf格式(比json体积小),网络传输快
  • 使用HTTP/2进行传输

适合高性能轻量的微服务,一般对外的接口用restful api,内部服务的调用用gRPC。gRPC是一个分布式服务框架,和以前的WebService,WCF类似。

二、创建gRPC服务端

1.创建gRPC项目

新建一个gRPC模板的项目

特别的地方就这里4点。

1.基于http2来通信。

2.proto协议文件,greet.proto是项目默认给我们的一个hello world的示例。它会根据协议自动生成需要的类。

3.服务类,Greeter.GreeterBase来自于2中的proto文件自动生成的类,生成的类在\obj\Debug\net6.0\Protos 目录下。

自动生成的类:

4.Program.cs添加了gRPC服务,和把GreeterService注册到管道中。

2.编写自己的服务

怎么样写自己的调用服务呢?

 1.创建proto文件

参照上面的示例创建自己的Proto文件

代码:

syntax = "proto3";

option csharp_namespace = "GrpcDemo.Service";

package order;

// 订单服务定义
service Order {
// 创建订单
rpc CreateOrder (CreateRequest) returns (CreateResult);
//查询订单
rpc QueryOrder (QueryRequest) returns (QueryResult);
} //创建订单请求参数
message CreateRequest {
string orderNo = 1;
string orderName=2;
double price=3;
} //创建订单返回结果
message CreateResult {
bool result = 1;
string message=2;
} //查询订单请求参数
message QueryRequest{
int id=1;
}
//查询订单返回结果
message QueryResult{
int id=1;
string orderNo=2;
string orderName=3;
double price=4;
}

生成一下就能看到对应的类已经生成了。

 2.实现定义的服务

创建OrderService.cs

 public class OrderService:Order.OrderBase
{
private readonly ILogger<GreeterService> _logger;
public OrderService(ILogger<GreeterService> logger)
{
_logger = logger;
}
/// <summary>
/// 创建订单
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override Task<CreateResult> CreateOrder(CreateRequest request, ServerCallContext context)
{
//报存数据库 todo return Task.FromResult(new CreateResult
{
Result=true,
Message="订单创建成功"
});
}
/// <summary>
/// 查询订单
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override Task<QueryResult> QueryOrder(QueryRequest request, ServerCallContext context)
{
//查询数据库 //todo return Task.FromResult(new QueryResult
{
OrderInfo=new OrderInfo
{
Id = request.Id,
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
OrderName = "冰箱",
Price = 1288
}
});
}
}

继承的Order.OrderBase 是上面的proto文件生成的,然后实现了proto里面定义的两个服务。

然后在program.cs里面把服务注入管道。

到这里服务端就完成了,就可以启动服务端了。

浏览器访问不了,要通过gRPC客户端才能访问,下面就建一个gRPC客户端。

三、创建gRPC客户端

1.创建客户端项目

1.1、这里创建一个控制台程序。

1.2、然后添加Nuget包

Google.Protobuf
Grpc.Net.Client
Grpc.Tools
Grpc.Net.clientFactory

1.3、把服务端的proto文件拷贝过来

1.4、编辑项目文件,把proto里面的内容替换掉,默认是服务端的配置

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

生成的时候,客户端也生成了对应proto的类

2.grPC服务https的调用

因为服务端提供了http和https的端口,这里先调用https的

创建GrpcRequestTest.cs类

 /// <summary>
/// gRPC请求测试
/// </summary>
public class GrpcRequestTest
{
public void CreateOrder()
{
//常规使用,https
string url = "https://localhost:7246";
using(var channel=GrpcChannel.ForAddress(url))
{
var client = new Order.OrderClient(channel);
var reply = client.CreateOrder(new CreateRequest()
{
OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"),
OrderName = "冰箱22款",
Price = 1688
}); Console.WriteLine($"结果:{reply.Result},message:{reply.Message}");
}
Console.ReadKey();
}
}

结果:

3.gRPC内网http调用

      public void CreateOrder()
{
//使用http
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
string url = "http://localhost:5246"; using(var channel=GrpcChannel.ForAddress(url))
{
var client = new Order.OrderClient(channel);
var reply = client.CreateOrder(new CreateRequest()
{
OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"),
OrderName = "冰箱22款",
Price = 1688
}); Console.WriteLine($"结果:{reply.Result},message:{reply.Message}");
}
Console.ReadKey();
}

比起https,前面多了一行。结果:

4.IOC注入的方式调用gRPC

4.1、program.cs里面注入gRPCClient

// See https://aka.ms/new-console-template for more information
using GrpcDemo.Client;
using GrpcDemo.Service;
using Microsoft.Extensions.DependencyInjection; Console.WriteLine("Hello, World!"); IServiceCollection services = new ServiceCollection();
services.AddTransient<GrpcRequestTest>(); #region gRPC Client注册
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
services.AddGrpcClient<Order.OrderClient>(options =>
{
options.Address = new Uri("http://localhost:5246");
}).ConfigureChannel(grpcOptions =>
{
//可以完成各种配置,比如token
});
#endregion //构建容器
IServiceProvider serviceProvider = services.BuildServiceProvider();
//解析grpc请求测试
var grpcRequestTest = serviceProvider.GetService<GrpcRequestTest>();
//执行
grpcRequestTest.CreateOrder();

grpcRequestTest里代码:

/// <summary>
/// gRPC请求测试
/// </summary>
public class GrpcRequestTest
{
private Order.OrderClient _orderClient;
public GrpcRequestTest(Order.OrderClient orderClient)
{
_orderClient = orderClient;
}
public void CreateOrder()
{
var reply = _orderClient.CreateOrder(new CreateRequest()
{
OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"),
OrderName = "冰箱22款",
Price = 1688
});
Console.WriteLine($"结果:{reply.Result},message:{reply.Message}");
Console.ReadKey();
}
}

结果:

四、webapi中加入gRPC

通常我们的服务有对外提供对外接口,又要对内提供gRPC服务,那怎么做呢,下面在webapi中加入gRPC服务

1.创建asp.net core mvc项目

2.安装nuget包

Grpc.AspNetCore

3.添加protebuf文件

把上面的proto文件复制过来

4.添加Service

  public class OrderService : Order.OrderBase
{
private readonly ILogger<OrderService> _logger;
public OrderService(ILogger<OrderService> logger)
{
_logger = logger;
}
/// <summary>
/// 创建订单
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override Task<CreateResult> CreateOrder(CreateRequest request, ServerCallContext context)
{
//报存数据库 todo return Task.FromResult(new CreateResult
{
Result = true,
Message = "订单创建成功"
});
}
/// <summary>
/// 查询订单
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override Task<QueryResult> QueryOrder(QueryRequest request, ServerCallContext context)
{
//查询数据库 //todo return Task.FromResult(new QueryResult
{
OrderInfo = new OrderInfo
{
Id = request.Id,
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
OrderName = "冰箱",
Price = 1288
}
});
}
}

5.注册gRPC服务

在Program.cs文件中

到这里,就把gRPC加入到webapi里面了。

6.验证

启动asp.net core mvc程序

浏览器能访问,证明 restful api是没问题的。

然后再用上面的客户端访问一下gRPC的服务。

结果:

这样就成功对外提供api接口和对内提供gRPC服务了。

源码地址:https://github.com/weixiaolong325/GrpcDemo.Service

.NET Core(.NET6)中gRPC使用的更多相关文章

  1. .NET Core(.NET6)中gRPC注册到Consul

    一.简介 上一篇文章介绍了.NET Core 中使用gRPC,在微服务中,我们通常要把服务做成服务注册,服务发现的方式,那么这里来说一下gRPC是如何注册到Consul中的. Consul的安装这里就 ...

  2. .Net Core(.NET6)中接入Log4net和NLog进行日志记录

    一.接入Log4net 1.按日期和大小混合分割日志 nuget包安装 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 配置文件 配置文 ...

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

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

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

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

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

  6. ASP.NET Core 3.0 gRPC 拦截器

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 拦截器 一. 前言 前面两篇文章给大家介绍了使用g ...

  7. ASP.NET Core 3.0 gRPC 身份认证和授权

    一.开头聊骚 本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了,以后在实际使用中,可能会发一些经验之文.本文主要讲 ASP.NET Core 本身的认证授权和gRPC接 ...

  8. 「译」 .NET 6 中 gRPC 的新功能

    gRPC是一个现代的.跨平台的.高性能的 RPC 框架.gRPC for .NET 构建在 ASP.NET Core 之上,是我们推荐的在 .NET 中构建 RPC 服务的方法. .NET 6 进一步 ...

  9. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

    在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...

随机推荐

  1. toppo-1

    靶机准备 由于是.vmdk文件,新建一个虚拟机把硬盘移除,在将此vmdk文件添加为新硬盘即. 开机发现给出了ip地址:192.168.164.184,且当前网络模式为NAT 将kali也设置为NAT模 ...

  2. 通过Kuberneters Goat学习K8S安全(上)

    实验环境:https://katacoda.com/madhuakula/scenarios/kubernetes-goat 0x1.敏感信息泄露利用 第一关是代码泄露利用,打开网站后显示: 告诉我们 ...

  3. 【死磕NIO】— 探索 SocketChannel 的核心原理

    大家好,我是大明哥,一个专注于[死磕 Java]系列创作的程序员. [死磕 Java ]系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码. 死磕 ...

  4. [使用多仓库解决] idea maven 下载源码出现:Cannot download sources Sources not found for: xxx

    根本原因 依赖托管仓库的库存不足.有的仓库,就是没有团队上传这个依赖.所以多加几个镜像源,总有一个仓库能找到. 解决方案 修改 maven 默认配置文件 "C:\Users\<user ...

  5. 第九届蓝桥杯 C组 Java 等腰三角形

    目录 题目 解答 题目 题目描述 本题目要求你在控制台输出一个由数字组成的等腰三角形. 具体的步骤是: 1. 先用1,2,3,...的自然数拼一个足够长的串 2. 用这个串填充三角形的三条边.从上方顶 ...

  6. Less使用@import进行Mixins

    Import 指令 从其他样式表导入样式 在标准CSS中,@ import at-rules必须在所有其他类型的规则之前.但Less.js并不关心你放置@import语句的位置 Example: .f ...

  7. Collection 和 Collections 的区别?

    Collection 是一个接口,它是 Set.List 等容器的父接口:Collections 是个一个 工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索. 排序.线程安全化等 ...

  8. Python - Python函数简介

  9. CSS中宽度与高度

    div的高度 div由的高度是由它里面的字体乘以字体建议的行高确定,跟这个字体大小没有关系(不同字体相同字体大小,会影响div的高度.)如过明确告诉浏览器行高,div高度就是行高. 文字两端对齐: 文 ...

  10. post提交的数据有哪几种编码格式?能否通过URL参数获取用户账户密码

    这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [post提交的 ...