Table of Contents

gRPC

gRPC egy modern, nyílt forráskódú távoli eljáráshívást (Remote Procedure Call - RPC) megvalósító álltalános keretrendszer, amelyet a Google fejlesztett. Lehetővé teszi, hogy különböző platformokon és nyelveken írt alkalmazások egyszerűen kommunikáljanak egymással. gRPC protokollja alapértelmezetten Protocol Buffers-t (protobuf) használ.

Alapvető koncepciók:

Mintapélda

Hozzunk létre egy virtuális környezetet:

  python -m virtualenv ./venv

Majd aktiváljuk:

  ./venv/Scripts/activate

Telepítsük a függőségeket:

  python -m pip install grpcio
  python -m pip install grpcio-tools

Hozzuk létre a ./proto könvytárat és benne a IDL fájlt helloworld.proto néven:

syntax = "proto3";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

Futtassuk a stub generátort az alábbi paranccsal:

  python -m grpc_tools.protoc -I ./protos/ --grpc_python_out=. --python_out=. .\protos\helloworld.proto

A helloworld_pb2.py és helloworld_pb2_grpc.py fájlok létrejönnek a gyökérben.

A kliens és a szerver kódja az alábbi lesz:

greeter_client.py

import grpc
import helloworld_pb2
import helloworld_pb2_grpc

def run():
    print("Will try to greet world ...")
    with grpc.insecure_channel("localhost:50051") as channel:
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        response = stub.SayHello(helloworld_pb2.HelloRequest(name="you"))
    print("Greeter client received: " + response.message)
    
if __name__ == "__main__":
    run()

greeter_server.py

from concurrent import futures

import grpc
import helloworld_pb2
import helloworld_pb2_grpc


class Greeter(helloworld_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        return helloworld_pb2.HelloReply(message="Hello, %s!" % request.name)

def serve():
    port = "50051"
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    server.add_insecure_port("[::]:" + port)
    server.start()
    print("Server started, listening on " + port)
    server.wait_for_termination()


if __name__ == "__main__":
    serve()

Indítsuk el a szervert és klienst.

Haladó lehetőségek

https://grpc.io/docs/guides/

Feladatok

  1. Próbáljuk ki a Deadlines módszert, hogyan lehet timeout-okat szabályosan kezelni.