商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > .NET8中gRPC的使用方法详解

.NET8中gRPC的使用方法详解

  发布于2026-07-23 阅读(0)

扫一扫,手机访问

分布式系统里,服务之间的通信从来都是个绕不开的话题。微服务架构火了之后,通信方式也跟着迭代了好几轮。gRPC凭借高性能、跨语言的优势,慢慢成了不少团队的首选。

一、简介

gRPC,全称是高性能远程过程调用框架,开源、基于HTTP/2,支持双向流、头部压缩这些特性。默认用Protocol Buffers(Protobuf)做接口定义语言和数据序列化,微服务、实时通信场景都很合适。

在.NET Core(.NET 8)上,官方对gRPC提供了原生支持,搭建服务端和客户端非常方便,也能轻松集成到Web API或其他应用中。

下面围绕三个核心环节展开:创建gRPC服务端、创建gRPC客户端、在Web API里集成gRPC。

二、创建 gRPC 服务端

1. 创建 gRPC 项目

用.NET CLI创建gRPC服务端项目,Visual Studio 2022里直接新建项目也行。

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

.NET8中gRPC的使用方法详解

项目模板会自带一个示例服务,方便直接上手。

.NET8中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 _logger;
        public OrderService(ILogger logger)
        {
            _logger = logger;
        }

        /// 
        /// 创建订单
        /// 
        /// 
        /// 
        /// 
        public override Task CreateOrder(CreateRequest request, ServerCallContext context)
        {
            //报存数据库 todo
            return Task.FromResult(new CreateResult
            {
                IsSuccess = true,
                Message = "订单创建成功"
            });
        }

        /// 
        /// 查询订单
        /// 
        /// 
        /// 
        /// 
        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里注册服务:

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. 创建客户端项目

再建一个控制台项目当客户端:

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

2. 添加 gRPC 客户端依赖

需要引入Grpc.Net.ClientGoogle.ProtobufGrpc.Tools

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

把服务端的order.proto复制到客户端的Protos文件夹,然后在.csproj里添加生成C#代码的配置:

.NET8中gRPC的使用方法详解

3. 编写客户端代码

Program.cs里写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();
}

效果如下:

.NET8中gRPC的使用方法详解

如果服务端只用了HTTP(非HTTPS),客户端需要额外设置:

 //使用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();

结果:

.NET8中gRPC的使用方法详解

四、Web API 中加入 gRPC

Web API项目里可以同时提供RESTful API和gRPC服务,两者互不冲突。具体做法如下:

1. 添加 gRPC 服务

Program.cs注册gRPC:

var builder = WebApplication.CreateBuilder(args);

// 添加 gRPC 服务
builder.Services.AddGrpc();

var app = builder.Build();

// 映射 gRPC 服务
app.MapGrpcService();

app.Run();

2. 提供 RESTful API

通过控制器暴露RESTful接口,内部调用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 CreateOrder()
        {
            var response = await _client.CreateOrderAsync(
                new CreateRequest { 
                    OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
                    OrderName = "年货大礼包", 
                    Price = 699
                });
            return Ok(response);
        }
    }
}

3. 配置 gRPC 客户端

Program.cs里注入客户端:

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

效果:

.NET8中gRPC的使用方法详解

总结

在.NET Core里,gRPC提供了一种高性能的通信方式,特别适合微服务和实时交互场景。从创建服务端、客户端,到集成到Web API,整个过程都很顺畅。

关键点总结:

  • .proto文件定义服务接口。
  • 实现gRPC服务端业务逻辑。
  • 客户端通过GrpcChannel调用服务。
  • Web API中可以同时支持RESTful和gRPC,灵活组合。

掌握了这些步骤,就能在.NET Core项目中充分利用gRPC的优势,构建出高效的分布式系统。

本文转载于:https://www.jb51.net/aspnet/337984nrm.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注