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
Links
Metadata
Release files for lotrpc 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| lotrpc-0.1.2-py3-none-any.whl | Python 3 | none | any | Details for lotrpc-0.1.2-py3-none-any.whl |
Release files / lotrpc-0.1.2-py3-none-any.whl
| Download URL | lotrpc-0.1.2-py3-none-any.whl |
|---|---|
| Size | 23.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4e4dfb66ae4df361fdb7bb5f238706bfaf5bea6405e2cff300117baae04cc8e8
|
|
BLAKE2b-256 checksum How to use checksums |
1f24a9c0a5070fb8bbbd19ea784d8d12978f239f584627b31739283380a59191
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.8.1
|
Security for lotrpc 0.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.