RPC:

  1. 提供统一的服务调用方式
  2. 类似调用本地函数
  3. 编译期参数类型检查
  4. 屏蔽协议编码和网络通信
  5. 面向服务化编程

基本框架:

  • Thrift(facebook)/Avro(hadoop)/Finagle(twitter)/grpc(google)
  • Dubbo(ali)/Motan(sina)/rpcx(golang!)
  • Sofa/Poppy/MTRpc/PhxRpc/Pebble

RPC服务发现:

  • Client-Side App:Stub(生成客户端接口)->Client Callmethod->Channel(Address Resolver, Load Balancer)->transport
  • Server-Side App:Service Implementation(扩展生成定义)->Service CallMethod->ServerCallHandler(req Scheduler) //调度策略,过载保护,优雅重启-> transport(tbus, socket)

网络通信:

方案 信息封装 传输模型 应用
远程调用 函数,变量 函数+参数-》返回 RMI
数据包 二进制 Send、Recv udp
消息队列 对象 Put、Get ActiveMQ
流过滤 单元长度很小的数据结构 读取处理 视频
资源拉取 header+body 资源id www

RPC框架服装屏蔽底层传输方式(TCP/UDP),序列化方式(XML/Json/二进制)和通信细节,调用者可以像调用本地接口一样调用远程服务。核心是要解决在分布式系统间,如何执行另外一个地址空间上的函数。

目的:

  • 服务端尽可能多的处理并发请求
  • 同时竟可能短的处理完毕

I/O模型:

  1. Blocking I/O:C10k问题
  2. Non-blocking I/O
  3. I/O multiplexing(有分配代理)
  4. Asynchronous I/O(回调)

gRPC支持C,java,Go语言:

  1. 语言中立,支持多种语言
  2. 基于IDL文件定义服务,通过proto3工具生成指定语言的数据结构,服务器端口以及客户端Stub
  3. HTTP/2设计,支持双向流,消息头压缩,单TCP的多路浮云,服务端推送–》省电和流量
  4. 序列化支持PB和JSON

创建流程:

  1. NettyServer创建,实现基于HTTP/2协议请求消息的接入
  2. 绑定IDL定义的服务接口实现类:proto工具生成代码在服务器上注册
  3. gRPC服务实例创建