初探远程过程调用RPC(一.了解RPC框架协议)

3,466 阅读3分钟

本文正在参与 “网络协议必知必会”征文活动

前言

最近想继续研究K8s,有兴趣可以看看我之前折腾的文章:手把手教大家使用树莓派4B搭建k8s集群 ,暂停折腾好久了,总感觉网络这块还是非常模糊,公司项目架构也用到了K8s,其内部服务之间调用当然要使用到RPC,一直不清楚RPC的细节,今天就来稍微总结了解其中的细节。

什么是RPC

RPC是指远程过程调用,是Remote Procedure Call三个单词的缩写,功能就是本地的函数一样去调远程函数,远程一般是指通过网络从远程计算机程序上请求服务,也可以在在宿主机下通过网络进行不同架构下的互相请求服务。

在分布式或者微服务架构上非常常用,RPC让不同服务之间的服务调用像本地调用一样简单高效,RPC是一种网络协议,是一种规范,每个大厂几乎都有自己研发的RPC协议。

为什么要用RPC

为什么有HTTP还需要RPC呢?RPC那么复杂为什么不用HTTP请求,使用RESTful规范来进行服务调用请求,rpc其实是包含HTTP协议的,RPC协议通常包含传输协议和序列化协议,RPC主要是为了解决特定的问题或者节约成本的角度出发的。

Google有一个著名的GRPC协议。GRPC底层就是http2协议,因为http1包含了太多的没用的信息,很浪费网络资源。因为大厂一般都会根据自己的系统架构自定义RPC协议,但是缺点就是缺乏灵活性。序列化协议常见的是json,protobuf,xml,下篇准备研究研究这个序列化协议。

为什么RPC这么火

因为现在大多数公司的服务架构从单体架构逐渐走向微服务架构,之前所有的服务都在一台或者多台云服务器上,直接进行进程间同行或者使用简单的tcp协议,现在微服务架构中网络就会非常的复杂,Docker的网络就是独立的虚拟网络

RPC框架组成部分

一个完整的RPC框架非常的复杂,包括了很多组件,例如服务注册,服务发现,均衡负载,容错,序列化,协议编码和网络传输协议。

我公司的架构实现了PHP的hyperf框架和golang的Gin框架之间跨语言的RPC调用,还有多个Hyperf功能服务之间调用,采用的协议是json-rpc,json-rpc轻量级远程调用协议,使用比较简单并且使用范围也比较广泛,还采用了consul这个软件来实现服务注册,服务发现和健康检查等功能,consul是google公司开源的一个用于服务发现、配置管理的中心服务软件,consul充当一个服务端接受服务注册,服务发现,负载均衡的功能。hyperf框架和Gin框架内置的rpc相关的包实现了数据序列化功能,让开发者不太需要注意其中的细节。

Gin框架主要是对图片,视频,音频进行处理,hyperf框架处理这些资源的时候会拖慢其他的接口速度。那么Gin框架组成的容器组就是生产者,hyperf框架组成的容器就是消费者。consul就提供了注册中心的角色。 他们的自建的关系就是:

erDiagram
consul }|--|{ Gin : "服务注册(生产者)"

consul }|--|{ Hyperf : "服务调用(消费者)"

看似简单,其实web框架和consul自己实现了很多细节,函数id映射,消息的序列化,反序列化,网络传输。

总结

先总结其中基本原理,如果要全部都了解到其中各种细节那怕要耗费大量的精力,下一篇准备了解其中让我非常感兴趣的序列化协议。