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:
- Szolgáltatások és metódusok: Egy .proto fájlban határozzuk meg a szolgáltatásokat, illetve azok távoli hívható metódusait.
- Kliens és szerver oldali kódgenerálás: Protobuf alapján automatikusan létrejönnek az interfészek és adattípusok.
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
- Authentication – Hitelesítési módszerek, beleértve saját mechanizmusok beépítését.
- Benchmarking – Teljesítménymérés eszközei és módszerei.
- Cancellation – RPC hívások megszakítása.
- Compression – Adatok tömörítése az átvitel előtt.
- Custom Backend Metrics – Saját metrikák gyűjtése szerver és kliens oldalon.
- Custom Load Balancing Policies – Egyedi terheléselosztási szabályok implementálása.
- Custom Name Resolution – Névfeloldás testreszabása.
- Deadlines – Határidők használata megbízhatatlan háttérszolgáltatások esetén.
- Debugging – Hibakeresés grpcdebug eszközzel.
- Error Handling – Hibakezelés és státuszkódok értelmezése.
- Flow Control – Manuális adatfolyam-vezérlés.
- Graceful Shutdown – Szerverek leállítása az ügyfelek megszakítása nélkül.
- Health Checking – Egészségügyi ellenőrzés támogatása szerver és kliens oldalon.
- Interceptors – Köztes rétegek alkalmazása általános funkcionalitásokhoz.
- Keepalive – HTTP/2 alapú kapcsolatébrentartás.
- Metadata – Kiegészítő adatok küldése fejlécekkel.
- OpenTelemetry Metrics – Megfigyelhetőség, mérőszámok gyűjtése.
- Performance Best Practices – Nyelvfüggő teljesítményoptimalizálási tanácsok.
- Reflection – Szolgáltatásleírások lekérdezése futásidőben.
- Request Hedging – Késleltetett kérések párhuzamos újraküldése.
- Retry – Újrapróbálkozás szabályozása részletesen.
- Service Config – Szolgáltatáskonfigurációs fájl kliens viselkedés befolyásolására.
- Status Codes – Részletes státuszkód lista és jelentések.
- Wait-for-Ready – Várakozás, míg a szerver készen áll a kiszolgálásra.
Feladatok
- Próbáljuk ki a Deadlines módszert, hogyan lehet timeout-okat szabályosan kezelni.