前言
掌握一种自己学习的方式,结合自己的时间限制、当前需求做出的阅读总结,有一种模式成为 加法-减法 模式。简单而言就是砍掉一些当前不是很重要的事情,专心在于自己目前最重要的事情上面。最近刚换了新的公司,目前内部的服务调用都是通过gRPC来调用,因此我得快速了解 gGPC 是什么,他有什么用,能让我在工作上快速适应到这种模式的一个总结。
在此阶段,并不追求极致,也就是说没必要深究到gRPC如何 encoding、或者其stub的原理、甚至说去抓HTTP/2 协议包再去分析gGPC的调用过程、传递参数过程等等。
凡是学习都有一个阶段性,在每个阶段性中,都需要持续保持自己在舒适圈外。没什么事可以一撮而就,都是日积月累。在时间精力有限的情况下,选择出最优最适合自己的知识才是最重要的。
如果时间允许,当然建议把每个知识点逐步深耕下去!
认知
- grpc 是google开源的rpc框架,底层基于http2作为传输协议,rpc协议在客户端和服务端都需要有一个stub作为序列化和反序列化参数、方法等信息。
- rpc还能通过rabbitMQ作为传输协议,这样就能将同步变成了异步的操作
- 同样的rpc框架 还有 阿里的 Dubbo、Facebook的Thrift
gRPC 的四种模式
gRPC 通常有四种模式,unary,client streaming,server streaming 以及 bidirectional streaming,对于底层 HTTP/2 来说,它们都是 stream,并且仍然是一套 request + response 模型。
- unary 一次来回通讯
- client streaming 客户端多次请求,服务端一次返回
- 在同一个http请求中,服务端必须会等待客户端全部发送完毕后再返回
- server streaming 客户端一次请求 服务端多次发送
- 在同一个http请求中,服务端会等待客户端请求完,服务端再多次返回
- bidirectional 双向流。 双方都可发送多次
- 同时进行,无需等待请求完成
别人是如何讲解gRPC的
- 大部分grpc的文章都在讲解以下几点
- protobuf 的定义
- protogen的实用方法,生产.proto 文件
- go server和client调用的实例代码
- grpc stream的控制
- grpc 订阅发布控制
其他关于grpc的知识点
- Interceptors - 拦截器
- 拦截器可以认为是middleware
- 可以分为 unary interceptor 和 stream interceptor
- 拦截器可以被配置在client site 和 server site
- deadline
- 用于设置整个rpc链路的返回时间
- 例如 A → B → C
- A在发起request的时候就已经得把deadline设置好
- 如果不设置,那么A会一直等待着整个链路回来
- multiplexing
- gRPC支持多路复用,可以把多个gRPC服务器注册到同一个服务上
- metadata
- 想传一些参数又跟rpc调用无关的时候,则可以使用metadata来传输数据
- metadata被构建在gRPC的headers里面
- load-balance
- gRPC的load-balance必须全面支持http/2的协议、例如Nginx、Envoy proxy等
- 当然你也可以把自己实现一个client-site的load-balance
- security
- gRPC支持TLS
- 分别为one-way secured connection 和 mTLS secured connection
- 两者的区别的,前者只需要配置在客户端,客户端传送的时候会把参数加密
- 后者是客户端和服务端都需要先进行证书认证,确保双方证书都有效后,才会进行数据传输
- authentication
- 支持多种认证、例如 basic authentication、OAuth 2.0、JWT、 Google Token-Based Authentication
实战
- 用grpc做一个流的计算器(双向流)
- 做grpc做个简单的调用 (unary)
- 用grpc做一个订阅发布 (单向流)
书籍
- gRPC & UP Running 出本社是 O'reIlly 封面是只鸭子的
问题
- http和rpc的分别是什么
- 为什么http2 可以这么快?