让 gRPC 提供 REST 服务

Intro

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。

gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

gRPC 是一个很流行的现代化 RPC 框架,它以 HTTP/2 为通信协议基础,gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构。

尽管 gRPC 有很多应用,但是更为常用的还是基于 HTTP/1.1 的 REST 服务,应用更广,那么能否让 gRPC 同时提供 REST 服务呢?答案是肯定的,现在有一个实验性的项目(gRPC HTTP API )正在进行,如果觉得这个项目不错,欢迎在 Github 上进行反馈,将你的意见反馈给 gRPC 团队或者去点个赞以提升项目的优先级 https://github.com/grpc/grpc-dotnet/issues/167

Sample

Proto

首先我们来看一下 proto file:

syntax = "proto3";//import "google/api/annotations.proto";package greet.v1;service Greeter {  rpc SayHello (HelloRequest) returns (HelloReply) {    option (google.api.http) = {      get: "/v1/greeter/{name}"    };  }  rpc SayHelloFrom (HelloRequestFrom) returns (HelloReply) {    option (google.api.http) = {      post: "/v1/greeter"      body: "*"    };  }}message HelloRequest {  string name = 1;}message HelloRequestFrom {  string name = 1;  string from = 2;}message HelloReply {  string message = 1;}

和之前相比的变化就是引入了 google/api/annotations.proto,然后在声明方法的地方声明了 http 请求的方式和路由

Project update

除了 proto file 变化之外,我们还需要引用 Microsoft.AspNetCore.Grpc.HttpApi 这个包,为了更好的和 swagger 整合,也可以引用 Microsoft.AspNetCore.Grpc.Swagger 这是一个 swagger 的扩展

Startup 中注册服务:

services.AddGrpcHttpApi();

如果引用了 swagger,也要注册相应的服务:

services.AddSwaggerGen(c =>    {        c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });    })    .AddGrpcSwagger();

这样就可以了

Client Sample

客户端调用示例如下:

using var client = new HttpClient(){    DefaultRequestVersion = HttpVersion.Version20,    DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher,};await InvokeHelper.TryInvokeAsync(async () =>{    var responseText = await client.GetStringAsync("https://localhost:5001/v1/greeter/test");    Console.WriteLine($"Response from https endpoint: {responseText}");});await InvokeHelper.TryInvokeAsync(async () =>{    var responseText = await client.GetStringAsync("http://localhost:5000/v1/greeter/test");    Console.WriteLine($"Response from http endpoint: {responseText}");});//await InvokeHelper.TryInvokeAsync(async () =>{    var responseText = await client.GetStringAsync("http://localhost:5000/v1/todo");    Console.WriteLine($"Response from todo endpoint: {responseText}");});

客户端输出示例:

服务器端输出示例:

完整的测试代码可以在 Github 获取 https://github.com/WeihanLi/SamplesInPractice/tree/master/GrpcSample

Known Issues

JSON Serialization

现在的 JSON 序列化是基于Google.Protobuf,这个实现有两个问题:

  • 它是线程阻塞的(非 async

  • 没有做过性能优化

Http proto file

需要在最终用户的源代码中添加 google / api / annotations.protogoogle / api / http.proto,以便Protobuf编译器可以将它们与用户的proto文件一起加载。 如果以某种方式用户不必关心这些文件,那将是更好的开发人员体验。

More

这个项目使用下来感觉还是挺方便的,相当于在 proto 文件中加了 http 请求相关的注解,就可以自动提供 REST 服务,这样对于 gRPC 和 REST 服务的整合就很方便了

唯一让我觉得有一些美中不足的地方就是 http 只支持 Http2,如果 http 协议要支持 http1.1 的话,http请求 必须要 https,如果是 http2 就可以比较好的支持 http,但是大部分的客户端都是 httpClient 都是直接请求的,大多没有设置过 Http Version,要手动设置 http2 才可以

如果觉得还不错,记得去 GitHub 上反馈哈 https://github.com/grpc/grpc-dotnet/issues/167

References

(0)

相关推荐

  • 如何构建区块链REST服务器 | 区块链研究实验室

    原创 链三丰 区块链研究实验室 昨天 当前,区块链正在风靡一时,区块链真正的魔力是通过区块链应用于不同行业和领域而实现的众多可能性. Hyperledger Foundation一直在创建一个属于自己 ...

  • gRPC搭建使用方式

    gRpc 官网  链接 新建服务端项目 在服务端内先编写一个 .proto 文件 greet.proto syntax = "proto3";service Greeter { r ...

  • 如何在.NET Core中为gRPC服务设计消息文件(Proto)

    今天 以下文章来源于DotNET技术圈 ,作者Peter Vogel 如何在.NET Core中为gRPC服务设计消息 使用协议缓冲区规范定义gRPC服务非常容易,但从需求转换为.NET Core,然 ...

  • Python配置gRPC环境

    Python配置gRPC环境,gRPC是一款高性能.开源的RPC框架,产自Google,基于ProtoBuf序列化协议进行开发,支持多种语言(Golang.Python.Java等),本篇文章好程序员 ...

  • 养生店提供色情服务?女子多次举报敲诈勒索获刑8个月

    新民晚报讯 (通讯员 王晓丹 记者 江跃中)2020年11月11日晚,某养生店总店的经理吕某正在店里工作,突然几名民警到店,称有人实名举报该店提供色情服务,要求清场检查.此后连续4天,该养生店的其余3 ...

  • 销售外购机器设备的同时提供安装服务的四种模式选择

    一般纳税人销售外购机器设备的同时提供安装服务,根据国家税务总局公告2018年第42号,可以有四种模式的选择.分别是以销售货物为主的混合销售.以提供安装服务为主的混合销售.安装服务选择一般计税的货物和劳 ...

  • 王晴:后勤成学校核心竞争力之一,推进社会化改革,引入优质企业提供专业化服务

    2021年5月9日,"智育美好 宇同行"浙大新宇品牌焕新暨校园服务生态发布会在上海盛大举行,在圆桌论坛上,对标"十四五"服务业高质量发展需求,高校园区服务企业如 ...

  • 探讨:男子购买高仿性爱娃娃,为他人提供有偿服务,是否涉嫌犯罪?

    [案例] 黄某从南方某厂家购买了六个高仿真性爱娃娃,在滨海市某城乡结合部租了一处即将拆迁的平房,装修出六个小单间,布置温馨,每一房间放置一个娃娃,并配备床等必要生活用品.以每小时收费五十元的标准为他人 ...

  • 【实用】一文了解跨区提供建筑服务增值税预缴

    建筑企业跨区提供建筑服务如何预缴税款?今天,申税小微就和大家一起来学习! 纳税人跨县(市.区)提供建筑服务,应向建筑服务发生地主管税务机关预缴税款,向机构所在地主管税务机关申报纳税. (一)税款计算方 ...

  • 注意了!注意了!微信将不再提供这项服务

    近期,收到大量用户投诉,在小程序使用过程中,正常使用流程被阻断.被引导跳转至 app 情况,此类情况严重影响了小程序用户体验:并且,相关功能设计容易被用户认为小程序功能支持不完善,实际是开发者滥用接口 ...

  • 后天起,微信将不再提供这项服务

    近期,收到大量用户投诉,在小程序使用过程中,正常使用流程被阻断.被引导跳转至app情况,此类情况严重影响了小程序用户体验:并且,相关功能设计容易被用户认为小程序功能支持不完善,实际是开发者滥用接口能力 ...

  • 今天起,缅甸仰光一私立银行,将为特殊人群提供便捷服务

    近期以来,受银行提现限制的影响,国内各地私立银行.ATM机前排满了取款的民众.考虑到高龄的老人.孕妇.僧人及残疾人等特殊群体,CB银行自今天(5月18日)开始,为以上群体提供人性化服务,让他们无需排队 ...

  • 有彩蛋:提供建筑服务这事说清楚!

    [思考彩蛋]建筑服务项目计税方法测算:是不是只要采用一般计税方法测算税负低于3%,就采用一般计税方法?(不是哦,您觉得?) 一.一般纳税人 1.一般纳税人以清包工方式提供的建筑服务,可以选择适用简易计 ...