前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1分钟入门RPC

1分钟入门RPC

作者头像
Python研究所
发布2022-06-17 08:26:42
3170
发布2022-06-17 08:26:42
举报
文章被收录于专栏:大飞的部落阁

什么是 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()

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 RPC?
  • RPC 和 HTTP 有什么区别?
  • 小结
  • 一个例子认识 RPC
    • 服务端
      • 客户端
        • RPC 流程简析
        • 更好用的 RPC 库
          • 服务端
            • 客户端
            相关产品与服务
            消息队列 TDMQ
            消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档