在.NET Core中使用gRPC构建REST API - DevOps.dev
在本文中,我们将探讨如何在.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:创建项目
-
创建一个新的空的.NET Core WebAPI项目:
dotnet new webapi -n GrpcService -
或者,使用gRPC模板创建项目:
dotnet new grpc -n GrpcService
在项目创建完成后,接下来需要配置数据库模型和连接。
步骤 2:配置数据库模型
-
在项目根目录下创建一个名为
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; } -
创建一个名为
AppDbContext.cs的类,用于配置数据库上下文。 -
在
appsettings.json文件中添加数据库连接字符串:"ConnectionStrings": { "DbConnection": "server=.;database=GrpcMedium;Trusted_Connection=true" } -
在
Program.cs中注册数据库上下文:var conn = builder.Configuration.GetConnectionString("DbConnection"); builder.Services.AddDbContext(db => db.UseSqlServer(conn)); -
使用迁移命令创建数据库:
dotnet ef migrations add InitialCreate dotnet ef database update
步骤 3:实现服务层
-
在项目根目录下创建一个名为
Services的文件夹,并在其中创建一个名为CategoryServices的子文件夹。 -
添加一个接口
ICategoryService.cs,定义如下:public interface ICategoryService { Task AddCategory(Category category); Task EditCategory(Category category); IEnumerable AllCategories(); Category GetCategoryById(string Id); bool DeleteCategoryById(string Id); } -
实现接口,创建
CategoryService.cs类并编写对应的CRUD操作逻辑。 -
在
Program.cs中注册服务:builder.Services.AddScoped();
步骤 4:添加gRPC服务
-
在项目根目录下创建一个名为
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 {} -
在
GrpcService.csproj中添加以下配置以包含.proto文件: -
创建一个类
CategoryGrpcService.cs,继承生成的gRPC基类,并实现服务逻辑。 -
在
Program.cs中注册gRPC服务:builder.Services.AddGrpc().AddJsonTranscoding(); app.MapGrpcService();
步骤 5:添加REST端点
-
安装
Microsoft.AspNetCore.Grpc.JsonTranscoding包:dotnet add package Microsoft.AspNetCore.Grpc.JsonTranscoding -
修改
Category.proto文件,为每个RPC方法添加HTTP选项:rpc AddCategory (CategoryRequest) returns (CategoryResponse) { option (google.api.http) = { post: "/v1/categories" body: "*" }; } -
运行项目并使用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
最新文章
- 探索 DeepSeek API – 聊天补全及更多功能 – SerpApi
- 如何高效使用Nextjs API路由 – NextBuild
- Go-Zero定义API实战:探索API语法规范与最佳实践
- FastAPI-Cache2:一个让接口飞起来的缓存神器
- 避免工作日灾难:11种常见API错误及其解决方案
- 从Google Doodle AI看图像互动API的创新应用
- 如何获取飞书API开放平台访问token分步指南
- 漏洞分析 | xxl-job前台api未授权Hessian2反序列化
- 免费使用Poe AI API实现项目智能化的完整指南
- REST API vs gRPC:传统API和RPC框架的对比
- 使用 Auth0 向 Sinatra API 添加授权
- API Gateway vs Load Balancer:选择适合你的网络流量管理组件