gRPC JSON转码

gRPC JSON 转码允许浏览器应用调用 gRPC 服务,就像它们是使用 JSON 的 RESTful API 一样。

  • 浏览器应用不需要生成 gRPC 客户端或了解 gRPC 的任何信息。
  • 通过使用 HTTP 元数据注释 .proto 文件,可从 gRPC 服务自动创建 RESTful API。
  • 使应用可以同时支持 gRPC 和 JSON Web API,而无需重复为两者生成单独的服务。

OpenAPI与gRPC Server

OpenAPI(以前称为 Swagger)是一个与语言无关的规范,用于描述 API。 gRPC JSON 转码支持从转码 REST ful的 API 生成 OpenAPI。

实现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(); // 配置Swagger
builder.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(); //开启Swagger
app.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 greeting
rpc SayHello (HelloRequest) returns (HelloReply){
option (google.api.http) = {
get: "/v1/greeter/{name}"
};
}; // Sends a greeting
rpc 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 = 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方式请求

在支持http方式的请求的情况下,同时支持grpc请求。

实现Client端

新增控制台项目,添加以下nuget

  <ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.21.9" />
<PackageReference Include="Grpc.Net.Client" Version="2.49.0" />
<PackageReference Include="Microsoft.AspNetCore.Grpc.JsonTranscoding" Version="7.0.0" />
<PackageReference Include="Grpc.Tools" Version="2.50.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

包含与server端相同的proto文件

  <ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>

尝试请求Server

        static async Task Main(string[] args)
{
using var channel = GrpcChannel.ForAddress("https://localhost:7167");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message); var replyPost = await client.SayHelloPostAsync(new HelloRequestPost { Data = new HelloRequestPostData { Name = "111" } });
Console.WriteLine("Greeting: " + replyPost.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}

source code:  https://github.com/cysnet/grpc-json-transcoding

.NET7 gRPC JSON转码+OpenAPI的更多相关文章

  1. 关于.Net 7.0 RC gRPC JSON 转码为 Swagger/OpenAPI文档的注意事项

    大家好,我是失业在家,正在找工作的博主Jerry,找工作之余,看到.Net 7.0 RC2发布了,就想测试下.Net 7.0 RC2 gRPC JSON 转码为 Swagger/OpenAPI文档的特 ...

  2. 修改json源码支持datetime序列化

    修改json源码支持datetime序列化 import json import datetime now = datetime.datetime.today() json.dumps(now) 抛出 ...

  3. Newtonsoft.Json源码中的C#预处理指令

    cs文件中包含以指令: #if !(NET35 || NET20 || PORTABLE40) 记事本打开[Newtonsoft.Json.Net20.csproj]可看到以下代码: <Defi ...

  4. Newtonsoft.Json源码的solution打开之后,无法加载project

    无法加载项目 https://github.com/JamesNK/Newtonsoft.Json C:\repository\GitHub\Other\Newtonsoft.Json\Src\New ...

  5. Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式

    大家好,我是失业在家,正在找工作的博主Jerry,找工作之余,总结和整理以前的项目经验,动手写了个洋葱架构(整洁架构)示例解决方案 OnionArch.其目的是为了更好的实现基于DDD(领域驱动分析) ...

  6. 【译】.NET 7 预览版 1 中的 ASP.NET Core 更新

    原文 | Daniel Roth 翻译 | 郑子铭 .NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一 ...

  7. 我又造了个轮子:GrpcGateway

    我个人对GRPC是比较感兴趣的,最近在玩通过前端调用GRPC.通过前端调用GRPC业界有两种方式:GRPC Web和GRPC JSON转码. GRPC Web 通过JS或者Blazor WASM调用G ...

  8. .NET Conf 2022 &ndash; 11 月 8 日至 10 日

    .NET Conf 2022 下周就正式开启了,时间是美国时间的 11月8日至10日..NET Conf 2022是一个免费的,为期三天的, 虚拟开发人员活动提供多种实时会话,其中包括来自社区和 .N ...

  9. gRPC源码分析2-Server的建立

    gRPC中,Server.Client共享的Class不是很多,所以我们可以单独的分别讲解Server和Client的源码. 通过第一篇,我们知道对于gRPC来说,建立Server是非常简单的,还记得 ...

随机推荐

  1. Docker 搭建 Nexus3 私服 | 基本操作

    1 Docker 安装 Nexus3 1.1 创建目录 在硬盘上创建 Nexus3 的主目录: mkdir -p /Users/yygnb/dockerMe/nexus3 为该目录添加权限: chmo ...

  2. 如何在 Windows 和 Linux 上确定系统使用的是 MBR 分区还是 GPT 分区详细步骤!!!

    在 Windows 上检查系统使用的是 MBR 分区还是 GPT 分区 点击放大镜搜索输入disk 点击打开 进入之后,右键点击你想要检查分区方案的磁盘,在右键菜单里选择属性! 在属性窗口,切换到卷, ...

  3. KingbaseES批量数据加载的实践技巧

    有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入.其中数据源通常是一个或多个大文件,这个过程有时可能非常慢. 造成性能不佳的原因有很多:索引.触发器.外键. ...

  4. KingbaseES where 条件解析顺序

    概述 KingbaseES 对于where 条件的解析严格遵守"从左到右"的原则,因此,对于选择性比较强的条件,进行最先过滤是有利于性能的. 一.KingbaseES 1.条件顺序 ...

  5. ProxySQL监控后端节点

    ProxySQL通过Monitor模块监控后端MySQL Server的read_only值来自动调整节点所属的组.所以,在配置读.写组之前,必须先配置好监控. 首先看下Monitor库中的表: ad ...

  6. Logstash:为 Logstash 日志启动索引生命周期管理

    文章转载自:https://elasticstack.blog.csdn.net/article/details/110816948

  7. Beats:使用 Filebeat 导入 JSON 格式的日志文件

    转载自:https://blog.csdn.net/UbuntuTouch/article/details/108504014 在今天的文章中,我来用另外的一种方式来展示如何导入一个 JSON 格式的 ...

  8. 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

    摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...

  9. 浅谈 Golang 插件机制

    我们知道类似 Java 等半编译半解释型语言编译生成的都是类似中间态的字节码,所以在 Java 里面我们想要实现程序工作的动态扩展,可以通过 Java 的字节码编辑技术([[动态代理#ASM]]/[[ ...

  10. 把两个数据结构相同的数组(数组下有n个对象)合并成一个数组

    数据拼接 有一个数组 let arr1 = [ {name:''lili",age:14}, {name:''小明",age:16}, {name:''张三",age:2 ...