首页 > 其他分享 >如何在 Apinto 实现 HTTP 与gRPC 的协议转换 (上)

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

时间:2023-03-16 16:45:17浏览次数:47  
标签:协议 Apinto HTTP 示例 gRPC 服务端


什么是 gRPC

gRPC是由google开发的一个高性能、通用的开源 RPC 框架,主要面向移动应用开发且基于HTTP/2协议标准而设计,同时支持大多数流行的编程语言。

gRPC基于 HTTP/2 协议传输,而 HTTP/2 相比 HTTP1.x有以下优势:

  1. 采用二进制格式传输协议,支持多路复用;

  2. 支持通过同一个连接发送多个并发的请求,支持流式传输;

  3. 服务器可以对客户端的一个请求发送多个响应;

  4. 对消息头进行了压缩传输,能够节省消息头占用的网络流量。
    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 多协议支持的基础上,发布了 HTTPgRPC 插件:(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

该文件定义了示例消息类型,我们在这里定义了一个 HelloRequestHelloResponse 的 message。

2. 创建示例文件 service.proto

该文件定义了服务 Hello,引入了第一步创建的文件 msg.proto,定义了四个方法,包含了一元 RPC、客户端流、服务端流、双向流四种 gRPC 通信模式。


配置服务端程序

1. 创建自动生成 gRPC 文件脚本(grpc.sh)

该脚本将生成 gRPC 客户端/服务端调用相关代码,并将其存储到 demo_service目录下。

执行 grpc.sh,生成服务端 Go 原始消息和服务/客户端存根。


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

上述代码重新定义了 Hello 方法:

HelloRequest 中的 name 字段通过 HelloResponsemsg 字段封装成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,服务端
From: https://www.cnblogs.com/apibest/p/17223154.html

相关文章

  • 爬虫 相关 requests模块介绍、requests发送get请求、requests携带参数、url编码解码、
    爬虫介绍爬虫是什么爬虫就是程序---》从互联网中,各个网站上,爬取数据[能浏览的页面才能爬],做数据清洗,入库爬虫的本质模拟方式http请求,获取数据---》入库......
  • SSL端口是什么?HTTPS的配置指南
    安全套接字层(SSL)是负责互联网连接的数据身份验证和加密的技术。它加密在两个系统之间(通常在服务器和客户端之间)之间通过互联网发送的数据,使其保持私密。随着在线隐私的重要......
  • HTTP协议和web静态服务器
    一、HTTP协议1、HTTP协议的定义网络协议网络协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。HTTP协议HTTP协议(超文本传输协......
  • 为什么市面上大多数是共享HTTP代理池
    众所周知,独享HTTP代理池是一个人使用的HTTP代理池,共享HTTP代理池是很多人使用的HTTP代理池。很多人都想使用独享HTTP代理池,但市面上大多数是共享HTTP代理池,很少有独享HTTP......
  • 为什么说HTTP代理可以提高爬虫工作效率
    在日常程序员的网络工作生活中,经常需要使用HTTP代理,在很多行业领域里,HTTP代理是工作中必不可少的一部分。很多人都使用过HTTP代理,它的速度比公司网络可能会慢一些,但大家......
  • 动态HTTP代理与静态相比有哪些优势
    HTTP代理可以分为动态HTTP代理和静态HTTP代理两种,市面上大多数的HTTP代理套餐都是动态HTTP代理,那么动态HTTP代理有哪些优势呢?动态HTTP代理的有效期相对于静态HTTP代......
  • nginx 配置 https 时找不到 pem 证书问题
    问题:在使用nginxdocker时的挂载卷为-v/root/ssl/letsencrypt/live/xxxxxxx:/etc/nginx/cert然后再nginx的default.conf中的证书位置为/etc/nginx/cert/fullchain.......
  • HTTP 请求库:httpx
     httpx,它是一个HTTP请求库。说到发送HTTP请求,我们首先想到的应该是requests,但requests是一个同步库,目前只能同步发请求。而httpx不仅可以同步发请求,还可以异步......
  • 【python爬虫】 request模块介绍 http协议版本区别 双token认证 携带cookie的两种方
    目录上节回顾今日内容1爬虫介绍2request模块介绍3request发送get请求4request携带参数5url编码解码6携带请求头http协议版本之间的区别7发送post请求,携带数据对于......
  • Shifu高级功能:命令行中间件之HTTP 到 SSH 的中间件
    介绍为了使Shifu可以整合开发者的驱动,我们编写了一个简单的HTTP到SSH的中间件来供开发者使用设计这个HTTP到SSH的中间件设计如下:从中间件利用容器提供的公钥建......