rpc基础讲解

什么是RPC

本地过程调用

远程过程调用带来的3个问题

RPC的调用过程

RPC的具体过程如下

总结

RPC、HTTP、Restful之间的区别


通过httpserver实现rpc

  • 首先一点需要明确:一定会发起一个网络请求,一定会有一个网络连接(tcp/udp),
    a把远程的函数变成一个Http请求
  1. 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()

  1. 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需要使用到的术语

posted @ 2021-12-18 14:16  专职  阅读(177)  评论(0编辑  收藏  举报