RPC:
- 提供统一的服务调用方式
- 类似调用本地函数
- 编译期参数类型检查
- 屏蔽协议编码和网络通信
- 面向服务化编程
基本框架:
- 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)
网络通信:
RPC框架服装屏蔽底层传输方式(TCP/UDP),序列化方式(XML/Json/二进制)和通信细节,调用者可以像调用本地接口一样调用远程服务。核心是要解决在分布式系统间,如何执行另外一个地址空间上的函数。
目的:
- 服务端尽可能多的处理并发请求
- 同时竟可能短的处理完毕
I/O模型:
- Blocking I/O:C10k问题
- Non-blocking I/O
- I/O multiplexing(有分配代理)
- Asynchronous I/O(回调)
gRPC支持C,java,Go语言:
- 语言中立,支持多种语言
- 基于IDL文件定义服务,通过proto3工具生成指定语言的数据结构,服务器端口以及客户端Stub
- HTTP/2设计,支持双向流,消息头压缩,单TCP的多路浮云,服务端推送–》省电和流量
- 序列化支持PB和JSON
创建流程:
- NettyServer创建,实现基于HTTP/2协议请求消息的接入
- 绑定IDL定义的服务接口实现类:proto工具生成代码在服务器上注册
- gRPC服务实例创建