技术分享之grpc的那些事儿[上]

前言:

在公司做了一次面向整个技术中心的技术分享 😁 ,话题是关于grpc的设计实现。本想单纯的说下golang grpc的设计和源码实现细节,但考虑除了我们云平台部门之外,其他兄弟部门都是搞java的,所以把grpc的话题延伸到http2协议、protobuf编码及grpc设计实现和使用经验。

ppt写了有70多页,如果在一个页面上显示所有内容显得繁杂,索性拆分上下两篇文章,上篇重点讲http2和protobuf,下篇讲grpc的设计原理和实战经验,grpc下篇文章地址 http://xiaorui.cc/archives/7054

github:

大家可以到我的github里下载完整ppt文件,求github点star 。 👍👍👍 https://github.com/rfyiamcool/share_ppt/blob/master/grpc.pdf

HTTP2

grpc

敬上第一张图,附上我的github http://github.com/rfyiamcool ,求follow和star。😁

主要讲四个topic,http的发展史,protobuf编码原理,grpc的设计实现,grpc使用优化。

grpc

上图为gprc的应用场景?

常见的场景是后端服务之间进行调用,除此之外,grpc还使用与移动端,通过grpc-web也可以在浏览器中使用grpc,当然对于grpc-web当前还是需要envoy做协议兼容,另外grpc-web对于前端来说不是很友好,也有相当的学习成本,且不支持gprc bidi模式。grpc-web的优点在于前后端接口统一。

上图其实也是我上家公司对grpc的使用场景,移动端、网页端和开放API端都可使用grpc来调用服务。

grpc protobuf http2

grpc的优点在于什么?

高兼容性、高性能、使用简单

grpc的组成部分?

共三部分组成。第一,http2作为网络传输层。第二,protobuf是高性能的数据包序列化协议。第三,通过protoc gprc插件生成易用的sdk。

rtt

在讲http之前,我们要想搞懂什么是rtt。rtt ( round trip time ) 可以理解为一个请求一去一回的时间开销。在无任何缓存场景下,一个http请求会经过很多的rtt。dns的请求和应答为一个rtt,对http服务进行tcp连接需要两个2rtt,http跳转到https又是需要经历三次握手的rtt开销,tls还需要2次rtt,ocsp校验还是需要几个rtt。😅

当然上面说的是无缓存和未优化的场景开销。下面开始说grpc的第一部分 http2。😅

http2

为什么会选用http2作为grpc的传输协议?

在社区里看到过官方的说法,就是为了最大程度的兼容性,搞过thrift和私有rpc协议的朋友知道,协议独特带来的问题就是兼容性,不如负载均衡? 现在市面上开源的load balancer没几个支持thrift的,而grpc就不同了,你能想到的proxy基本都支持grpc。大家想过原因么?

原因就是grpc基于http2,现在主流的proxy都要支持http2,那么自然就支持grpc了。

http2

在说http2.0之前,先要说下http几个版本的发展。http1.0是个老古董,最大的槽点是短连接。http1.1的出世解决了http1.0最大的性能问题,并且增加了丰富的header语义。

http1.1

想来 http1.1 应该是大家最熟悉的协议了,http1.1的问题在于队头阻塞 ( head of line blocking)。一个连接只能跑一个请求,在这个请求没返回数据之前,其他请求就不能占用该连接。如果你有N个并发请求,那么就需要N个连接,问题是浏览器让你开这么多连接么?

http 1.1 pipeline
http 1.1 pipeline

有人肯定说了http1.1支持pipeline呀?我就问你一句话,你用过这个pipeline管道么?对方服务器支持么? 现在浏览器还支持么?

http 时延

接上面的那个问题,浏览器针对一个域名是有连接限制的,像chrome是6个连接,Safari也为6个,像windows ie 11版为13个连接。如果首页有100个资源,浏览器的连接又被限制为6个,那么100个资源回被浏览器排队等待。

如何做到最快速度把自己拖拉来并渲染显示?多个小资源整合在一起后可节约rtt,域名分片,压缩数据,cookie free等方法。大家熟知的cdn其实也算是域名分片。

这里的域名主要是针对二级域名级别的(暂不要纠结一二级域名如何定义),二级域名是 static.xiaorui.cc,go.xiaorui.cc 这种。但就算你开了多个二级域名,以为连接无上限? 😅 chrome对一级域名也是有限制的。

http 1.1 vs http2.0

akamai提供了http2 vs http1.1的测试页面,下面的地图是由几百个小图片组成的。测试方式为先使用http1.1访问,再通过http2.0访问。通过时间对比,我们可以分析出http2.0由于多路复用,要比http1.1快的多。

akamai http2

浏览器通过启动参数或者内置设置是可改变连接限制的。那么,如果浏览器不限制连接数,是否可以跟http2.0一样的效果? 不行的,依旧有几个问题,新的连接要3次握手,tls也要握手,之后还要经历tcp拥塞控制下的慢启动。这些连接启动后是否要一直保持? 那么保持这些连接对比客户端和服务端都有一定的负担,比如tcp级别的心跳,由内核依赖定时器来发送,对端也要接收该报文更正定时器,等等。

tcp slow start

http2.0的优点如下

http2.0 优点

最小单位是frame,一个请求需要header frame、data frame两个帧的。stream是http2抽象的流,每个stream都有id,通过id来区分并发过来的请求。

http2是二进制协议

http2最大的优点是多路复用,这里的多路复用不是指传统类似epoll对tcp连接的复用,而是协议层的多路复用,把一个个的请求封装成stream流,这些流是可以并发交错请求,没有http1.1那种队头阻塞问题。

通过wireshark抓包http2,可以看到并发的stream跑在一个连接上。


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc