.NET8中gRPC的使用方法详解

在现代分布式系统中,服务之间的通信是一个非常重要的环节。随着微服务架构的流行,服务之间的通信方式也在不断演进。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
2
dotnet new grpc -o GrpcDemo.Service
cd GrpcDemo.Service

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

2. 编写自己的服务

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

例如,创建一个 order.proto 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using Grpc.Core;
 
namespace GrpcDemo.Service.Services
{
    public class OrderService : Order.OrderBase
    {
        private readonly ILogger _logger;
        public OrderService(ILogger logger)
        {
            _logger = logger;
        }
        /// <summary>
        /// 创建订单
        /// </summary>
        ///
        ///
        ///
        public override Task CreateOrder(CreateRequest request, ServerCallContext context)
        {
            //报存数据库 todo
 
            return Task.FromResult(new CreateResult
            {
                IsSuccess = true,
                Message = "订单创建成功"
            });
        }
        /// <summary>
        /// 查询订单
        /// </summary>
        ///
        ///
        ///
        public override Task QueryOrder(QueryRequest request, ServerCallContext context)
        {
            //查询数据库 //todo
 
            return Task.FromResult(new QueryResult
            {
                    Id = request.Id,
                    OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
                    OrderName = "年货大礼包",
                    Price = 699
            });
        }
    }
}

在 Program.cs 中注册服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
using GrpcDemo.Service.Services;
 
var builder = WebApplication.CreateBuilder(args);
 
// 添加 gRPC 服务
builder.Services.AddGrpc();
 
var app = builder.Build();
 
// 映射 gRPC 服务
app.MapGrpcService();
 
app.Run();

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

三、创建 gRPC 客户端

1. 创建客户端项目

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

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

2. 添加 gRPC 客户端依赖

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

1
2
3
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调用的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//使用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 服务:

1
2
3
4
5
6
7
8
9
10
11
var builder = WebApplication.CreateBuilder(args);
 
// 添加 gRPC 服务
builder.Services.AddGrpc();
 
var app = builder.Build();
 
// 映射 gRPC 服务
app.MapGrpcService();
 
app.Run();

2. 提供 RESTful API

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 CreateOrder()
        {
            var response = await _client.CreateOrderAsync(
                new CreateRequest {
                    OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
                    OrderName = "年货大礼包",
                    Price = 699
                });
            return Ok(response);
        }
 
    }
}

3. 配置 gRPC 客户端

在 Program.cs 中注册 gRPC 客户端:

1
2
3
4
builder.Services.AddGrpcClient(options =>
{
    options.Address = new Uri("http://localhost:5147");
});

结果:

总结

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

关键点:

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

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

以上就是.NET8中gRPC的使用方法详解的详细内容,更多关于.NET8 gRPC的资料请关注IT俱乐部其它相关文章!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/asp-net/15098.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部