Skip to content

Commit

Permalink
ch4.4: 包含grpc技术栈图
Browse files Browse the repository at this point in the history
  • Loading branch information
chai2010 committed Dec 12, 2018
1 parent c11daa8 commit 83d6c77
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 3 deletions.
14 changes: 11 additions & 3 deletions ch4-rpc/ch4-04-grpc.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@

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

## 4.4.1 GRPC入门
## 4.4.1 GRPC技术栈

Go语言的GRPC技术栈如图所示:

![](../images/ch4.4-1-grpc-go-stack.png)

最底层为TCP或Unix Socket协议,在此之上是HTTP/2协议的实现,然后在HTTP/2协议之上又构建了针对Go语言的GRPC核心库。应用程序通过GRPC插件生产的Stub代码和GRPC核心库通信,也可以直接和GRPC核心库通信。

## 4.4.2 GRPC入门

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

Expand Down Expand Up @@ -95,7 +103,7 @@ func main() {

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

## 4.4.2 GRPC流
## 4.4.3 GRPC流

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

Expand Down Expand Up @@ -208,7 +216,7 @@ for {

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

## 4.4.3 发布和订阅模式
## 4.4.4 发布和订阅模式

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

Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module github.com/chai2010/advanced-go-programming-book
Binary file added images/ch4.4-1-grpc-go-stack.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 83d6c77

Please sign in to comment.