lotrpc: RPC abstraction layer
lotrpc unifies a lot of RPC protocols.
protocols:
- XML-RPC http://xmlrpc.scripting.com/
- JSON RPC https://www.jsonrpc.org/specification
- MessagePack RPC https://msgpack.org/
- gRPC https://grpc.io/
- ZeroRPC https://www.zerorpc.io/
One RPC to rule them all, One RPC to find them, One RPC to bring them all, and in the darkness bind them.
install
- python -m venv your-dir
- cd your-dir
- ./bin/pip install lotrpc
install head
- python -m venv your-dir
- cd your-dir
- ./bin/pip install -r https://github.com/wtnb75/lotrpc/raw/master/requirements.txt
- ./bin/pip install -e "git+https://github.com/wtnb75/lotrpc.git#egg=lotrpc"
Usage
client-server example
- xmlrpc
- ./bin/python -m lotrpc.clsrv server xml
- ./bin/python -m lotrpc.clsrv client xml
- ./bin/python -m lotrpc.clsrv benchmark xml --filter 'name!~process'
- json-rpc
- ./bin/python -m lotrpc.clsrv server json
- ./bin/python -m lotrpc.clsrv client json
- curl -X POST -d '{"method":"hello", "jsonrpc":"2.0", "params":["a","b","c"]}' http://localhost:9999/
- ./bin/python -m lotrpc.clsrv benchmark json
- curl -X POST -d '{"method":"hello", "jsonrpc":"2.0", "params":["a","b","c"]}' http://localhost:9999/
- msgpack-rpc
- ./bin/python -m lotrpc.clsrv server msgpack
- ./bin/python -m lotrpc.clsrv client msgpack
- ./bin/python -m lotrpc.clsrv benchmark mp --filter 'name!~process'
- ./bin/python -m lotrpc.clsrv benchmark msgpack --filter 'name=sync'
- msgpack-rpc with mprpc
- ./bin/python -m lotrpc.clsrv server mp
- ./bin/python -m lotrpc.clsrv client mp
- ./bin/python -m lotrpc.clsrv benchmark mp --filter 'name!~process'
- ./bin/python -m lotrpc.clsrv benchmark msgpack --filter 'name=sync'
- grpc
- ./bin/python -m lotrpc.clsrv server grpc --options '{"source":"examples/grpc/hello.proto"}'
- ./bin/python -m lotrpc.clsrv client grpc --options '{"source":"examples/grpc/hello.proto"}' --method Greeter.SayHello --params '{"name":"xyzxyz"}'
- ./bin/python -m lotrpc.clsrv benchmark grpc --options '{"source":"examples/grpc/hello.proto"}' --method Greeter.SayHello --params '{"name":"xyzxyz"}' --filter 'name!~process'
- zerorpc
- ./bin/python -m lotrpc.clsrv server zero
- ./bin/python -m lotrpc.clsrv client zero
- ./bin/zerorpc --json tcp://localhost:9999 hello '{"hello":"world"}'
- ./bin/python -m lotrpc.clsrv benchmark zero --filter 'name!~process'
client usage (CLI)
# ./bin/python -m lotrpc.clsrv
Usage: clsrv.py [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
benchmark start benchmark client
client serialized client
client-async client with asyncio
client-pool client with thread pool
client-ppool client with process pool
listmode list rpc mode
proxy start proxy server
proxy-auth start proxy with authentication example
server start server
# ./bin/python -m lotrpc.clsrv client --help
Usage: clsrv.py client [OPTIONS] [MODE] [ADDR]
serialized client
Options:
--options TEXT
--num INTEGER
--method TEXT
--params TEXT
--verbose / --no-verbose
--help Show this message and exit.
# ./bin/python -m lotrpc.clsrv client json http://localhost:9999/endpoint --method hello --params '{"hello":"world"}'
# nc -l 9999
POST /endpoint HTTP/1.1
Host: localhost:9999
User-Agent: python-requests/2.21.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
content-type: application/json
Content-Length: 76
{"method": "hello", "params": {"hello": "world"}, "jsonrpc": "2.0", "id": 0}
client usage (Python)
import lotrpc
# JSON RPC
cl = lotrpc.json.Client("http://localhost:9999/endpoint")
# XML-RPC
cl = lotrpc.xml.Client("http://localhost:9999/endpoint")
# MessagePack-RPC
cl = lotrpc.msgpack.Client("http://localhost:9999/endpoint")
# ZeroRPC
cl = lotrpc.zero.Client("http://localhost:9999/endpoint")
## call it
res = cl.call("hello", {"hello": "world"})
print(res)
server(dispatcher) usage (Python)
import lotrpc
class HelloDispatcher(lotrpc.SimpleDispatcher):
def do_hello(self, params):
return {"result": "OK1"}
def do_goodbye(self, params):
return {"result": "OK2"}
# JSON RPC
srv = lotrpc.json.Server("http://localhost:9999/endpoint")
# XML-RPC
srv = lotrpc.xml.Server("http://localhost:9999/endpoint")
# MessagePack-RPC
srv = lotrpc.msgpack.Server("http://localhost:9999/endpoint")
# ZeroRPC
srv = lotrpc.zero.Server("http://localhost:9999/endpoint")
## serve it
srv.serve(HelloDispatcher())
proxy
- (client) -> xmlrpc -(proxy)-> jsonrpc (server)
- ./bin/python -m lotrpc.clsrv proxy xml http://localhost:9999/ json http://localhost:9998/
- ./bin/python -m lotrpc.clsrv server json http://localhost:9998/
- ./bin/python -m lotrpc.clsrv client xml http://localhost:9999/
does not work...
- client
- grpc + process pool
- msgpack + process pool
- xml + process pool
- zero + process pool
- aioxml + thread pool, process pool, asyncio
- aiojson + thread pool, process pool, asyncio
- client-server
- server=mp, client=msgpack
- server cannot work async
- aioxml
- aiojson
- zero
- xml
- mp
TODO
- Work in Progress
- Sun RPC
- (for test) ./bin/python -m lotrpc.rpcgen
- Sun RPC
- Golang net/rpc
- BSON RPC
- thrift
- Java RMI