打开日期(2019-07-16)
学习要点
- 1.grpc 是什么
- 2.grpc 能做什么
- 3.grpc 能实现什么效果
- 4.grpc 4中通信方式
- 5.grpc 生命周期
- 6.grpc 同步和异步介绍
- 7.grpc 超时时间
- 8.grpc 终止
- 9.grpc 取消
- 10.grpc 元数据
- 11.grpc 通道
- 12.grpc 特性
- 13.grpc/thrift/dubbo 比较
1.grpc 是什么
grpc是一款库语言、跨平台、开源的远程过程调用的RPC系统。
2.grpc 能做什么
在grpc里面客户端应用可以像调用本地方法一样调用远程服务端的方法,更容易的建立分布式应用和服务。与许多RPC系统类似,grpc也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(参数和返回类型),在服务端实现这个接口,并运行一个grpc服务来处理客户端的调用。在客户端存根能够像服务端一样的方法。
3.grpc 能实现什么效果
有了grpc,我们可以一次性的使用.proto文件定义服务并使用任何支持他的语言实现客户端和服务端。反过来grpc解决了不同语言通信的复杂性以及环境的不同。使用Protocol Buffers还能够获得其他好处,包括高速的序列化、简单的IDL以及容易进行接口的更新。
4.grpc 4中通信方式
简单的RPC服务,一个请求对象一个返回对象,就像平常调用函数一样
rpc simpleRpc(request) returns (feature){}
服务器端流式RPC,客户端发送请求到服务器,服务器端返回一个Stream流,客户到获取Stream消息,知道里面没有任何信息。一个请求,服务端返回多个结果对象
rpc serverStreamRpc(request) returns(stream){}
客户端流式RPC,客户端写入一个序列化消息并将其发送到服务器,同样使用Stream流,一旦客户端写入完消息,它等待服务器完成读取返回它响应。客户端传入多个对象,服务器返回一个响应结果。
rpc clientStreamRpc(stream) returns(feature){}
双向流式RPC,客户端和服务端都使用读写流去发送消息序列。两个流相互独立,因此客户端和服务端可以任意顺序读写。传入多个对象,返回多个对象。
rpc biStreamRpc(stream) returns(stream){}
5.grpc 生命周期
一元RPC调用流程
- 一旦客户端调用存根/客户端对象上的方法,就会通知服务器RPC被调用,客户端的元数据metadata(RequestHeader)在此调用,包括超时时间(deadline/timeout)
- 然后服务端可以立即返回自己的元数据metadata(ResponseHeader),必须在任何响应之前发送
- 一旦服务器有客户端的请求消息,就可以开始和创建所需的工作任务,然后将响应结果以及状态信息一起返回给客户端
- 如果状态为ok,则客户端将获得响应,从而客户端完成该调用
6.grpc 同步和异步介绍
- 同步RPC调用,在服务器返回结果之前客户端会一直阻塞
- 异步RPC调用,网络内部是异步的,并且再许多场景下能够不阻塞当前线程的情况下启动RPC是非常有用的
7.grpc 超时时间
grpc在允许客户端调用一个远程方法前指定一个最后期限(超时时间),这个时间指定了客户端可以等待服务器端多长时间来应答,超过这个时间RPC将结束并返回(deadline_exceeded)错误,在服务器端可以查询这个超时时间,并判断一个特定的方法是否过期,或者还剩下多长时间来完成这个方法。
8.grpc 终止
在grpc里,客户端和服务器端的判断都是独立的、本地的。他们的结论可能不一致,比如在一个rpc里,服务器端成功返回,客户端收到的消息已经超过了超时时间,客户端就会报错。也可能是客户端在请求发送完之前,服务端却判断调用已经完成了。
9.grpc 取消
无论是客户端还是服务器端在任何时间都可以取消一个RPC,一个取消会立即终止RPC,这样避免了更多的操作被执行,它不是一个“撤销”,在取消之前完成的操作不会被回滚。
10.grpc 元数据
元数据是特定的RPC调用对应的信息,这些信息以键值的形式存在,其中键是字符串,值得类型一般也是字符串(当然也可以是二进制数据)。元数据对于rpc本身是不透明的,它让客户端调用相关的信息给服务端,反之亦然
11.grpc 通道
grpc通道提供与指定主机和端口上的grpc服务的链接,被用于创建客户端存根,客户端可以指定通道的参数来修改grpc的默认行为。例如:打开和关闭消息压缩。通道具有状态,包括链接、空闲状态等。
12.grpc 特性
- 基于HTTP/2,http2提供了多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省贷款、降低tcp链接次数、节省CPU等。grpc的协议使用http2现有的语义,请求和响应的参数使用http body发送,其他控制信息使用header标识
- IDL使用protobuf,grpc使用protobuf来定义服务,protobuf能够将数据进行序列化,并广泛应用于数据存储,通信协议等方面。压缩和传输效率高,语法简单,表达力强。
- 多语言支持,grpc可以为多种语言提供服务
13.grpc/thrift/dubbo 比较
区别 | dubbo | grpc | thrift |
---|---|---|---|
开发语言 | java | 跨语言 | 跨语言 |
分布式服务治理 | Y | 可以配合zookeeper实现 | 可以配合zookeeper实现 |
底层协议 | - dubbo - rmi - hession - mina - memache - webservice - http - thrift - redis - rest | http2 | tcp - http - frame |
消息序列化 | - hession - dubbo - fastjson - java自带序列化 | protobuf | thrift |
跨语言编程 | N | Y | Y |
负载均衡 | - 轮询 - 随机数 - 一致性hash - 最小活跃数 | 负载均衡软件HaProxy | - HaProxy - Zookeeper+客户端 |
集群容错 | - FailOver - FailSafe - FailFast - FailBack - Forking - Broadcast | FailOver | FailOver |
注册中心 | - zookeeper - redis - Nacos - Simple - Multicast | - zookeeper - etced - consul | zookeeper |
侧重优势 | 服务治理 | 跨语言,性能高 | 跨语言,性能好 |
客户端异步调用方案 | stream传输,双向通信 | - 使用"oneway"关键字(无返回结果),+callback tcp异步请求 - thrift IDL参数不支持函数或 | |
服务端异步处理方案 | 使用stream流传输,传输过程中当成集合,使用iterator来遍历 | 1. - TNonblockingServer - THsHaServer - TThreadpoolServer - TThreadSelectorServer 2.结合消息队列或中间键 3.swoole/goroutine等多任务支持 |