RPC进阶 | 青训营笔记

92 阅读2分钟

💌 这是我参与「第五届青训营」伴学笔记创作活动的第 12 天。

🧡 本堂课重点内容

  • Go 语言中的 RPC
  • gRPC
  • protobuf on HTTP2

🧡 知识点介绍

RPC

  • Go 语言的标准库 RPC 实现:net/rpc,整合了 Socket 编程以及序列化和反序列化过程。若没有 RPC 需要自己处理 HTTP/TCP 的请求,手动获取数据进行加工,最后返回数据:
    image.png
  • RPC Server:服务 A 向服务 B 发请求,返回hello+请求作为响应。参数:请求字符串,响应指针(指向存放响应信息的地址),剩下的交给 RPC 去做。 image.png
  • 使用过程:调用 RegisterName 将 HelloService 注册到 RPC 中,带上 namespace。建立 TCP 链接,监听端口,Accept() 获取连接。通过 ServeConn 函数在 TCP 连接上提供 RPC 服务,之后由 RPC 进行序列化等操作。 image.png
  • RPC 优点:简单高效。 缺点:传参问题,可以定义标准化接口。 image.png

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 中。 image.png

🧡 课程总结

💌 大项目中需要用到 RPC 框架,先了解一下 Go 语言中的实现原理,后续还会继续进行实战总结。