gRPC 基本概念

找不到工作 · · 1232 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

本文基于视频:gRPC课程,涵盖了 1 到 5 集内容。

该视频比较短小精悍,小哥口音有点奇怪,但是还算吐字清楚。

1. The motivation of gRPC

gRPC 试图解决应用之间的 通信 问题。通常,前端和后端程序用不同的语言编写,微服务可能也是用不同的语言编写。他们间需要一个共同的协议来处理:

  • 通信方式:如 Basic,SOAP,消息队列
  • 认证机制:如 Basic,OAuth,JWT
  • 消息载荷类型:如 JSON,XML,binary
  • 数据模型
  • 错误处理

该协议应该非常效率,因为:

  • 微服务间的信息交换非常多
  • 手机网络带宽限制

gRPC 就在这些需求下应运而生。

2. gRPC 是什么

gRPC 是一个开源的多功能 RPC 框架。

RPC 指 Remote Procedure Call,是一种调用其他主机上运行的程序的协议,之前在做 MIT 6.824 时已经有接触,使用 RPC 就像可以直接从客户端调用服务端的代码。

gRPC client and server

如上图所示,client 有一个自动生成的 "Stub" 提供 server 端的可调用函数。"Stub" 会调用 gRPC 框架并管理通信上的细节。

生成 Stub

gRPC 默认使用 protocol buffers 来生成 Stub。这是一种接口定义语言(Interface Definition Language, IDL)。

首先,定义 RPC 使用的服务和消息类型,protocol buffer 是一种强类型的协议,因此它要求指定参数、返回值的类型。

// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

之后, protocol buffer compiler 可以利用这些定义生成指定语言的代码(golang, cpp, java, etc)。

3. gRPC 的优势

使用 http2

gRPC 使用 http2 作为底层通信协议。
http2 是 2015 年面世的新版本,相较于 1997 年的 http1.1,它的主要特色是:

  • 使用二进制而非文本

    • 更好的性能
    • 传输更轻量级,解码更安全
    • 与 protocol buffer 兼容性好
  • 使用HPACK 压缩 header

    • 更少的 overhead,更优性能
  • 多路复用

    • 可以通过一个 TCP 连接 并行 发送多个请求/回复
    • 降低延迟,提高网络利用率
  • 服务器推送

    • 客户端发送一个请求后,服务器预判客户端需要什么资源,并主动发送响应。表现为一个请求,多个响应。
    • 减少 round-trip 延迟
HTTP/2 HTTP/1.1
Transfer Protocol binary text
Headers compressed plain text
Multiplexing yes no
Request per connection Multiple 1
Server push Yes No

这个网站可以测试 http2 的性能,我的结果是相比 http1.1 加载时间减少了50%以上。

gRPC v.s. REST

Feature gPRC REST
协议 HTTP/2 HTTP/1.1
有效载荷 Protobuf (二进制, 小巧) JSON(文本, 冗长)
API .proto(强类型) OpenAPI(宽松)
代码生成 内置的 protoc 第三方工具,如 swagger
安全性 TLS/SSL TLS/SSL
双向的 只能客户端发起
浏览器支持 需要 gRPC-web 在 HTTP/1 和 HTTP/2 之间做转换 支持

可以看出,gRPC 在除了浏览器支持外都有更好的表现。因此 gRPC 特别适合用于:

  • 微服务(低延迟、高网络流量、强 API 合约)

  • 多语言环境

    • gRPC 有原生的代码生成工具
  • 点对点实时通信

    • gRPC 支持双向流
  • 网络资源有限的系统(如手机)

    • gRPC 有轻量级的消息格式

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:找不到工作

查看原文:gRPC 基本概念

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1232 次点击  
加入收藏 微博
上一篇:golang 50处陷阱
下一篇:2020再见
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传