gRPC JSON转码gRPC JSON 转码允许浏览器应用调用 gRPC 服务,就像它们是使用 JSON 的 RESTful API 一样 。
- 浏览器应用不需要生成 gRPC 客户端或了解 gRPC 的任何信息 。
- 通过使用 HTTP 元数据注释 .proto 文件,可从 gRPC 服务自动创建 RESTful API 。
- 使应用可以同时支持 gRPC 和 JSON Web API,而无需重复为两者生成单独的服务 。
实现Server端通过VS新增GRPC Server,新增nuget包
<ItemGroup><PackageReference Include="Grpc.AspNetCore" Version="2.49.0" /><PackageReference Include="Microsoft.AspNetCore.Grpc.JsonTranscoding" Version="7.0.0" /><PackageReference Include="Microsoft.AspNetCore.Grpc.Swagger" Version="0.3.0" /></ItemGroup>为api生成用于OpenAPI的注释XML文件,在Server.csproj文件中新增以下配置
<GenerateDocumentationFile>true</GenerateDocumentationFile>Server的Program.cs中,开启JSON转码与Swagger
var builder = WebApplication.CreateBuilder(args);// 开启JSON转码builder.Services.AddGrpc().AddJsonTranscoding();// 配置Swaggerbuilder.Services.AddGrpcSwagger();builder.Services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo { Title = "gRPC transcoding", Version = "v1" });var filePath = Path.Combine(System.AppContext.BaseDirectory, "GrpcService4.xml");c.IncludeXmlComments(filePath);c.IncludeGrpcXmlComments(filePath, includeControllerXmlComments: true);});var app = builder.Build();//开启Swaggerapp.UseSwagger();app.UseSwaggerUI(c =>{c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");});app.MapGrpcService<GreeterService>();app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");app.Run();下载GRPC JSON转码依赖的proto文件
https://github.com/dotnet/aspnetcore/blob/main/src/Grpc/JsonTranscoding/test/testassets/Sandbox/google/api/http.proto
https://github.com/dotnet/aspnetcore/blob/main/src/Grpc/JsonTranscoding/test/testassets/Sandbox/google/api/annotations.proto
并将文件放到项目的google/api/文件夹中 。
修改greet.proto文件,通过option开启http选项,以一个get方法和一个post方法举例
syntax = "proto3";import "google/api/annotations.proto";option csharp_namespace = "GrpcService4";package greet;// The greeting service definition.service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply){option (google.api.http) = {get: "/v1/greeter/{name}"};};// Sends a greetingrpc SayHelloPost (HelloRequestPost) returns (HelloReply){option (google.api.http) = {post: "/v1/greeter/post",body:"data"};};}// The request message containing the user's name.message HelloRequest {string name = 1;}// The request message containing the user's name.message HelloRequestPost {HelloRequestPostData data = https://www.huyubaike.com/biancheng/1;}message HelloRequestPostData{string name = 1;string gender = 2;}// The response message containing the greetings.message HelloReply {string message = 1;}然后实现Server
using Grpc.Core;using GrpcService4;namespace GrpcService4.Services{public class GreeterService : Greeter.GreeterBase{private readonly ILogger<GreeterService> _logger;public GreeterService(ILogger<GreeterService> logger){_logger = logger;}public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context){return Task.FromResult(new HelloReply{Message = "Hello " + request.Name});}public override Task<HelloReply> SayHelloPost(HelloRequestPost request, ServerCallContext context){return Task.FromResult(new HelloReply{Message = "Hello " + request.Data.Name});}}}至此server的json转码开启完成,运行服务,访问swagger,即可尝试http方式请求
经验总结扩展阅读
- 试试将.NET7编译为WASM并在Docker上运行
- .net 温故知新:【8】.NET 中的配置从xml转向json
- JMETER与它的组件们
- apijson 初探
- .NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json
- Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式
- 是什么让.NET7的Min和Max方法性能暴增了45倍?
- .NET性能系列文章一:.NET7的性能改进
- Springboot JSON 转换:Jackson篇
- 2022年实时最新省市区县乡镇街道geojson行政边界数据获取方法