Skip to main content

GRPC support for Muffin framework.

Project description

Muffin-GRPC – GRPC support for Muffin framework.

Features:

  • Automatically build proto files and python helpers for them;

  • Automatically connect to default channel;

  • Automatically create and run GRPC server from your services;

Tests Status PYPI Version

Requirements

  • python >= 3.7

Installation

Muffin-GRPC should be installed using pip:

pip install muffin-grpc

Usage

Setup the plugin and connect it into your app:

from muffin import Application
from muffin_grpc import Plugin as GRPC

# Create Muffin Application
app = Application('example')

# Initialize the plugin
# As alternative: grpc = GRPC(app, **options)
grpc = GRPC(default_channel='server:50051')
grpc.setup(app)

Lets build a simple helloworld service, with the proto:

syntax = "proto3";

package helloworld;

service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
    string name = 1;
}

message HelloReply {
    string message = 1;
}

Put it somewhere and add the file into the grpc plugin:

grpc.add_proto('project_name/proto/helloworld.proto')

Run the command to build proto files:

$ muffin project_name grpc_build

The command will build the files:

  • project_name/proto/helloworld_pb2.py - with the proto’s messages

  • project_name/proto/helloworld_pb2_grpc.py - with the proto’s GRPC services

  • project_name/proto/helloworld.py - with the messages and services together

  • project_name/proto/__init__.py - to make the build directory a package

Let’s implement the Greeter service:

from .proto.helloworld import GreeterServicer, HelloRequest, HelloReply

# Connect the service to GRPC server
@grpc.add_to_server
class Greeter(GreeterServicer):

    async def SayHello(self, request: HelloRequest,
                    context: grpc_aio.ServicerContext) -> HelloReply:
        return HelloReply(message='Hello, %s!' % request.name)

Run the server with the command:

$ muffin package_name grpc_server

The server is working and accepts GRPC request, let’s start building a client

from .proto.helloworld import GreeterStub, HelloRequest

@app.route('/')
async def index(request):
    name = request.url.query.get('name') or 'anonymous'
    try:
        async with grpc.channel() as channel:
            stub = GreeterStub(channel)
            response = await stub.SayHello(
                HelloRequest(name=request.url.query['name']), timeout=10)
            message = response.message

    except AioRpcError as exc:
        message = exc.details()

    return message

The / endpoint will make a request to the GRPC server and return a message from the server.

Configuration options

Name

Default value

Desctiption

build_dir

None

A directory to build proto files

server_listen

"[::]:50051"

Server address

ssl_server

False

Enable SSL for server

ssl_server_params

None

SSL Server Params

ssl_client

False

Enable SSL for client

ssl_client_params

None

SSL Client Params

default_channel

localhost:50051

Default Client Channel Address

default_channel_options

{}

GRPC options for the default channel

You are able to provide the options when you are initiliazing the plugin:

grpc.setup(app, server_listen='localhost:40000')

Or setup it from Muffin.Application configuration using the GRPC_ prefix:

GRPC_SERVER_LISTERN = 'locahost:40000'

Muffin.Application configuration options are case insensitive

CLI Commands

$ muffin project_name grpc_build --help

usage: muffin grpc_build [-h]

Build registered proto files.

optional arguments:
-h, --help  show this help message and exit
$ muffin project_name grpc_server --help

usage: muffin grpc_server [-h]

Start GRPC server with the registered endpoints.

optional arguments:
-h, --help  show this help message and exit

Bug tracker

If you have any suggestions, bug reports or annoyances please report them to the issue tracker at https://github.com/klen/muffin-grpc/issues

Contributing

Development of Muffin-GRPC happens at: https://github.com/klen/muffin-grpc

Contributors

  • klen (Kirill Klenov)

License

Licensed under a MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

muffin-grpc-0.3.1.tar.gz (12.2 kB view details)

Uploaded Source

Built Distribution

muffin_grpc-0.3.1-py3-none-any.whl (10.3 kB view details)

Uploaded Python 3

File details

Details for the file muffin-grpc-0.3.1.tar.gz.

File metadata

  • Download URL: muffin-grpc-0.3.1.tar.gz
  • Upload date:
  • Size: 12.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for muffin-grpc-0.3.1.tar.gz
Algorithm Hash digest
SHA256 a6a2ba64ca36250f78b4e87d89abdc54622fcbe7ed0437653eb7bc12a2698819
MD5 4e2bfab6538d1d72daa65b517d7a6bda
BLAKE2b-256 42cdc1ce9d5b6f198de55f42efa90456b3765bccc9786918cac95894fc6d4ff6

See more details on using hashes here.

File details

Details for the file muffin_grpc-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: muffin_grpc-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 10.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for muffin_grpc-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c0fe338e38c3c6cc6f389b4ef08c1973537717451818ba230089ee5b764aceca
MD5 1ceace6b887f59da954900f2cf22cf66
BLAKE2b-256 7bdbefb0eca0e1e011f4cfe52bd5499d11432ad5f1cb574b8cabab1b9b0e6e92

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page