.NET8中gRPC的使用方法详解

ASP.NET教程 2025-08-23

目录

  • 一、简介
  • 二、创建 gRPC 服务端
    • 1. 创建 gRPC 项目
    • 2. 编写自己的服务
  • 三、创建 gRPC 客户端
    • 1. 创建客户端项目
    • 2. 添加 gRPC 客户端依赖
    • 3. 编写客户端代码
  • 四、Web API 中加入 gRPC
    • 1. 添加 gRPC 服务
    • 2. 提供 RESTful API
    • 3. 配置 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直接进行创建。

    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 ILoggerOrderService _logger;
            public OrderService(ILoggerOrderService logger)
            {
                _logger = logger;
            }
            /// summary
            /// 创建订单
            /// /summary
            /// param name="request"/param
            /// param name="context"/param
            /// returns/returns
            public override TaskCreateResult 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 TaskQueryResult 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.MapGrpcServiceOrderService();
    
    app.Run();
    

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

    三、创建 gRPC 客户端

    1. 创建客户端项目

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

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

    2. 添加 gRPC 客户端依赖

    在客户端项目中,添加Grpc.Net.Client和Google.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://local*hos*t:*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://lo*calhos**t: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.MapGrpcServiceOrderService();
    
    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 TaskIActionResult 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.AddGrpcClientOrder.OrderClient(options =
     {
         options.Address = new Uri("http://lo*calhos**t:5147");
     });
    

    结果:

    总结

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

    关键点:

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

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