lotrpc

RPC abstraction layer


Keywords
rpc, proxy, grpc, zerorpc, json, xml, messagepack
License
MIT
Install
pip install lotrpc==0.1.1

Documentation

lotrpc: RPC abstraction layer

lotrpc unifies a lot of RPC protocols.

protocols:

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

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
  • 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

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
  • Golang net/rpc
  • BSON RPC
  • thrift
  • Java RMI

Links