打开日期(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中通信方式
- Simple RPC
rpc simpleRpc(request) returns (feature){}
- Server Streaming Rpc
rpc serverStreamRpc(request) returns(stream){}
- Client Streaming Rpc
rpc clientStreamRpc(stream) returns(feature){}
- Bidirectional Streaming RPC
rpc biStreamRpc(stream) returns(stream){}
5.grpc 生命周期 一元RPC调用流程
文章图片
- 一旦客户端调用存根/客户端对象上的方法,就会通知服务器RPC被调用,客户端的元数据metadata(RequestHeader)在此调用,包括超时时间(deadline/timeout)
- 然后服务端可以立即返回自己的元数据metadata(ResponseHeader),必须在任何响应之前发送
- 一旦服务器有客户端的请求消息,就可以开始和创建所需的工作任务,然后将响应结果以及状态信息一起返回给客户端
- 如果状态为ok,则客户端将获得响应,从而客户端完成该调用
- 同步RPC调用,在服务器返回结果之前客户端会一直阻塞
- 异步RPC调用,网络内部是异步的,并且再许多场景下能够不阻塞当前线程的情况下启动RPC是非常有用的
8.grpc 终止 在grpc里,客户端和服务器端的判断都是独立的、本地的。他们的结论可能不一致,比如在一个rpc里,服务器端成功返回,客户端收到的消息已经超过了超时时间,客户端就会报错。也可能是客户端在请求发送完之前,服务端却判断调用已经完成了。
9.grpc 取消 无论是客户端还是服务器端在任何时间都可以取消一个RPC,一个取消会立即终止RPC,这样避免了更多的操作被执行,它不是一个“撤销”,在取消之前完成的操作不会被回滚。
10.grpc 元数据 元数据是特定的RPC调用对应的信息,这些信息以键值的形式存在,其中键是字符串,值得类型一般也是字符串(当然也可以是二进制数据)。元数据对于rpc本身是不透明的,它让客户端调用相关的信息给服务端,反之亦然
11.grpc 通道 【《Netty学习打卡--从小白到放弃》----- 14 - netty 之grpc 初识grpc】grpc通道提供与指定主机和端口上的grpc服务的链接,被用于创建客户端存根,客户端可以指定通道的参数来修改grpc的默认行为。例如:打开和关闭消息压缩。通道具有状态,包括链接、空闲状态等。
12.grpc 特性
- 基于HTTP/2,http2提供了多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省贷款、降低tcp链接次数、节省CPU等。grpc的协议使用http2现有的语义,请求和响应的参数使用http body发送,其他控制信息使用header标识
- IDL使用protobuf,grpc使用protobuf来定义服务,protobuf能够将数据进行序列化,并广泛应用于数据存储,通信协议等方面。压缩和传输效率高,语法简单,表达力强。
- 多语言支持,grpc可以为多种语言提供服务
区别 | 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等多任务支持 |
推荐阅读
- Netty权威指南--图片
- Netty简介
- NIO|Netty应用篇
- Netty|Netty实现聊天室
- 《Netty学习打卡--从小白到放弃》----- 15 - netty 之grpc Simple RPC 例子
- Netty(一)--java NIO详解
- Netty|Netty4详解一(理解Netty的设计理念NIO)
- 通过Netty实现与硬件设备(充电桩)通讯的功能
- Netty-NIO 详解、说明、优缺