流殃的博客

| Comments

rpc

what

首先是要区分一下大家最容易搞混的,http和rpc的差别:

  • http是一种通信协议,rpc是远程调用方案,它通常包括了通信协议和序列化协议。当然他们都是在传输层及其以上作用。

这也是为什么我们经常说RPC也可以给予http来实现,因为我们采用了http作为我们的RPC实现的应用层通信协议。而我们平时写http请求的时候,一般会采用基于文本编码的josn的序列化协议,而RPC采用的是基于二进制编码的protobuf协议。http协议header其实有很多附带字段,这些占用了网络报文,在高并发场景下,这些字段是不需要的,使用自定义的应用层协议可以减少一些数据,别看这个不多,但是一旦数据量很多,效果是非常明显的。如果采用http来做通信协议,其实和我们普通的rest请求差别不大。当然http和http2.0又是两个差别很大的协议了。

why rpc

对于分布式系统而言,不同的服务分布在不同的节点上,一个服务要完成自己的功能经常需要调用其他服务的接口,比如典型的微服务架构。通常这种服务调用方式有两种,一种是发送HTTP请求的方式,另一种则是RPC的方式,RPC是Remote Procedure Call(远程过程调用)的简称,可以让我们像调用本地接口一样使用远程服务。相比HTTP调用,RPC的方式至少在以下几个方面有优势

  • 传输效率
    RPC可以自定义TCP报文,基于TCP协议进行通信,比如dubbo;同时也支持使用HTTP2协议进行通信,比如gRPC。这相比传统的HTTP1.1协议报文体积会更小,传输效率会更高。
  • 性能消耗
    RPC框架通常自带高效的序列化机制,序列化和反序列化耗时更低,序列化后的字节数通常也更小。
  • 负责均衡
    RPC框架通常自带负载均衡策略,而HTTP请求要做负载均衡需要外部应用如Nginx的支持。
  • 服务治理
    下游服务新增,重启,下线时能自动通知上游使用者,而HTTP的方式需要事先通知并修改相关配置。

正因为基于RPC方式的服务调用有着性能消耗低,传输效率高,更容易做负载均衡和服务治理的优点,所以分布式系统内部大多采用这种方式进行分布式服务调用。可供选择的RPC框架很多,比如Hession,Dubbo,Thrift这些很早就开源,平时项目中使用也很多。不过最近有一个叫gRPC的RPC框架很火,被使用在很多微服务相关的开源项目中。

grpc简介

gRPC是由Google开发并开源的RPC框架,它具有以下特点:–

  • 语言中立
    支持C,Java,Go等多种语言来构建RPC服务,这是gRPC被广泛的应用在微服务项目中的重要原因,因为不同的微服务可能用不同的语言构建。
  • 基于HTTP/2协议
    支持双向流,消息头压缩,单TCP的多路复用,服务端推送等,这些特性使得gRPC更加适用于移动场景下的客户端和服务端之间的通信。
  • 基于IDL定义服务
    编写.proto文件即可生成特定语言的数据结构、服务端接口和客户端Stub。
    支持Protocol Buffer序列化

Protocol Buffer是由Google开发的一种数据序列化协议(类似于XML、JSON、Hession),平台无关,压缩和传输效率高,语法简单,表达能力强。
一个gRPC服务的大体架构可以用官网上的一幅图表示
image-1663461462903
gRPC服务端使用C++构建,客户端可以使用Ruby或者Java构建,客户端通过一个Stub存根(代理)对象发起RPC调用,请求和响应消息都使用Protocol Buffer进行序列化。

Comments

评论