如何在 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 像 gRPC 是由 google 开发的一个高性能、通用的开源 RPC 框架,主要面向移动应用开发且基于 HTTP/2 协议标准而设计,同时支持大多数流行的编程语言。 gRPC 基于 HTTP/2 协议传输,而 HTTP/2 相比 HTTP1.x ,有以下优势:…...
3分钟看完-丄-Python自动化测试【项目实战解析】经验分享
目录:导读 引言 自动化测试 背景 测试团队 测试体系发展 测试平台 自动化测试现状 现状一: 现状二: 现状三: 现状四: 现状五: 现状六: 失败的背景 失败的经历 失败总结 引言 内…...
Web漏洞-命令执行和代码执行漏洞
命令执行原理就是指用户通过浏览器或其他辅助程序提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。漏洞成因它所执行的命令会继承WebServer的权限,也就是说可以任意读取、修改、执行Web目录下的…...
Towards Unsupervised Text Classification Leveraging Experts and Word Embeddings
Towards Unsupervised Text Classification Leveraging Experts and Word Embeddings Abstract 该论文提出了一种无监督的方法,使用每个文档中相关单词之间的文本相似度以及每个类别的关键字字典将文档分为几类。所提出的方法通过人类专业知识和语言模型丰富了类别…...
linux进程管理
进程管理 进程是启动的可执行程序的一个指令 1、进程简介 (1)进程的组成部分 已分配内存的地址空间安全属性,包括所有权凭据和特权程序代码的一个或多个执行线程进程状态 (2)程序和进程的区别 程序是一个静态的二进制…...
【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码
大家好,今天和各位分享一下深度强化学习中的近端策略优化算法(proximal policy optimization,PPO),并借助 OpenAI 的 gym 环境完成一个小案例,完整代码可以从我的 GitHub 中获得: https://gith…...
【数据结构】第二站:顺序表
目录 一、线性表 二、顺序表 1.顺序表的概念以及结构 2.顺序表的接口实现 3.顺序表完整代码 三、顺序表的经典题目 1.移除元素 2.删除有序数组中的重复项 3.合并两个有序数组 一、线性表 在了解顺序表前,我们得先了解线性表的概念 线性表(linear…...
嵌入式安防监控项目——实现真实数据的上传
目录 一、相关驱动开发 二、A9主框架 三、脚本及数据上传实验 https://www.yuque.com/uh1h8r/dqrma0/tx0fq08mw1ar1sor?singleDoc# 《常见问题》 上个笔记的相关问题 一、相关驱动开发 /* mpu6050六轴传感器 */ i2c138B0000 { /* #address-cells <1>…...
SAP 生成UUID
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。 UUID-Universally…...
DevOPs介绍,这一篇就足够了
一、什么是DevOps? DevOps是一种将软件开发和IT运维进行整合的文化和运动。它的目标是通过加强软件开发、测试和运维之间的协作和沟通,使整个软件开发和交付过程更加高效、快速、安全和可靠。DevOps涵盖了从计划和设计到开发、测试、交付和部署的全生命…...
libcurl库简介
一、libcurl简介libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。…...
Spark SQL支持DataFrame操作的数据源
DataFrame提供统一接口加载和保存数据源中的数据,包括:结构化数据、Parquet文件、JSON文件、Hive表,以及通过JDBC连接外部数据源。一个DataFrame可以作为普通的RDD操作,也可以通过(registerTempTable)注册成…...
Java【归并排序】算法, 大白话式图文解析(附代码)
文章目录前言一、排序相关概念1, 什么是排序2, 什么是排序的稳定性3, 七大排序分类二、归并排序1, 图文解析2, 代码实现三、性能分析四、七大排序算法总体分析前言 各位读者好, 我是小陈, 这是我的个人主页 小陈还在持续努力学习编程, 努力通过博客输出所学知识 如果本篇对你有…...
【springboot】数据库访问
1、SQL 1、数据源的自动配置-HikariDataSource 1、导入JDBC场景 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency>数据库驱动? 为什么导入JD…...
普通和hive兼容模式下sql的差异
–odps sql –– –author:宋文理 –create time:2023-03-08 15:23:52 –– – 差异分为三块 – 1.运算符的差异 – 2.类型转换的差异 – 3.内建函数的差异 – 以下是运算符的差异: – BITAND(&) – 当输入参数是BIGINT类型的时候&…...
github开源自己代码
接下来,我们需要先下载Git,的网址:https://git-scm.com/downloads,安装时如果没有特殊需求,一直下一步就可以了,安装完成之后,双击打开Git Bash 出现以下界面: 第一步:…...
数据库基础语法
sql(Structured Query Language 结构化查询语言) SQL语法 use DataTableName; 命令用于选择数据库。set names utf8; 命令用于设置使用的字符集。SELECT * FROM Websites; 读取数据表的信息。上面的表包含五条记录(每一条对应一个网站信息&…...
【Java】期末复习知识点总结(4)
适合Java期末的复习~ (Java期末复习知识点总结分为4篇,这里是最后一篇啦)第一篇~https://blog.csdn.net/qq_53869058/article/details/129417537?spm1001.2014.3001.5501第二篇~https://blog.csdn.net/qq_53869058/article/details/1294751…...
IDEA好用插件:MybatisX快速生成接口实体类mapper.xml映射文件
目录 1、在Idea中找到下载插件,Install,重启Idea 2、一个测试java文件,里面有com包 3、在Idea中添加数据库 --------以Oracle数据库为例 4、快速生成entity-service-mapper方法 5、查看生成的代码 6、自动生成(增删查改࿰…...
【JavaEE】初识线程
一、简述进程认识线程之前我们应该去学习一下“进程" 的概念,我们可以把一个运行起来的程序称之为进程,进程的调度,进程的管理是由我们的操作系统来管理的,创建一个进程,操作系统会为每一个进程创建一个 PCB&…...
智慧水务监控系统-智慧水务信息化平台建设
平台概述柳林智慧水务监控系统(智慧水务信息化平台)是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心,以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧运维等产品体系为…...
【Linux】进程优先级前后台理解
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹相关文章推荐:【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习(Ⅰ)浅谈Linux下的shell--BASH【Linux…...
时序预测 | MATLAB实现基于EMD-GRU时间序列预测(EMD分解结合GRU门控循环单元)
时序预测 | MATLAB实现基于EMD-GRU时间序列预测(EMD分解结合GRU门控循环单元) 目录 时序预测 | MATLAB实现基于EMD-GRU时间序列预测(EMD分解结合GRU门控循环单元)效果一览基本描述模型描述程序设计参考资料效果一览...
python 模拟鼠标,键盘点击
信息爆炸 消息轰炸模拟鼠标和键盘敲击import time from pynput.keyboard import Controller as key_col from pynput.mouse import Button,Controller def keyboard_input(insertword):keyboardkey_col()keyboard.type(insertword)def mouth():mouseController()mouse.press(…...
【CSS】盒子边框 ③ ( 设置表格细线边框 | 合并相邻边框 border-collapse: collapse; )
文章目录一、设置表格细线边框1、表格示例2、合并相邻边框3、完整代码示例一、设置表格细线边框 1、表格示例 给定一个 HTML 结构中的表格 , 默认样式如下 : <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" />…...
TensorRT量化工具pytorch_quantization代码解析(一)
量化工具箱pytorch_quantization 通过提供一个方便的 PyTorch 库来补充 TensorRT ,该库有助于生成可优化的 QAT 模型。该工具包提供了一个 API 来自动或手动为 QAT 或 PTQ 准备模型。 API 的核心是 TensorQuantizer 模块,它可以量化、伪量化或收集张量的…...
【Kubernetes】第二十七篇 - 布署前端项(下)
一,前言 上一篇,介绍了前端项目的部署:项目的创建和 jenkins 配置; 本篇,创建 Deployment、Service,完成前端项目的部署; 二,创建 Deployment 创建 Deployment 配置文件ÿ…...
【MFC】两个ListBox控件数据交互
一.控件ID名称 界面如图下所示: 候选数据列表的ID为: 已选数据列表的ID为: 二.数据添加 可以使用以下代码往框中添加数据: ((CListBox *)GetDlgItem(IDC_LIST_TO_CHO))->AddString("测试数据"); 显示效果如下&#…...
sklearn库学习--SelectKBest 、f_regression
目录 一、SelectKBest 介绍、代码使用 介绍: 代码使用: 二、评分函数 【1】f_regression: (1)介绍: (2)F值和相关系数 【2】除了f_regression函数,还有一些适用于…...
蓝桥杯刷题第十三天
第一题:特殊日期问题描述对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 11 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数…...
常德哪里有做网站/网站优化怎么做
规范化齐次坐标的作用:可将图形变换表示为图形点集规范化次坐标矩阵与某一变换矩阵相乘的形式。 平移变换比例变换旋转变换 对称变换 错位变换相对任一参考点的二维几何变换 相对任意方向的二维几何变换...
小公司网站模版/网络营销案例分享
林健锋先生(David)和我因《输赢》相识,虽交往不多,且都是网上交流,但颇感默契。不久前David告诉我,他历时一年辛苦而成的商战小说《速战》已经付梓,不禁期待满满……上周,《速战》送…...
绿色在线网站/服务营销的七个要素
...
宁波最靠谱的网站建设/seo关键词优化经验技巧
本文发布于我的个人网站:https://wintc.top/article/58,转载请注明。 多行文本超过指定行数隐藏超出部分并显示“...查看全部”是一个常遇到的需求,网上也有人实现过类似的功能,不过还是想自己写写看,于是就写了一个Vu…...
郑州网站推广哪家专业/一站式推广平台
1.基本知识: 1.1solr的安装 1.2solr的基本使用 1.3solrj的使用 2.solr 实现全文检索 索引流程:客户端---》solr 服务器(发送post请求,xml文档包含filed,solr实现对索引的维护) 搜索流程:客户端---》solr 服务器(发送get 请求&…...
小程序一般需要多少钱/百度优化教程
vCPU,顾名思义,是虚拟CPU。 创建虚拟机时,需求配置vCPU资源。 因而vCPU是虚拟机的部件。 因而脱离VM,议论vCPU是没有意义的。虚拟化办理体系怎么调度vCPU,取决于体系内的虚拟机数目以及虚拟机配置的vCPU的情况。大致的…...