1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 12:32:21 +00:00

Merge pull request #182 from fuwensun/pr4-4-2

ch4-04-fix typos
This commit is contained in:
chai2010 2018-07-06 17:39:26 +08:00 committed by GitHub
commit 21c350fad3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -95,7 +95,7 @@ GRPC和标准库的RPC框架还有一个区别GRPC生成的接口并不支持
## GRPC流
RPC是远程函数调用因此每次调用的函数参数和返回值不能太大负责将严重影响每次调用的性能。因此传统的RPC方法调用对于上传和下载较大数据量场景并不适合。同时传统RPC模式也不适用于对时间不确定的订阅和发布模式。为此GRPC框架分别提供了服务器端和客户端的流特性。
RPC是远程函数调用因此每次调用的函数参数和返回值不能太大否则将严重影响每次调用的性能。因此传统的RPC方法调用对于上传和下载较大数据量场景并不适合。同时传统RPC模式也不适用于对时间不确定的订阅和发布模式。为此GRPC框架分别提供了服务器端和客户端的流特性。
服务端或客户端的单向流是双向流的特例我们在HelloService增加一个支持双向流的Channel方法
@ -109,7 +109,7 @@ service HelloService {
关键字stream指定启用流特性参数部分是接收客户端参数的流返回值是返回给客户端的流。
重新生成代码可以可以看到接口中新增加的Channel方法的定义
重新生成代码可以看到接口中新增加的Channel方法的定义
```go
type HelloServiceServer interface {
@ -165,7 +165,7 @@ func (p *HelloServiceImpl) Channel(stream HelloService_ChannelServer) error {
}
```
服务端在循环中接收客户端发来的数据如果遇到io.EOF表示客户端流被关闭如果函数退出表示服务端流关闭。然后生成返回的数据通过流发送给客户端。需要主要的是,发送和接收的操作并不需要一一对应,用户可以根据真实场景进行组织代码。
服务端在循环中接收客户端发来的数据如果遇到io.EOF表示客户端流被关闭如果函数退出表示服务端流关闭。然后生成返回的数据通过流发送给客户端。需要注意的是,发送和接收的操作并不需要一一对应,用户可以根据真实场景进行组织代码。
客户端需要先调用Channel方法获取返回的流对象
@ -176,7 +176,7 @@ if err != nil {
}
```
在客户端我们将发送和接收操作放到两个独立的Goroutine。首先是向服务端发数据:
在客户端我们将发送和接收操作放到两个独立的Goroutine。首先是向服务端发数据:
```go
go func() {
@ -204,7 +204,7 @@ for {
}
```
这样就完成了完整的流接收和发支持。
这样就完成了完整的流接收和发支持。
<!--