RPC的入门应用

Posted pyedu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RPC的入门应用相关的知识,希望对你有一定的参考价值。

一、什么是RPC

RPC 的全称是 Remote Procedure Call ,是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即无论是调用本地接口/服务的还是远程的接口/服务,本质上编写的调用代码基本相同。

说起RPC,就不能不提到分布式,这个促使RPC诞生的领域。

假设你有一个计算器接口,Calculator模块,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你要调用Calculator的add方法来执行一个加运算,直接实例一个CalculatorImpl对象,然后调用add方法就行了,这其实就是非常普通的本地函数调用,因为在同一个地址空间,或者说在同一块内存,所以可以直接实现。

技术图片

 

 现在,基于高性能和高可靠等因素的考虑,你决定将系统改造为分布式应用,将很多可以共享的功能都单独拎出来,比如上面说到的计算器,你单独把它放到一个服务里头,让别的服务去调用它。

技术图片

这下问题来了,服务A里头并没有CalculatorImpl这个类,那它要怎样调用服务B的CalculatorImpl的add方法呢?

有同学会说,可以模仿B/S架构的调用方式呀,在B服务暴露一个Restful接口,然后A服务通过调用这个Restful接口来间接调用CalculatorImpl的add方法。

很好,这已经很接近RPC了,不过如果是这样,那每次调用时,是不是都需要写一串发起http请求的代码呢?比如
res=requests.get("URL") 
 
但是,两个问题:
1、http协议较为复杂,效率低,相对笨重
2、调用方式不像本地调用简单方便,让调用者感知不到远程调用的逻辑。

二 如何实现RPC

2.1 RPC实现原理

实际情况下,RPC很少用到http协议来进行数据传输,毕竟我只是想传输一下数据而已,何必动用到一个文本传输的应用层协议呢,所以一般会选择直接传输二进制数据

不管你用何种协议进行数据传输,一个完整的RPC过程,都可以用下面这张图来描述:

 
技术图片
 

以左边的Client端为例,Application就是rpc的调用方,Client Stub就是我们上面说到的代理对象,也就是那个看起来像是Calculator的实现类,其实内部是通过rpc方式来进行远程调用的代理对象,至于Client Run-time Library,则是实现远程调用的工具包,比如python的socket模块,最后通过底层网络实现实现数据的传输。

这个过程中最重要的就是序列化反序列化了,因为数据传输的数据包必须是二进制的,你直接丢一个python对象过去,人家可不认识,你必须把python对象序列化为二进制格式,传给Server端,Server端接收到之后,再反序列化为python对象。

2.2 python实现RPC

# 客户端

import rpyc

# 参数主要是host, port
conn = rpyc.connect(localhost, 9999)
# test是服务端的那个以"exposed_"开头的方法
print(start)
for i in range(100):
    cResult = conn.root.cal(i)
    print(cResult)
print(end)

conn.close()

# 服务端
from rpyc import Service
from rpyc.utils.server import ThreadedServer


class TestService(Service):

    # 对于服务端来说, 只有以"exposed_"打头的方法才能被客户端调用,所以要提供给客户端的方法都得加"exposed_"
    def exposed_cal(self, num):
        return  num*2

sr = ThreadedServer(TestService, port=9999, auto_register=False)
sr.start()

 

 



以上是关于RPC的入门应用的主要内容,如果未能解决你的问题,请参考以下文章

dubbo入门--原理应用实例

thrift入门

RPC ---- RPC入门了解 & 最简单的RPC的实现

RPC ---- RPC入门了解 & 最简单的RPC的实现

高性能RPC框架——Dubbo一站式快速入门

达人报到高性能 RPC 框架 Dubbo 从入门到深入