如何在 Apinto 实现 HTTP 与gRPC 的协议转换 (上)

什么是 gRPC
像gRPC是由google开发的一个高性能、通用的开源 RPC 框架,主要面向移动应用开发且基于HTTP/2协议标准而设计,同时支持大多数流行的编程语言。
gRPC基于 HTTP/2 协议传输,而 HTTP/2 相比 HTTP1.x ,有以下优势:
采用二进制格式传输协议,支持多路复用;
支持通过同一个连接发送多个并发的请求,支持流式传输;
服务器可以对客户端的一个请求发送多个响应;
对消息头进行了压缩传输,能够节省消息头占用的网络流量。
gRPC使用Protocol Buffers作为序列化协议。
但同时,gRPC 也有自身的局限性:
1)浏览器支持有限:
当下,不可能直接从浏览器调用 gRPC 服务。gRPC 大量使用 HTTP/2 功能,没有浏览器提供支持 gRPC 客户机的 Web 请求所需的控制级别。例如,浏览器不允许调用者要求使用的 HTTP/2 ,或者提供对底层 HTTP/2 框架的访问。
2)不是人类可读的:
HTTP API 请求以文本形式发送,可以由人读取和创建。默认情况下, gRPC 消息使用 protobuf 编码。虽然 protobuf 的发送和接收效率很高,但它的二进制格式是不可读的。protobuf 需要在 *.proto 文件中指定的消息接口描述才能正确反序列化。需要额外的工具来分析线路上的 Protobuf 有效负载,并手工编写请求。
若需要将内部 gRPC 作为接口开放给外部用户或浏览器调用,则需要有第三方代理解决 HTTP 协议转换成 gRPC 协议的问题。
为此,我们在 Apinto 多协议支持的基础上,发布了 HTTP 转 gRPC 插件:(eolinker.com:apinto:http_to_grpc)
在 Apinto 上 HTTP 转 gRPC 插件
Apinto 通过插件的方式支持 HTTP 协议转换成 gRPC 协议请求,在http_to_grpc 插件中完成了 HTTP 客户端 与 gRPC``Server 通讯时的协议转换及数据编解码工作,其通讯的过程如下:
接下来通过一个完整的示例向大家演示怎样构建一个 HTTP请求,并通过 Apinto 进行 HTTP协议 转换成 gRPC协议请求。在以下的示例中,我们会将 Go 作为 gRPC``Server 服务端处理程序,使用 Eolink 作为 HTTP 客户端,发起 HTTP 请求。
以下示例可以在 Apinto 仓库中获取。
配置 Protocol Buffer
1. 创建示例文件 msg.proto

该文件定义了示例消息类型,我们在这里定义了一个 HelloRequest 和 HelloResponse 的 message。
2. 创建示例文件 service.proto

该文件定义了服务 Hello,引入了第一步创建的文件 msg.proto,定义了四个方法,包含了一元 RPC、客户端流、服务端流、双向流四种 gRPC 通信模式。
配置服务端程序
1. 创建自动生成 gRPC 文件脚本(grpc.sh)

该脚本将生成 gRPC 客户端/服务端调用相关代码,并将其存储到 demo_service目录下。
执行 grpc.sh,生成服务端 Go 原始消息和服务/客户端存根。

2. 实现服务端处理程序接口

上述代码重新定义了 Hello 方法:
将 HelloRequest 中的 name 字段通过 HelloResponse 的 msg 字段封装成hello,%s 的结果返回
将请求的 Header 作为 gRPC 响应的 Trailer 头部返回
3. 定义 gRPC 服务端入口文件

在此处,gRPC 服务端开启了 gRPC 反射,配置 Apinto 网关时,可选择绑定具体的 Protobuf 资源,也可以直接启用反射,动态获取 gRPC 服务端的 Protobuf 信息。
4. 编译 gRPC 服务器程序

上文介绍了如何构造 gRPC 示例服务器,下文将使用该示例服务器,结合 Apinto-Dashboard 来演示如何将 HTTP 协议转成 gRPC 。
更多使用方式可到我们的 Github 进一步了解:https://github.com/eolinker/apinto
如何在 Apinto 实现 HTTP 与gRPC 的协议转换 (上)的更多相关文章
- GRPC在NET上的实践(记录篇)
GRPC是什么? GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffer ...
- 一步一步学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- GRPC在NET上的应用
GRPC是什么? GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffer ...
- 关于如何在Android、Java等非微软平台上建立高信任的SharePoint应用程序
关于如何在非微软平台上建立高信任的SharePoint应用程序 原文 :http://blogs.msdn.com/b/kaevans/archive/2014/07/14/high-trust-sh ...
- 如何在RedHat6(7) or CentOS6(7)上制作无依赖的PostgreSQL数据库的RPM包
本文解决了源代码安装都需要先检查系统上是否安装了应用程序所依赖的软件包的烦恼,对源代码开发者也有一定的帮助.可以在该基础上进行适当的修改,以满足自己的要求. RedHat5 or CentOS5已经提 ...
- 如何在Dynamics CRM 2011 的窗体表单上加载报表
1.代码 function onloadReport() { if (crmForm.FormType != 1 && crmForm.FormType != 5) { $(" ...
- 如何在Idea中使用Git将项目代码上传到码云
参考链接:https://blog.csdn.net/zzybbh/article/details/88172140
- 如何在SecureCRT中上传文件到linux服务器上
1.使用yum安装运行命令sudo yum install lrzsz(默认使没有安装运行命令的) 2.上传命令rz 下载命令sz
- 如何在FL Studio中使用自动剪辑(上)
一.什么是FL Studio Automation FL Studio automation可以通过许多不同的方法实现.一种方法是使用自动化剪辑(automation clip).自动化剪辑(或包络线 ...
- [干货]kubenertes ingress负载grpc
目录 概述 搭建 生成公私钥 创建secret 创建ingress 访问 概述 一般情况下,我们的系统对外暴露HTTP/HTTPS的接口,内部使用rpc(GRPC)通讯,这时GRPC在服务之间通过se ...
随机推荐
- IDEA打包普通java项目并用java命令运行
IDEA下打包为jar包,普通java项目(非web项目) 效果是将第三方jar包放到一个文件夹中(如lib),这样看起来清晰一些.如下图这种: 1.项目结构. 1.关键:modules 在<o ...
- kafka常用命令(zookeeper与bootstrap-server)
在 0.9.0.0 之后的 Kafka,出现了几个新变动,一个是在 Server 端增加了 GroupCoordinator 这个角色,另一个较大的变动是将 topic 的 offset 信息由之前存 ...
- Spring的隔离级别,Spring事务传播属性,Spring事务与数据库事务之间的联系
一.Spring五大事务隔离级别 Spring事务隔离级别比数据库事务隔离级别多一个default在进行配置的时候,如果数据库和spring代码中的隔离级别不同,那么以spring的配置为主.1) D ...
- 第08组Beta冲刺(2/4)
队名 八组评分了吗 组长博客链接(2分) 组员1李昕晖(组长) 过去两天完成了哪些任务 文字/口头描述 12月9号了解各个小组的进度与难以攻破的地方,晚上安排开会,安排新的冲刺任务. 重新分配小组及个 ...
- 不可错过的JS代码优化技巧(持续更新)
1. 带有多个条件的 if 语句 把多个值放在一个数组中,然后调用数组的 includes 方法. //longhand if (x === 'abc' || x === 'def' || x === ...
- Debug --> CICflowmeter配置链接
先存一下,今天晚上尝试. https://blog.csdn.net/weixin_52111404/article/details/127908558
- GIMP选择,GIMP画布大小,GIMP图层
基本概念 1. 画布 2. 图层 你只能操作一个图层--就是你选中的.就看起来所有的图像都在一起,但是不同的图层中的图像是不同,不能操作没有选中的图层. 对于选择操作,要注意你选中的图层. 要获取图像 ...
- spring中.xml配置文件头部
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- LeetCode刷题感想之滑动窗口
发现滑动窗口也是一种经典解题思路,这一篇简单聊一下滑动窗口. 通常在碰到求XX子数组,子字符串,连续XX等题眼,可以考试用滑动窗口的思路来解决问题. 窗口的类型有几种: 1. 固定长度的窗口. 2. ...
- ROS2踩坑记录
在Windows10的WSL2中的Ubuntu22.04子系统中安装ros2 humble版本. 官方文档http://docs.ros.org/en/humble/Installation/Ubun ...