《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_第1张图片

  • 一旦客户端调用存根/客户端对象上的方法,就会通知服务器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等多任务支持

你可能感兴趣的:(netty)