《Netty学习打卡--从小白到放弃》----- 14 - netty 之grpc 初识grpc

打开日期(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服务,一个请求对象一个返回对象,就像平常调用函数一样
rpc simpleRpc(request) returns (feature){}

  • Server Streaming Rpc
服务器端流式RPC,客户端发送请求到服务器,服务器端返回一个Stream流,客户到获取Stream消息,知道里面没有任何信息。一个请求,服务端返回多个结果对象
rpc serverStreamRpc(request) returns(stream){}

  • Client Streaming Rpc
客户端流式RPC,客户端写入一个序列化消息并将其发送到服务器,同样使用Stream流,一旦客户端写入完消息,它等待服务器完成读取返回它响应。客户端传入多个对象,服务器返回一个响应结果。
rpc clientStreamRpc(stream) returns(feature){}

  • Bidirectional Streaming RPC
双向流式RPC,客户端和服务端都使用读写流去发送消息序列。两个流相互独立,因此客户端和服务端可以任意顺序读写。传入多个对象,返回多个对象。
rpc biStreamRpc(stream) returns(stream){}

5.grpc 生命周期 一元RPC调用流程
《Netty学习打卡--从小白到放弃》----- 14 - netty 之grpc 初识grpc
文章图片

  • 一旦客户端调用存根/客户端对象上的方法,就会通知服务器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 通道 【《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可以为多种语言提供服务
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等多任务支持

    推荐阅读