1分钟入门RPC

2022-06-17 08:26:42 浏览数 (1)

什么是 RPC?

RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。在我们日常的开发中使用很是广泛,尤其是在分布式系统中。

RPC 和 HTTP 有什么区别?

RPC 要求客户端和服务端使用的协议及版本必须一致,而 HTTP 则屏蔽了这部分。假如你的服务端是在 Linux 上用 Go 语言开发的,而客户端是在 windows 上用 Java 开发的,此时你应当选择 HTTP

RPC 通常用于微服务内部通信,当你需要使用中间件进行请求转发的时候,你应当选择 HTTP

当某个服务的请求量很大且频繁时,对于同等的请求,由于 HTTP 的报文比 RPC 要大很多,所以你应当选择 RPC

小结

  1. HTTP 灵活,跨平台&语言。
  2. HTTP 相比 RPC 更简单。
  3. RPC 比 HTTP 更快。

一个例子认识 RPC

服务端

代码语言:javascript复制
from xmlrpc.server import SimpleXMLRPCServer

# lcoal function
def sayHi(name):
    print(f'Hi {name}!')
    return f'Hi {name}!'

if __name__ == '__main__':
    # server instance
    server = SimpleXMLRPCServer(('127.0.0.1',8889),allow_none=True)

    # register function to rpc server
    # after registered, local function can be call in rpc client
    server.register_function(sayHi)
    print(f'server listening on 127.0.0.1:8889')

    # start rpc server
    server.serve_forever()

客户端

代码语言:javascript复制
from xmlrpc.client import ServerProxy

if __name__ == '__main__':

    # start rpc client
    with  ServerProxy('http://127.0.0.1:8889',allow_none=True) as client:

        # call server function sayHi
        res = client.sayHi('phyger')
        print(res)

如上,我们可以看到客户端成功调用了服务端的方法并且返回了期望的结果。

RPC 流程简析

RPC 服务端实际是基于 TPCsocket 连接,它将服务暴露在主机的某个端口上,客户端通过这个端口和服务端建立连接,然后调用 RPC API,让服务端的方法在服务端运行,同时服务端将返回值发送给客户端。

更好用的 RPC 库

因为 xmlrpcPython 自带的,而且无法跨语言,鉴于此,有大神就推出了一款更加人性化的 RPC 库:hprose(High-Performance Remote Object Service Engine)

hprose 可以跨语言使用,目前其支持 Java.NETGolangPHPCPython 等超过 20 种语言。

服务端

代码语言:javascript复制
# from xmlrpc.server import SimpleXMLRPCServer

# # lcoal function
# def sayHi(name):
#     print(f'Hi {name}!')
#     return f'Hi {name}!'

# if __name__ == '__main__':
#     # server instance
#     server = SimpleXMLRPCServer(('127.0.0.1',8889),allow_none=True)

#     # register function to rpc server
#     # after registered, local function can be call in rpc client
#     server.register_function(sayHi)
#     print(f'server listening on 127.0.0.1:8889')

#     # start rpc server
#     server.serve_forever()

import hprose

def sayHi(name):
    print(f'Hi,{name}!')
    return f'Hi,{name}!'

def sayBye(name):
    print(f'Bye,{name}!')
    return f'Bye,{name}!'

def main():
    # create rpc server instance
    server = hprose.HttpServer(host='localhost',port=8880)

    # add single function
    # server.addFunction(sayHi)

    # add more functions
    server.addFunctions([sayHi,sayBye])

    # start rpc server
    server.start()

if __name__ == '__main__':
    print('server listening on localhost:8880')
    main()

客户端

代码语言:javascript复制
import hprose

def main():
    # start rpc client
    client = hprose.HttpClient('http://localhost:8880')

    # call server function sayHi & sayBye
    res1 = client.sayHi('Python测试和开发')
    res2 = client.sayBye('Python测试和开发')
    print(res1,'n' res2)

if __name__ == '__main__':
    main()

以上就是今天的全部内容了,感谢您的阅读,我们下节再会。

0 人点赞