Standardmäßig verwendet gRPC :doc:`../../serialisation-formats/protobuf` zur Serialisierung von Daten, obwohl sie auch mit anderen Datenformaten wie JSON funktionieren.
Der erste Schritt bei der Arbeit mit Protocol-Buffers besteht darin, die
Struktur für die Daten zu definieren, die ihr in einer .proto-Datei
serialisieren möchtet. Protocol-Buffers-Daten sind als Nachrichten
strukturiert, wobei jede Nachricht ein kleiner logischer Datensatz ist, der eine
Reihe von Name-Wert-Paaren enthält, die fields genannt werden.
:download:`accounts.proto` ist ein einfaches Beispiel hierfür:
.. literalinclude:: accounts.proto :caption: accounts.proto :name: accounts.proto :language: proto :lines: 1-7
Warning
Beachtet bitte, dass ihr üblicherweise nicht einfach uint32 für
User- oder Group-IDs verwenden solltet, da diese viel zu einfach zu erraten
wären. Hierfür könnt ihr :abbr:`z.B. (zum Beispiel)` eine
RFC 4122-konforme Implementierung verwenden. Eine entsprechende
Protobuf-Konfiguration findet ihr in :download:`rfc4122.proto`.
Nachdem ihr eure Datenstruktur definiert habt, könnt ihr das
Protocol-Buffer-Compiler-Protokoll protoc verwenden, um Deskriptoren in
eurer bevorzugten Sprache zu erzeugen. Dieses bietet einfache Zugriffsfunktionen
für jedes Feld sowie Methoden zur Serialisierung der gesamten Struktur. Wenn
eure Sprache z.B. Python ist, werden beim Ausführen des Compilers für das obige
Beispiel Deklaratoren generiert, die ihr dann in eurer Anwendung zum Einpflegen,
Serialisieren und Abrufen von Protocol-Buffer-Nachrichten verwenden könnt.
gRPC-Dienste werden ebenfalls in den .proto-Dateien definiert, wobei die
RPC-Methodenparameter und Rückgabetypen als Protocol-Buffer-Nachrichten
angegeben werden:
.. literalinclude:: accounts.proto :caption: accounts.proto :name: accounts.proto :language: proto :lines: 8-
$ pipenv install grpcio grpcio-tools
$ pipenv run python -m grpc_tools.protoc --python_out=. --grpc_python_out=. accounts.protoDies erzeugt zwei Dateien:
- :download:`accounts_pb2.py`
- enthält Klassen für die in
accounts.protodefinierten Messages. - :download:`accounts_pb2_grpc.py`
- enthält die definierten Klassen
AccountsStubfür den Aufruf von RPCs,AccountsServicerfür die API-Definition des Services und eine Funktionadd_AccountsServicer_to_serverfür den Server.
Hierfür schreiben wir die Datei :download:`accounts_server.py`:
.. literalinclude:: accounts_server.py :caption: accounts_server.py :name: accounts_server.py :language: python
Hierfür schreiben wir die Datei :download:`accounts_client.py`:
.. literalinclude:: accounts_client.py :caption: accounts_client.py :name: accounts_client.py :language: python
Starten des Servers in einem Terminal:
$ pipenv run python accounts_server.pyStarten des Clients von einem anderen Terminal aus:
$ pipenv run python accounts_client.py Account created: tom