一分钟入门RPC

简介: 一分钟入门RPC

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


服务端


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()
复制代码


网络异常,图片无法展示
|


客户端


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 种语言。


服务端


# 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()
复制代码


网络异常,图片无法展示
|


客户端


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()
复制代码


网络异常,图片无法展示
|


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

相关文章
|
Dubbo Java 应用服务中间件
Netty入门到超神系列-手撸简单版RPC框架(仿Dubbo)
原理还是比较简单 : 代理 + 线程池 + Netty 下面做一些解释: 首先需要定义一个统一的API接口,例:UserApi , 服务端(provider)需要实现这个接口,提供相应的方法UserApiImpl#save,客户端通过远程来调用该接口。 然后需要约定一个协议,服务器如何才能识别到客户端要调用哪个接口?:我这里用 “接口权限定名#方法名#参数” ,的方式来,因为是一个简单版本的RPC。服务端解析该内容就能匹配对应的接口的实现类,然后调用该方法。并把方法的返回值通过Netty写回给客户端 使用的编解码器都是比价简单的String的编解码器
177 0
|
存储 JavaScript Linux
开源 Golang 微服务入门二:RPC 框架 Kitex| 青训营笔记
Kitex 字节跳动内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用。如果对微服务性能有要求,又希望定制扩展融入自己的治理体系,Kitex 会是一个不错的选
306 0
开源 Golang 微服务入门二:RPC 框架 Kitex| 青训营笔记
|
JSON 网络协议 Dubbo
gRPC(一)入门:什么是RPC?
RPC是一种方法,而HTTP是一种协议。两者都常用于实现服务,在这个层面最本质的区别是RPC服务主要工作在TCP协议之上(也可以在HTTP协议),而HTTP服务工作在HTTP协议之上。由于HTTP协议基于TCP协议,所以RPC服务天然比HTTP更轻量,效率更胜一筹。
430 0
gRPC(一)入门:什么是RPC?
|
XML JSON 编解码
Go微服务(一)——RPC详细入门
Go微服务(一)——RPC详细入门
157 0
Go微服务(一)——RPC详细入门
|
安全 Dubbo 测试技术
软件测试|不会Python RPC,一篇文章教你入门
软件测试|不会Python RPC,一篇文章教你入门
软件测试|不会Python RPC,一篇文章教你入门
|
负载均衡 算法 应用服务中间件
Netty框架入门(二)之基于Netty实现简单的Rpc调用
Netty框架入门(二)之基于Netty实现简单的Rpc调用
200 0
Netty框架入门(二)之基于Netty实现简单的Rpc调用
|
XML Dubbo 应用服务中间件
RPC原理及Dubbo入门
现在互联网公司没有不用分布式的,看看招聘岗位都要求着Dubbo,Spring Cloud等等。 关于Dubbo,不好意思去说,我所在的公司比较小,架构相对没有那么复杂,服务也没那么多,就没在生产环境用Dubbo,面试官问我用过Dubbo的时候,我心里好纠结啊,我只在本地做过Demo,不过不管有没有用过,能回答上有关Dubbo的问题,就能证明你懂这个。
|
1月前
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。