mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-24 12:32:21 +00:00
commit
21c350fad3
@ -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 {
|
||||
}
|
||||
```
|
||||
|
||||
这样就完成了完整的流接收和发生支持。
|
||||
这样就完成了完整的流接收和发送支持。
|
||||
|
||||
|
||||
<!--
|
||||
|
Loading…
x
Reference in New Issue
Block a user