在现代分布式系统中,服务之间的通信是一个非常重要的环节。随着微服务架构的流行,服务之间的通信方式也在不断演进。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直接进行创建。
- dotnet new grpc -o GrpcDemo.Service
- cd GrpcDemo.Service
复制代码
这将创建一个包含 gRPC 模板的项目,其中包含一个示例的 gRPC 服务。
2. 编写自己的服务
在 文件夹中,默认会生成一个 文件。我们可以修改或创建新的 文件来定义自己的服务。
例如,创建一个 文件:
- 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;
- }
复制代码
接下来,在 文件夹中实现服务逻辑。创建一个 文件:
- 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
- });
- }
- }
- }
复制代码
在 中注册服务:
- 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 客户端依赖
在客户端项目中,添加 和 包:
- dotnet add package Grpc.Net.Client
- dotnet add package Google.Protobuf
- dotnet add package Grpc.Tools
复制代码
将服务端的 文件复制到客户端项目的 文件夹中,并在 文件中添加以下内容以生成 C# 代码:
3. 编写客户端代码
在 中编写 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 服务
在 中注册 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 客户端
在 中注册 gRPC 客户端:
- builder.Services.AddGrpcClient<Order.OrderClient>(options =>
- {
- options.Address = new Uri("http://localhost:5147");
- });
复制代码
结果:
总结
在 .NET Core 中,gRPC 提供了高性能的通信方式,适用于微服务、实时通信等场景。我们可以轻松创建 gRPC 服务端和客户端,并将其集成到 Web API 中。
关键点:
- 使用 文件定义服务接口。
- 实现 gRPC 服务端逻辑。
- 在客户端中调用 gRPC 服务。
- 在 Web API 中集成 gRPC,提供 RESTful API 和 gRPC 服务。
通过以上步骤,我们就可以在 .NET Core 项目中充分利用 gRPC 的优势,构建高效的分布式系统。
以上就是.NET8中gRPC的使用方法详解的详细内容,更多关于.NET8 gRPC的资料请关注晓枫资讯其它相关文章! 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |