1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 20:52:22 +00:00

Merge branch 'master' of github.com:chai2010/advanced-go-programming-book

This commit is contained in:
Xargin 2018-07-06 18:52:38 +08:00
commit e9b0c20a33

View File

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