💌 这是我参与「第五届青训营」伴学笔记创作活动的第 12 天。
🧡 本堂课重点内容
- Go 语言中的 RPC
- gRPC
- protobuf on HTTP2
🧡 知识点介绍
RPC
- Go 语言的标准库 RPC 实现:net/rpc,整合了 Socket 编程以及序列化和反序列化过程。若没有 RPC 需要自己处理 HTTP/TCP 的请求,手动获取数据进行加工,最后返回数据:
- RPC Server:服务 A 向服务 B 发请求,返回
hello+请求作为响应。参数:请求字符串,响应指针(指向存放响应信息的地址),剩下的交给 RPC 去做。 - 使用过程:调用 RegisterName 将 HelloService 注册到 RPC 中,带上 namespace。建立 TCP 链接,监听端口,Accept() 获取连接。通过 ServeConn 函数在 TCP 连接上提供 RPC 服务,之后由 RPC 进行序列化等操作。
- RPC 优点:简单高效。 缺点:传参问题,可以定义标准化接口。
gRPC
- 跨语言的RPC技术
主流语言都支持。 - 基于Protobuf消息格式
高效二进制协议。 - 基于HTTP2协议通讯
丰富的周边生态(网关支持/SSL)。
单一长连接避免了多TCP连接开销。
服务端推动 Sever Push。
头部压缩和二进制格式。
protobuf on HTTP2
- 数据交互格式: protobuf
- 通信方式:最底层为TCP或Unix Socket协议,在此之上是HTTP/2协议的实现。
- 核心库:在HTTP/2协议之上又构建了针对Go语言的gRPC核心库。
- Stub:应用程序通过gRPC插件生产的Stub代码和gRPC核心库通信,也可以直接和 gRPC 核心库通信。
- 定义接口 HelloService,生成客户端、服务端代码。客户端发动和接收操作放到两个单独的 Goroutine 中。
🧡 课程总结
💌 大项目中需要用到 RPC 框架,先了解一下 Go 语言中的实现原理,后续还会继续进行实战总结。