Was ist Prost und warum wird es benötigt?
Prost ist eine leistungsstarke und effiziente Bibliothek für die Programmiersprache Rust, die für die Arbeit mit Protocol Buffers (protobuf) entwickelt wurde. Protocol Buffers ist ein von Google entwickelter Mechanismus zur Serialisierung strukturierter Daten, der im Vergleich zu JSON oder XML kompakter und schneller ist.
Prost löst mehrere zentrale Aufgaben:
- Code-Generierung: Erstellt automatisch Rust-Strukturen aus
.proto-Dateien und erspart dem Entwickler so mühsame Handarbeit. - Serialisierung und Deserialisierung: Wandelt Daten aus dem binären Protobuf-Format in Rust-Strukturen um und zurück.
- Hohe Leistung: Nutzt Zero-Copy und effizientes Speichermanagement, was es zu einer der schnellsten Lösungen für Protobuf in Rust macht.
- Sicherheit: Vollständig in Rust geschrieben, was Speicher- und Thread-Sicherheit garantiert.
Die Bibliothek ist besonders nützlich in Microservice-Architekturen, Datenaustauschsystemen zwischen Diensten, Konfigurationsspeicherung und allen Szenarien, die eine effiziente Serialisierung erfordern.
Installation
Prost wird über den Paketmanager Cargo installiert. Fügen Sie folgende Abhängigkeiten zu Ihrer Cargo.toml hinzu:
[dependencies]
prost = "0.12"
prost-build = "0.12"
tonic = "0.11" # optional, für gRPC
bytes = "1.5" # für die Arbeit mit Puffern
[build-dependencies]
prost-build = "0.12"
Außerdem benötigen Sie den Protobuf-Compiler (protoc). Unter Ubuntu/Debian:
sudo apt install protobuf-compiler
Unter macOS:
brew install protobuf
Unter Windows laden Sie das Binary aus dem offiziellen Protobuf-Repository herunter und fügen es zum PATH hinzu.
Schnellstart
Erstellen Sie eine Datei person.proto:
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
repeated string phone_numbers = 3;
}
Erstellen Sie build.rs im Projektverzeichnis:
fn main() -> Result<(), Box<dyn std::error::Error>> {
prost_build::compile_protos(&["src/person.proto"], &["src/"])?;
Ok(())
}
Jetzt in main.rs:
use prost::Message;
// Der generierte Code befindet sich im Modul person
pub mod person {
include!(concat!(env!("OUT_DIR"), "/person.rs"));
}
fn main() {
// Objekt erstellen
let person = person::Person {
name: "Max Mustermann".to_string(),
age: 30,
phone_numbers: vec!["+49-123-456-789".to_string()],
};
// In Bytes serialisieren
let mut buf = Vec::new();
person.encode(&mut buf).unwrap();
println!("Serialisiert: {} Bytes", buf.len());
// Zurück deserialisieren
let decoded = person::Person::decode(&buf[..]).unwrap();
println!("Name: {}, Alter: {}", decoded.name, decoded.age);
}
Wichtige Methoden und Funktionen
1. Message::encode
Funktion: Serialisiert eine Nachricht in das binäre Protobuf-Format und schreibt sie in einen Puffer.
Parameter:
&self— Referenz auf die Nachrichtbuf: &mut impl BufMut— Puffer zum Schreiben (normalerweiseVec<u8>)
Beispiel:
let mut buf = Vec::new();
my_message.encode(&mut buf).unwrap();
2. Message::decode
Funktion: Deserialisiert Bytes zurück in eine Rust-Struktur.
Parameter:
buf: impl Buf— Byte-Quelle (Slice, Vec, Bytes)
Beispiel:
let decoded = MyMessage::decode(&buf[..]).unwrap();
3. Message::encod
Auch in der Bibliothek
Überwachung von Go-Anwendungen: Bibliotheken und Tools
Caching in Node.js: Redis und Alternativen zur Beschleunigung von Anwendungen
Redis-Client für Java: Jedis, Lettuce und Redisson – Überblick und Beispiele