在现代分布式系统中,服务之间的通信是一个非常重要的环节。随着微服务架构的流行,服务之间的通信方式也在不断演进。gRPC作为一种高性能、跨语言的RPC框架,逐渐成为了我们的首选。

一、简介

gRPC 是一种高性能、开源的远程过程调用(RPC)框架,基于 HTTP/2 协议,支持双向流、头部压缩等特性。它默认使用 Protocol Buffers(Protobuf)作为接口定义语言(IDL)和数据序列化格式,适用于微服务、实时通信等场景。

在 .NET Core(.NET 8)中,gRPC 提供了原生的支持,我们可以轻松创建 gRPC 服务端和客户端,并将其集成到 Web API 或其他应用中。

本文将围绕以下几个方面介绍如何在 .NET Core (.NET 8) 中使用 gRPC:

  1. 创建 gRPC 服务端
  2. 创建 gRPC 客户端
  3. 在 Web API 中集成 gRPC

二、创建 gRPC 服务端

1. 创建 gRPC 项目

首先,使用 .NET CLI 创建一个 gRPC 服务端项目。也可以通过VS2022直接进行创建。

dotnet new grpc -o GrpcDemo.Service
cd GrpcDemo.Service

这将创建一个包含 gRPC 模板的项目,其中包含一个示例的 gRPC 服务。

2. 编写自己的服务

Protos 文件夹中,默认会生成一个 greet.proto 文件。我们可以修改或创建新的 .proto 文件来定义自己的服务。

例如,创建一个 order.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 IsSuccess = 1; // 是否成功
string Message = 2; // 错误信息
} //查询订单请求参数
message QueryRequest{
int32 Id=1;
}
//查询订单返回结果
message QueryResult{
int32 Id=1;
string OrderNo=2;
string OrderName=3;
double Price=4;
}

接下来,在 Services 文件夹中实现服务逻辑。创建一个 OrderService.cs 文件:

using Grpc.Core;

namespace GrpcDemo.Service.Services
{
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
{
IsSuccess = 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
{
Id = request.Id,
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
OrderName = "年货大礼包",
Price = 699
});
}
}
}

Program.cs 中注册服务:

using GrpcDemo.Service.Services;

var builder = WebApplication.CreateBuilder(args);

// 添加 gRPC 服务
builder.Services.AddGrpc(); var app = builder.Build(); // 映射 gRPC 服务
app.MapGrpcService<OrderService>(); app.Run();

运行项目后,gRPC 服务端将启动并监听指定的端口。

三、创建 gRPC 客户端

1. 创建客户端项目

使用 .NET CLI 创建一个控制台项目作为 gRPC 客户端:

dotnet new console -o GrpcDemo.Client
cd GrpcDemo.Client

2. 添加 gRPC 客户端依赖

在客户端项目中,添加 Grpc.Net.ClientGoogle.Protobuf 包:

dotnet add package Grpc.Net.Client
dotnet add package Google.Protobuf
dotnet add package Grpc.Tools

将服务端的 order.proto 文件复制到客户端项目的 Protos 文件夹中,并在 .csproj 文件中添加以下内容以生成 C# 代码:

3. 编写客户端代码

Program.cs 中编写 gRPC服务HTTPS调用的代码:

static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
//常规使用,https
string url = "https://localhost:7231";
using (var channel = GrpcChannel.ForAddress(url))
{
var client = new Order.OrderClient(channel);
var reply = client.CreateOrder(new CreateRequest()
{
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
OrderName = "年货大礼包",
Price = 699
}); Console.WriteLine($"Grpc服务https的调用结果:{reply.IsSuccess},message:{reply.Message}");
}
Console.ReadKey(); }

结果:

如果 gRPC 服务端使用 HTTP(非 HTTPS),可以在客户端中直接使用 HTTP 地址:

 //使用http
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
string url = "http://localhost:5147"; using (var channel = GrpcChannel.ForAddress(url))
{
var client = new Order.OrderClient(channel);
var reply = client.CreateOrder(new CreateRequest()
{
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
OrderName = "年货大礼包",
Price = 699
}); Console.WriteLine($"gGrpc内网http调用结果:{reply.IsSuccess},message:{reply.Message}");
}
Console.ReadKey();

结果:

四、Web API 中加入 gRPC

在 Web API 项目中,可以同时提供 RESTful API 和 gRPC 服务。以下是如何在 Web API 中集成 gRPC 的步骤:

1. 添加 gRPC 服务

Program.cs 中注册 gRPC 服务:

var builder = WebApplication.CreateBuilder(args);

// 添加 gRPC 服务
builder.Services.AddGrpc(); var app = builder.Build(); // 映射 gRPC 服务
app.MapGrpcService<OrderService>(); app.Run();

2. 提供 RESTful API

在 Web API 中,可以通过控制器提供 RESTful API,并在内部调用 gRPC 服务:

using Microsoft.AspNetCore.Mvc;

namespace GrpcDemo.API.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class OrderController : ControllerBase
{
private readonly Order.OrderClient _client; public OrderController(Order.OrderClient client)
{
_client = client;
} [HttpGet("create")]
public async Task<IActionResult> CreateOrder()
{
var response = await _client.CreateOrderAsync(
new CreateRequest {
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
OrderName = "年货大礼包",
Price = 699
});
return Ok(response);
} }
}

3. 配置 gRPC 客户端

Program.cs 中注册 gRPC 客户端:

 builder.Services.AddGrpcClient<Order.OrderClient>(options =>
{
options.Address = new Uri("http://localhost:5147");
});

结果:

总结

在 .NET Core 中,gRPC 提供了高性能的通信方式,适用于微服务、实时通信等场景。我们可以轻松创建 gRPC 服务端和客户端,并将其集成到 Web API 中。

关键点:

  1. 使用 .proto 文件定义服务接口。
  2. 实现 gRPC 服务端逻辑。
  3. 在客户端中调用 gRPC 服务。
  4. 在 Web API 中集成 gRPC,提供 RESTful API 和 gRPC 服务。

通过以上步骤,我们就可以在 .NET Core 项目中充分利用 gRPC 的优势,构建高效的分布式系统。

源码地址:https://github.com/liyongqiang-cc/GrpcDemo

.NET8中gRPC的使用的更多相关文章

  1. python golang中grpc 使用示例代码详解

    python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...

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

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

  3. python中grpc配置asyncio使用

    python中grpc配置asyncio使用 安装grpclib pip3 install grpclib protoc编译.proto文件,生成源码文件 python -m grpc_tools.p ...

  4. 记录core中GRPC长连接导致负载均衡不均衡问题 二,解决长连接问题

    题外话: 1.这几天收到蔚来的面试邀请,但是自己没做准备,并且远程面试,还在上班时间,再加上老东家对我还不错.没想着换工作,导致在自己工位上做算法题不想被人看见,然后非常紧张.估计over了.不过没事 ...

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

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

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

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

  7. .net core中Grpc使用报错:Request protocol 'HTTP/1.1' is not supported.

    显然这个报错是说HTTP/1.1不支持. 首先,我们要知道,Grpc是Google开源的,跨语言的,高性能的远程过程调用框架,它是以HTTP/2作为通信协议的,所以当我启动启用一个服务作为Grpc的服 ...

  8. .NET Core(.NET6)中gRPC使用

    一.简介 简单解析一下gRPC,gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. 特点: 跨语言 内容protobuf格式(比json体积小),网络传输快 使用HT ...

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

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

  10. gRPC中Any类型的使用(Java和NodeJs端)

    工作中要把原来Java服务端基于SpringMVC的服务改为使用gRPC直接调用.由于原Service的返回值为动态的Map类型,key值不确定,且value的类型不唯一,因此使用了protobuf ...

随机推荐

  1. Net6之Jwt认证+Bearer认证 2.0

    以前接触过,写过博客,第二次再写有了新的体会.第一次博客:https://www.cnblogs.com/zhang-3/p/16184067.html 过程: 生成token令牌(钥匙) 添加bea ...

  2. [转]gcc的-g,-o,-c,-D,-w,-W,-Wall,-O3等参数的意义

    一.-g -g可执行程序包含调试信息-g为了调试用的加个-g 是为了gdb 用,不然gdb用不到 二.-o -o指定输出文件名-o output_filename,确定输出文件的名称为output_f ...

  3. 即时通讯技术文集(第34期):IM群聊技术合集(Part1) [共15篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第34 期. [- 1 -] 快速裂变:见证微信强大后台架构从0到1的演进历程(一) [链接]  ...

  4. 到底什么是Java AIO?为什么Netty会移除AOI?一文搞懂AIO的本质!

    本文由得物技术团队Uni分享,本文有内容修订和大量排版优化. 1.引言 关于Java网络编程中的同步IO和异步IO的区别及原理的文章非常的多,具体来说主要还是在讨论Java BIO和Java NIO这 ...

  5. springcloud eureka原理和机制

    公司的注册中心使用的是Eureka,之前使用过ZooKeeper,大致原理应该差不多,具体细节需要进一步学习,正好之前在腾讯云开发者社区看到一篇讲得很不错的文章,转载过来方便查看. 简介 在微服务架构 ...

  6. c# WindowsCommunityToolkit--- Shade Animation

    WindowsCommunityToolkit: https://github.com/CommunityToolkit/WindowsCommunityToolkit You can also pr ...

  7. w3cschool-MyBatis 教程

    参考 https://www.w3cschool.cn/mybatis/mybatis-dyr53b5w.html MyBatis 入门 SqlSessionFactoryBuilder用 SqlSe ...

  8. 接口(interface):实例化时要覆盖所有抽象方法,否则仍为抽象类

    概述 /* * 接口的使用 * 1.接口使用interface来定义 * 2.Java中,接口和类是并列的两个结构 * 3.如何定义接口:定义接口中的成员 * * 3.1 JDK7及以前:只能定义全局 ...

  9. 简单聊一下*SWITCH*交换机的作用

    交换机 交换机工作在数据链路层的物理设备或者说是接入层的物理设备,转发数据帧. 随着企业网络的发展,越来越多的用户需要接入到网络,交换机提供的大量的接入端口能够很好地满足这种需求.同时,交换机也彻底解 ...

  10. Project Euler 307 题解

    主要是规避误差.即求 \[\frac{k![x^k](1+x+\frac {x^2}2)^n}{n^k} \] 微分一下得到递推式.然后根据斯特林近似(byd 这里还需要 \(1\) 后的第一项..) ...