在.NET Core中使用gRPC构建REST API - DevOps.dev

作者:API传播员 · 2025-12-04 · 阅读时间:5分钟

在本文中,我们将探讨如何在.NET Core中使用gRPC构建REST API,并了解其如何替代传统的REST API。我们将使用一些关键的工具和包,其中包括JsonTranscoding,以实现gRPC服务并创建基于HTTP的REST API端点


什么是gRPC?

根据gRPC官网的定义,gRPC是一个现代化的开源高性能远程过程调用(RPC)框架,能够在任何环境中运行。它支持可插拔的负载平衡、跟踪、健康检查和身份验证功能,可以高效地连接数据中心内部或数据中心之间的服务。此外,它还适用于分布式计算的最后一公里,将设备、移动应用程序和浏览器连接到后端服务。

在gRPC的实现中,使用扩展名为.proto的文件来定义服务的请求和响应结构。通过这些文件,可以定义服务的接口及其交互方式。


什么是JsonTranscoding?

JsonTranscoding是ASP.NET Core的一个扩展,用于为gRPC服务创建RESTful JSON API。通过配置,JsonTranscoding允许开发者使用熟悉的HTTP概念(如HTTP动词、URL参数绑定和JSON请求/响应)来调用gRPC服务。值得注意的是,使用JsonTranscoding后,HTTP/2和传统的REST HTTP请求都可以被支持。


实现步骤

步骤 1:创建项目

  1. 创建一个新的空的.NET Core WebAPI项目:

    dotnet new webapi -n GrpcService
  2. 或者,使用gRPC模板创建项目:

    dotnet new grpc -n GrpcService

在项目创建完成后,接下来需要配置数据库模型和连接。

步骤 2:配置数据库模型

  1. 在项目根目录下创建一个名为Models的文件夹,并添加一个名为Category.cs的类,定义如下:

    public class Category
    {
       public string Id { get; set; } = Guid.NewGuid().ToString();
       public string Name { get; set; }
       public bool Enable { get; set; } = true;
       public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
    }
  2. 创建一个名为AppDbContext.cs的类,用于配置数据库上下文。

  3. appsettings.json文件中添加数据库连接字符串:

    "ConnectionStrings": {
       "DbConnection": "server=.;database=GrpcMedium;Trusted_Connection=true"
    }
  4. Program.cs中注册数据库上下文:

    var conn = builder.Configuration.GetConnectionString("DbConnection");
    builder.Services.AddDbContext(db => db.UseSqlServer(conn));
  5. 使用迁移命令创建数据库:

    dotnet ef migrations add InitialCreate
    dotnet ef database update

步骤 3:实现服务层

  1. 在项目根目录下创建一个名为Services的文件夹,并在其中创建一个名为CategoryServices的子文件夹。

  2. 添加一个接口ICategoryService.cs,定义如下:

    public interface ICategoryService
    {
       Task AddCategory(Category category);
       Task EditCategory(Category category);
       IEnumerable AllCategories();
       Category GetCategoryById(string Id);
       bool DeleteCategoryById(string Id);
    }
  3. 实现接口,创建CategoryService.cs类并编写对应的CRUD操作逻辑。

  4. Program.cs中注册服务:

    builder.Services.AddScoped();

步骤 4:添加gRPC服务

  1. 在项目根目录下创建一个名为Protos的文件夹,并添加一个名为Category.proto的文件,定义如下:

    syntax = "proto3";
    
    service CategoryService {
       rpc AddCategory (CategoryRequest) returns (CategoryResponse);
       rpc EditCategory (CategoryRequest) returns (CategoryResponse);
       rpc GetAllCategories (Empty) returns (CategoryListResponse);
       rpc GetCategoryById (CategoryIdRequest) returns (CategoryResponse);
    }
    
    message CategoryRequest {
       string id = 1;
       string name = 2;
       bool enable = 3;
    }
    
    message CategoryResponse {
       string id = 1;
       string name = 2;
       bool enable = 3;
       string createdAt = 4;
    }
    
    message CategoryIdRequest {
       string id = 1;
    }
    
    message CategoryListResponse {
       repeated CategoryResponse categories = 1;
    }
    
    message Empty {}
  2. GrpcService.csproj中添加以下配置以包含.proto文件:

    
       
    
  3. 创建一个类CategoryGrpcService.cs,继承生成的gRPC基类,并实现服务逻辑。

  4. Program.cs中注册gRPC服务:

    builder.Services.AddGrpc().AddJsonTranscoding();
    app.MapGrpcService();

步骤 5:添加REST端点

  1. 安装Microsoft.AspNetCore.Grpc.JsonTranscoding包:

    dotnet add package Microsoft.AspNetCore.Grpc.JsonTranscoding
  2. 修改Category.proto文件,为每个RPC方法添加HTTP选项:

    rpc AddCategory (CategoryRequest) returns (CategoryResponse) {
       option (google.api.http) = {
           post: "/v1/categories"
           body: "*"
       };
    }
  3. 运行项目并使用Postman测试gRPC和REST API。


总结

通过本文的步骤,我们成功在.NET Core中实现了一个基于gRPC的服务,并通过JsonTranscoding扩展实现了RESTful API。gRPC的高性能和灵活性使其成为替代传统REST API的理想选择,同时JsonTranscoding的支持让开发者能够无缝集成HTTP请求,兼顾了现代应用的多样化需求。

原文链接: https://blog.devops.dev/make-rest-api-using-grpc-in-the-net-core-f7506daa86a0