Skip to content

Commit 83d6c77

Browse files
committed
ch4.4: 包含grpc技术栈图
1 parent c11daa8 commit 83d6c77

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed

ch4-rpc/ch4-04-grpc.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@
22

33
GRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架。GRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多个服务,对于移动设备更加友好。本节将讲述GRPC的简单用法。
44

5-
## 4.4.1 GRPC入门
5+
## 4.4.1 GRPC技术栈
6+
7+
Go语言的GRPC技术栈如图所示:
8+
9+
![](../images/ch4.4-1-grpc-go-stack.png)
10+
11+
最底层为TCP或Unix Socket协议,在此之上是HTTP/2协议的实现,然后在HTTP/2协议之上又构建了针对Go语言的GRPC核心库。应用程序通过GRPC插件生产的Stub代码和GRPC核心库通信,也可以直接和GRPC核心库通信。
12+
13+
## 4.4.2 GRPC入门
614

715
如果从Protobuf的角度看,GRPC只不过是一个针对service接口生成代码的生成器。我们在本章的第二节中手工实现了一个简单的Protobuf代码生成器插件,只不过当时生成的代码是适配标准库的RPC框架的。现在我们将学习GRPC的用法。
816

@@ -95,7 +103,7 @@ func main() {
95103

96104
GRPC和标准库的RPC框架有一个区别,GRPC生成的接口并不支持异步调用。不过我们可以在多个Goroutine之间安全地共享GRPC底层的HTTP/2链接,因此可以通过在另一个Goroutine阻塞调用的方式模拟异步调用。
97105

98-
## 4.4.2 GRPC流
106+
## 4.4.3 GRPC流
99107

100108
RPC是远程函数调用,因此每次调用的函数参数和返回值不能太大,否则将严重影响每次调用的响应时间。因此传统的RPC方法调用对于上传和下载较大数据量场景并不适合。同时传统RPC模式也不适用于对时间不确定的订阅和发布模式。为此,GRPC框架针对服务器端和客户端分别提供了流特性。
101109

@@ -208,7 +216,7 @@ for {
208216

209217
这样就完成了完整的流接收和发送支持。
210218

211-
## 4.4.3 发布和订阅模式
219+
## 4.4.4 发布和订阅模式
212220

213221
在前一节中,我们基于Go内置的RPC库实现了一个简化版的Watch方法。基于Watch的思路虽然也可以构造发布和订阅系统,但是因为RPC缺乏流机制导致每次只能返回一个结果。在发布和订阅模式中,由调用者主动发起的发布行为类似一个普通函数调用,而被动的订阅者则类似GRPC客户端单向流中的接收者。现在我们可以尝试基于GRPC的流特性构造一个发布和订阅系统。
214222

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module github.com/chai2010/advanced-go-programming-book

images/ch4.4-1-grpc-go-stack.png

74.8 KB
Loading

0 commit comments

Comments
 (0)