.NET8中gRPC的使用

打印 上一主题 下一主题

主题 980|帖子 980|积分 2940

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

gRPC 是一种高性能、开源的远程过程调用(RPC)框架,基于 HTTP/2 协议,支持双向流、头部压缩等特性。它默认使用 Protocol Buffers(Protobuf)作为接口界说语言(IDL)和数据序列化格式,适用于微服务、及时通信等场景。
在 .NET Core(.NET 8)中,gRPC 提供了原生的支持,我们可以轻松创建 gRPC 服务端和客户端,并将其集成到 Web API 或其他应用中。
本文将围绕以下几个方面介绍如何在 .NET Core (.NET 8) 中使用 gRPC:

  • 创建 gRPC 服务端
  • 创建 gRPC 客户端
  • 在 Web API 中集成 gRPC
二、创建 gRPC 服务端

1. 创建 gRPC 项目

起首,使用 .NET CLI 创建一个 gRPC 服务端项目。也可以通过VS2022直接举行创建。
  1. dotnet new grpc -o GrpcDemo.Service
  2. cd GrpcDemo.Service
复制代码

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

2. 编写本身的服务

在 Protos 文件夹中,默认会生成一个 greet.proto 文件。我们可以修改或创建新的 .proto 文件来界说本身的服务。
比方,创建一个 order.proto 文件:
  1. syntax = "proto3";
  2. option csharp_namespace = "GrpcDemo.Service";
  3. package order;
  4. // 订单服务定义
  5. service Order {
  6.   // 创建订单
  7. rpc CreateOrder (CreateRequest) returns (CreateResult);
  8.   //查询订单
  9. rpc QueryOrder (QueryRequest) returns (QueryResult);
  10. }
  11. //创建订单请求参数
  12. message CreateRequest {
  13.   string OrderNo = 1;
  14.   string OrderName=2;
  15.   double Price=3;
  16. }
  17. //创建订单返回结果
  18. message CreateResult {
  19.   bool IsSuccess = 1; // 是否成功
  20.   string Message = 2; // 错误信息
  21. }
  22. //查询订单请求参数
  23. message QueryRequest{
  24.   int32 Id=1;
  25. }
  26. //查询订单返回结果
  27. message QueryResult{
  28.   int32 Id=1;
  29.   string OrderNo=2;
  30.   string OrderName=3;
  31.   double Price=4;
  32. }
复制代码
接下来,在 Services 文件夹中实现服务逻辑。创建一个 OrderService.cs 文件:
  1. using Grpc.Core;
  2. namespace GrpcDemo.Service.Services
  3. {
  4.     public class OrderService : Order.OrderBase
  5.     {
  6.         private readonly ILogger<OrderService> _logger;
  7.         public OrderService(ILogger<OrderService> logger)
  8.         {
  9.             _logger = logger;
  10.         }
  11.         /// <summary>
  12.         /// 创建订单
  13.         /// </summary>
  14.         /// <param name="request"></param>
  15.         /// <param name="context"></param>
  16.         /// <returns></returns>
  17.         public override Task<CreateResult> CreateOrder(CreateRequest request, ServerCallContext context)
  18.         {
  19.             //报存数据库 todo
  20.             return Task.FromResult(new CreateResult
  21.             {
  22.                 IsSuccess = true,
  23.                 Message = "订单创建成功"
  24.             });
  25.         }
  26.         /// <summary>
  27.         /// 查询订单
  28.         /// </summary>
  29.         /// <param name="request"></param>
  30.         /// <param name="context"></param>
  31.         /// <returns></returns>
  32.         public override Task<QueryResult> QueryOrder(QueryRequest request, ServerCallContext context)
  33.         {
  34.             //查询数据库 //todo
  35.             return Task.FromResult(new QueryResult
  36.             {
  37.                     Id = request.Id,
  38.                     OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
  39.                     OrderName = "年货大礼包",
  40.                     Price = 699
  41.             });
  42.         }
  43.     }
  44. }
复制代码
在 Program.cs 中注册服务:
  1. using GrpcDemo.Service.Services;
  2. var builder = WebApplication.CreateBuilder(args);
  3. // 添加 gRPC 服务
  4. builder.Services.AddGrpc();
  5. var app = builder.Build();
  6. // 映射 gRPC 服务
  7. app.MapGrpcService<OrderService>();
  8. app.Run();
复制代码
运行项目后,gRPC 服务端将启动并监听指定的端口。
三、创建 gRPC 客户端

1. 创建客户端项目

使用 .NET CLI 创建一个控制台项目作为 gRPC 客户端:
  1. dotnet new console -o GrpcDemo.Client
  2. cd GrpcDemo.Client
复制代码
2. 添加 gRPC 客户端依赖

在客户端项目中,添加 Grpc.Net.Client 和 Google.Protobuf 包:
  1. dotnet add package Grpc.Net.Client
  2. dotnet add package Google.Protobuf
  3. dotnet add package Grpc.Tools
复制代码
将服务端的 order.proto 文件复制到客户端项目的 Protos 文件夹中,并在 .csproj 文件中添加以下内容以生成 C# 代码:

3. 编写客户端代码

在 Program.cs 中编写 gRPC服务HTTPS调用的代码:
  1. static void Main(string[] args)
  2. {
  3.     Console.WriteLine("Hello, World!");
  4.     //常规使用,https
  5.     string url = "https://localhost:7231";
  6.     using (var channel = GrpcChannel.ForAddress(url))
  7.     {
  8.         var client = new Order.OrderClient(channel);
  9.         var reply = client.CreateOrder(new CreateRequest()
  10.         {
  11.             OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
  12.             OrderName = "年货大礼包",
  13.             Price = 699
  14.         });
  15.         Console.WriteLine($"Grpc服务https的调用结果:{reply.IsSuccess},message:{reply.Message}");
  16.     }
  17.     Console.ReadKey();
  18. }
复制代码
结果:

如果 gRPC 服务端使用 HTTP(非 HTTPS),可以在客户端中直接使用 HTTP 地址:
  1. //使用http
  2. AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
  3. string url = "http://localhost:5147";
  4. using (var channel = GrpcChannel.ForAddress(url))
  5. {
  6.      var client = new Order.OrderClient(channel);
  7.      var reply = client.CreateOrder(new CreateRequest()
  8.      {
  9.          OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
  10.          OrderName = "年货大礼包",
  11.          Price = 699
  12.      });
  13.      Console.WriteLine($"gGrpc内网http调用结果:{reply.IsSuccess},message:{reply.Message}");
  14. }
  15. Console.ReadKey();
复制代码
结果:

四、Web API 中加入 gRPC

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

在 Program.cs 中注册 gRPC 服务:
  1. var builder = WebApplication.CreateBuilder(args);
  2. // 添加 gRPC 服务
  3. builder.Services.AddGrpc();
  4. var app = builder.Build();
  5. // 映射 gRPC 服务
  6. app.MapGrpcService<OrderService>();
  7. app.Run();
复制代码
2. 提供 RESTful API

在 Web API 中,可以通过控制器提供 RESTful API,并在内部调用 gRPC 服务:
  1. using Microsoft.AspNetCore.Mvc;
  2. namespace GrpcDemo.API.Controllers
  3. {
  4.     [ApiController]
  5.     [Route("api/[controller]")]
  6.     public class OrderController : ControllerBase
  7.     {
  8.         private readonly Order.OrderClient _client;
  9.         public OrderController(Order.OrderClient client)
  10.         {
  11.             _client = client;
  12.         }
  13.         [HttpGet("create")]
  14.         public async Task<IActionResult> CreateOrder()
  15.         {
  16.             var response = await _client.CreateOrderAsync(
  17.                 new CreateRequest {
  18.                     OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
  19.                     OrderName = "年货大礼包",
  20.                     Price = 699
  21.                 });
  22.             return Ok(response);
  23.         }
  24.     }
  25. }
复制代码
3. 配置 gRPC 客户端

在 Program.cs 中注册 gRPC 客户端:
  1. builder.Services.AddGrpcClient<Order.OrderClient>(options =>
  2. {
  3.      options.Address = new Uri("http://localhost:5147");
  4. });
复制代码
结果:

总结

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

  • 使用 .proto 文件界说服务接口。
  • 实现 gRPC 服务端逻辑。
  • 在客户端中调用 gRPC 服务。
  • 在 Web API 中集成 gRPC,提供 RESTful API 和 gRPC 服务。
通过以上步骤,我们就可以在 .NET Core 项目中充分利用 gRPC 的优势,构建高效的分布式体系。
源码地址:https://github.com/liyongqiang-cc/GrpcDemo


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表