什么是RPC
本地过程调用
远程过程调用带来的3个问题
RPC的调用过程
RPC的具体过程如下
总结
RPC、HTTP、Restful之间的区别
通过httpserver实现rpc
- 首先一点需要明确:一定会发起一个网络请求,一定会有一个网络连接(tcp/udp),
a把远程的函数变成一个Http请求
- rpc_server.py
import json
from urllib.parse import urlparse, parse_qsl
from http.server import HTTPServer, BaseHTTPRequestHandler
host = ("", 8003)
class AddHandler(BaseHTTPRequestHandler):
def do_GET(self):
parsed_url = urlparse(self.path)
qs = dict(parse_qsl(parsed_url.query))
a = int(qs.get("a", 0))
b = int(qs.get("b", 0))
self.send_response(200)
self.send_header("Content-type", "application/json")
self.end_headers()
self.wfile.write(json.dumps(
{
"result": a + b
}
).encode("utf-8"))
if __name__ == '__main__':
server = HTTPServer(host, AddHandler)
print("Starting server, listen at: %s:%s" % host)
server.serve_forever()
- rpc_client.py
import requests
import json
# 版本一:
"""
rsp = requests.get("http://127.0.0.1:8003/?a=1&b=2")
# http调用,1. 每个函数调用我们都得记住url地址,参数如何传递的,返回数据如何解析的
# 我们想要的结果就是:Add函数调用就像本地函数调用一样
drsp = json.loads(rsp.text)
print(drsp, type(drsp))
"""
# 版本二:自己实现了一个demo级别的rpc封装
class Client(object):
def __init__(self, url):
self.url = url
def add(self, a, b):
rsp = requests.get(f"{self.url}?a={a}&b={b}")
return json.loads(rsp.text).get("result", 0)
# 这不就是写一个web服务器,无非就是自己封装下一client
client = Client("http://127.0.0.1:8003")
print(client.add(4, 2))
RPC开发的四大要素
RPC原理图
整个RPC调用过程
RPC需要使用到的术语