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.
