grpc与http2的关系
grpc与http2的关系
grpc client 发送包到原生的http2 server
client收到报错:
panic: rpc error: code = 9 desc = transport: received the unexpected content-type "text/html; charset=UTF-8"
server端输出:
输出正常,包括了http2的所有信息,默认情况下响应了404。
[id=1] [ 3.994] send SETTINGS frame <length=6, flags=0x00, stream_id=0>
(niv=1)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[id=1] [ 3.994] recv SETTINGS frame <length=0, flags=0x00, stream_id=0>
(niv=0)
[id=1] [ 3.994] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
(window_size_increment=983025)
[id=1] [ 3.995] recv (stream_id=1) :method: POST
[id=1] [ 3.995] recv (stream_id=1) :scheme: http
[id=1] [ 3.995] recv (stream_id=1) :path: /flyrun.FlyRun/Run
[id=1] [ 3.995] recv (stream_id=1) :authority: 127.0.0.1
[id=1] [ 3.995] recv (stream_id=1) content-type: application/grpc
[id=1] [ 3.995] recv (stream_id=1) user-agent: grpc-go/1.0
[id=1] [ 3.995] recv (stream_id=1) te: trailers
[id=1] [ 3.995] recv HEADERS frame <length=62, flags=0x04, stream_id=1>
; END_HEADERS
(padlen=0)
; Open new stream
[id=1] [ 3.995] recv DATA frame <length=52, flags=0x01, stream_id=1>
; END_STREAM
[id=1] [ 3.995] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[id=1] [ 3.995] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[id=1] [ 3.995] send HEADERS frame <length=69, flags=0x04, stream_id=1>
; END_HEADERS
(padlen=0)
; First response header
:status: 404
server: nghttpd nghttp2/1.19.0
date: Fri, 10 Feb 2017 07:17:14 GMT
content-type: text/html; charset=UTF-8
content-length: 147
[id=1] [ 3.995] send DATA frame <length=147, flags=0x01, stream_id=1>
; END_STREAM
[id=1] [ 3.995] stream_id=1 closed
[id=1] [ 4.001] closed
总结:
原生http2协议server端能够完全解析grpc客户端发送的请求,获取任意请求信息。 原生http2协议server默认响应不符合grpc客户端标准。 从grpc客户端的响应来看,应该是content-type不对。
grpc客户端自定义的固定头信息: content-type: application/grpc user-agent: grpc-go/1.0 method: POST
也就是说,grpc规定了一些固定的特定的头信息的值,这是与原生http2协议不一样的。
http2 client 发送包到 grpc server
grpc server收到的信息:
2017/02/10 15:46:58 transport: http2Server.HandleStreams found unhandled frame type [FrameHeader PRIORITY stream=3 len=5].
2017/02/10 15:46:58 transport: http2Server.HandleStreams found unhandled frame type [FrameHeader PRIORITY stream=5 len=5].
2017/02/10 15:46:58 transport: http2Server.HandleStreams found unhandled frame type [FrameHeader PRIORITY stream=7 len=5].
2017/02/10 15:46:58 transport: http2Server.HandleStreams found unhandled frame type [FrameHeader PRIORITY stream=9 len=5].
2017/02/10 15:46:58 transport: http2Server.HandleStreams found unhandled frame type [FrameHeader PRIORITY stream=11 len=5].
原生 http2 发送与接收的信息:
nghttp -v http://127.0.0.1:5000/abc/efg/hehe [15/412]
[ 0.000] Connected
[ 0.000] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[ 0.000] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
(dep_stream_id=0, weight=201, exclusive=0)
[ 0.000] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
(dep_stream_id=0, weight=101, exclusive=0)
[ 0.000] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
(dep_stream_id=0, weight=1, exclusive=0)
[ 0.000] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
(dep_stream_id=7, weight=1, exclusive=0)
[ 0.000] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
(dep_stream_id=3, weight=1, exclusive=0)
[ 0.000] send HEADERS frame <length=49, flags=0x25, stream_id=13>
; END_STREAM | END_HEADERS | PRIORITY
(padlen=0, dep_stream_id=11, weight=16, exclusive=0)
; Open new stream
:method: GET
:path: /abc/efg/hehe
:scheme: http
:authority: 127.0.0.1:5000
accept: */*
accept-encoding: gzip, deflate
user-agent: nghttp2/1.19.0
[ 0.000] recv SETTINGS frame <length=0, flags=0x00, stream_id=0>
(niv=0)
[ 0.000] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
(window_size_increment=983025)
[ 0.000] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[ 0.000] recv (stream_id=13) :status: 200
[ 0.000] recv (stream_id=13) content-type: application/grpc
[ 0.000] recv (stream_id=13) grpc-status: 12
[ 0.000] recv (stream_id=13) grpc-message: unknown service abc/efg
[ 0.000] recv HEADERS frame <length=56, flags=0x05, stream_id=13>
; END_STREAM | END_HEADERS
(padlen=0)
; First response header
[ 0.000] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[ 0.000] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
(last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[])
grpc服务端自定义的固定头信息: content-type: application/grpc grpc-status: 12 grpc-message: unknown service abc/efg
小结:
所以,默认的原生http2客户端与grpc服务端只能够实现通信,但也不能够实现完整正确的响应解析。
总结
grpc与原生http2能够实现协议通信,但在通信包的解释上有更进一步的特殊处理,从而会导致并不能直接与原生http2协议愉快通信。
比如解释content-type不能识别时,导致的连接异常主断开,无法继续后续的请求与响应。
nghttp 包 帮助调试
启动原生http2/h2c server端:
nghttpd 5003 --no-tls
发送原生http2请求:
nghttp -v http://127.0.0.1:5000/abc/efg/hehe
如何使用原生http2服务正确地接收并响应grpc请求
了解这个问题,以便在可能时候实现基于原生http2的grpc反向代理。
grpc与http2的关系的更多相关文章
- gRPC的通讯过程
在 HTTP2 协议正式开始工作前, 如果已经知道服务器是 HTTP2 的服务器, 通讯流程如下: 客户端必须首先发送一个连接序言,其逻辑结构: PRI * HTTP/2.0\r\n\r\nSM\r\ ...
- gRPC官方文档(通讯协议)
文章来自gRPC 官方文档中文版 HTTP2 协议上的 gRPC 本文档作为 gRPC 在 HTTP2 草案17框架上的实现的详细描述,假设你已经熟悉 HTTP2 的规范.产品规则采用的是ABNF 语 ...
- 尝试在iOS上使用gRPC
简介 gRPC,google的远程过程调用框架,传输协议使用 HTTP2, 序列化协议使用 protobuf.gRPC 使用 HTTP2 传输协议传输 protobuf 序列化的二进制数据,有极高的效 ...
- gRPC应用C++
1. gRPC简述 RPC,远程方法调用,就是像调用本地方法一样调用远程方法. gRPC是Google实现的一种RPC框架,基于HTTP/2标准设计,带来诸如双向流.流控.头部压缩.单 TCP 连接 ...
- 微服务通信方式——gRPC
微服务设计的原则是单一职责.轻量级通信.服务粒度适当,而说到服务通信,我们熟知的有MQ通信,还有REST.Dubbo和Thrift等,这次我来说说gRPC, 谷歌开发的一种数据交换格式,说不定哪天就需 ...
- grpc基础讲解和golang实现grpc通信小案例
grpc简介 gRPC由google开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用 g ...
- ASP.NET Core 6框架揭秘实例演示[02]:基于路由、MVC和gRPC的应用开发
ASP.NET Core可以视为一种底层框架,它为我们构建出了基于管道的请求处理模型,这个管道由一个服务器和多个中间件构成,而与路由相关的EndpointRoutingMiddleware和Endpo ...
- 关于Go语言的底层,你想知道的都在这里!
目录 1. GoLang语言 1.1 Slice 1.2 Map 1.3 Channel 1.4 Goroutine 1.5 GMP调度 1.6 垃圾回收机制 1.7 其他知识点 2. Web框架Gi ...
- REST与RPC的简单对比
一.REST:Representational State Transfer,表述性状态转移 REST是一种架构风格,指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是RESTf ...
- Http/2 升级指南
[转]http://www.syyong.com/architecture/http2.html HTTP/2(最初名为HTTP/2.0)是 WWW 使用的 HTTP 网络协议的主要版本. 它来自早先 ...
随机推荐
- 9. JS的数据类型,区别
js 有2大数据类型分类 : 基本数据类型: 1. string 字符串 使用单.双引号包裹,或者使用反引号包裹 2. number 数字类型 3. boolean 布尔值 true false 4. ...
- 010 Python 重中之重的变量
#!/usr/bin/env python # -*- coding:utf-8 -*- # Datatime:2022/7/16 20:32 # Filename:010 Python 重中之重的变 ...
- Docker高阶篇(一)
本篇章主要为工作实践过程中对高端应用的处理和把控 1.Docker复杂安装 mysql的主从复制 https://www.bilibili.com/video/BV1gr4y1U7CY?p=41&am ...
- OpenFunction 1.2.0 发布:集成 KEDA http-addon 作为同步函数运行时
OpenFunction 是一个开源的云原生 FaaS(Function as a Service,函数即服务)平台,旨在帮助开发者专注于业务逻辑的研发.我们非常高兴地宣布 OpenFunction ...
- 云原生周刊 | 2023 年热门:云 IDE、Web Assembly 和 SBOM | 2023-02-20
在 CloudNative SecurityCon 上,云原生计算基金会的首席技术官 Chris Aniszczyk 在 The New Stack Makers 播客的这一集中强调了 2023 年正 ...
- EAFP 与 LBYL 风格
EAFP 与 LBYL 是两种"防御性处理机制",相信你一定接触过,只是可能没有深入思考过这个问题. 输入两个数,要输出相除后的结果: a, b = map(int, input( ...
- Linux系统压力测试工具(命令行工具)
Linux的命令行压力测试工具在做基准测试时很有用,通过基准测试对了解一个系统所能达到的最大性能指标,这些指标可以作为后续性能比较.优化评估的参考依据. 模拟CPU压力: 可以使用stress命令使C ...
- 3.12 Linux创建文件及修改文件时间戳(touch命令)
既然知道了如何在 Linux 系统中创建目录,接下来你可能会想在这些目录中创建一些文件,可以使用 touch 命令. 需要注意的是,touch 命令不光可以用来创建文件(当指定操作文件不存在时,该命令 ...
- 好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
好未来,前身学而思,于 2010 年在美国纽约证券交易所上市.公司积极将大模型研究应用于教学产品中,近期推出了数学领域的千亿级大模型. 在大模型的背景下,存储系统需处理巨量数据和复杂文件操作,要求支持 ...
- PC大屏自适应 - 简洁版
PC大屏自适应通常做法 一般pc端页面布局会取中间一定的宽度,高度自适应.而可视化大屏需要在不同分辨率的显示屏上铺满整个屏幕,这就需要根据屏幕不同分辨率设置不同的宽高也就是自适应布局.在此向小伙伴们推 ...