0%

RPC 原理

RPC 是Remote Procedure Call的缩写,译为远程过程调用。是一个计算机通信协议。


概述

现在互联网应用的量级越来越大,单台计算机的能力有限,需要借助可扩展的计算机集群来完成。

上面是一个简单的软件系统结构,拆分出来用户系统和订单系统做为服务存在,让不同的站点去调用。

由于各服务部署在不同机器上,要想在服务间进行远程调用免不了网络通信过程,
服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。

这时如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,
那么将大大提高生产力,比如服务消费方在执行orderService.buy(“HHKB键盘”)时,
实质上调用的是远端的服务。这种方式其实就是 RPC。而提供了这种功能的工具我们称之为RPC框架。

RPC(Remote Procedure Call) 即远程过程调用,允许一台计算机调用另一台计算机上的程序得到结果,
而代码中不需要做额外的编程,就像在本地调用一样。
通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术。
使用RPC可以解耦系统,方便维护,同时增加系统处理请求的能力。

框架原理

在 RPC 框架中主要有三个角色: Provider、Consumer和Registry。如下图所示

  • Server: 暴露服务的服务提供方。
  • Client: 调用远程服务的服务消费方。
  • Registry: 服务注册与发现的注册中心。

基本流程

一次完整的RPC调用流程(同步调用,异步另说)如下:

1)服务消费方(client)调用以本地调用方式调用服务;
2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
3)client stub找到服务地址,并将消息发送到服务端;
4)server stub收到消息后进行解码;
5)server stub根据解码结果调用本地的服务;
6)本地服务执行并将结果返回给server stub;
7)server stub将返回结果打包成消息并发送至消费方;
8)client stub接收到消息,并进行解码;
9)服务消费方得到最终结果。

RPC框架的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。

服务注册中心

服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表

服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和 Failover

开源RPC框架

Dubbo

Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前已经进入Apache孵化器。

Motan

Motan是新浪微博开源的一个Java RPC框架。2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。

gRPC

gRPC是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。

thrift

thrift是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。

实践

一个RPC框架大致需要动态代理、序列化、网络请求、网络请求接受(netty实现)、动态加载、反射这些知识点。
现在开源及各公司自己造的RPC框架层出不穷,唯有掌握原理是一劳永逸的。
掌握原理最好的方法莫不是阅读源码,自己动手写是最快的。

可以尝试借鉴优秀的 Demo 入手

http://github.com/yangzhenkun/krpc
https://github.com/TFdream/mango

因水平问题。。。本人只了解到原理层面。动手实践还是有点难度。后续争取补上自己的 rpc demo


参考链接