7. Menulis File .proto Pertama Anda: Panduan Lengkap Untuk Pemula
Ketika Anda mulai mengeksplor dunia sistem terdistribusi, integrasi mikroservis, atau komunikasi lintas bahasa, cepat atau lambat Anda akan berjumpa dengan Protocol Buffers (atau Protobuf). Protobuf adalah format serialisasi data yang dikembangkan oleh Google—yang selain ringan dan super cepat, juga mudah untuk didefinisikan lewat file .proto. Hari ini, saya akan membimbing Anda menulis file .proto pertama Anda secara step-by-step, lengkap dengan contoh kode, simulasi penggunaan, dan lempengan tips dari pengalaman nyata di industri.
Mari langsung mulai perjalanan kita!
Kenapa Protobuf?
Sebelum terjun ke kode, penting untuk tahu kenapa .proto begitu populer di kalangan engineer:
- Bahasa-agnostik: Satu file
.protobisa generate kode di berbagai bahasa (Go, Python, Java, C++, dll) - Ukuran pesan kecil & parsing cepat: Sangat hemat bandwidth dan CPU dibandingkan JSON/XML.
- Backward dan Forward compatibility: Tambah/ubah field tanpa memutus aplikasi lama.
Anatomy File .proto
Sebuah file .proto adalah blueprint—bukan hanya mendefinisikan bentuk data, tetapi juga service (operasi/endpoint) yang tersedia. Berikut komponen dasarnya:
| Komponen | Fungsi |
|---|---|
syntax | Versi syntax Protobuf yang digunakan (wajib, biasanya “proto3”) |
package | Namespace untuk menghindari konflik nama |
message | Struktur data semacam “class” |
enum | Tipe data enumerasi |
service | Untuk mendeskripsikan RPC services (opsional, pada gRPC) |
1. Menulis File .proto Pertama
Katakanlah kita ingin membuat layanan manajemen buku sederhana. Kita akan definisikan sebuah pesan “Book”, pesan request “GetBookRequest”, dan service “BookService”.
File: book.proto
syntax = "proto3";
package library;
// Enum untuk jenis buku
enum Genre {
GENRE_UNSPECIFIED = 0;
FICTION = 1;
NON_FICTION = 2;
SCIENCE = 3;
HISTORY = 4;
}
// Struktur data "Book"
message Book {
int32 id = 1;
string title = 2;
string author = 3;
Genre genre = 4;
repeated string tags = 5;
}
// Permintaan untuk mengambil data buku berdasarkan ID
message GetBookRequest {
int32 id = 1;
}
// Response untuk satu buku
message GetBookResponse {
Book book = 1;
}
// Service (gRPC)
service BookService {
rpc GetBook(GetBookRequest) returns (GetBookResponse) {}
}
Penjelasan Setiap Bagian
- Enum:
Genredengan nilai defaultGENRE_UNSPECIFIED = 0(field pertama enum wajib 0 pada proto3). - Book Message: Field diberi nomor (penting: once published, nomor field TIDAK BOLEH DIUBAH untuk menjaga kompatibilitas).
repeated string tags: berartitagsadalah array/list string.
- Service Block: Mendefinisikan RPC bernama
GetBook, menerimaGetBookRequest, mengembalikanGetBookResponse.
2. Alur Data BookService
Mari gambarkan bagaimana alur data saat client meminta data buku:
sequenceDiagram Client->>gRPC Server: GetBook(id=21) gRPC Server->>Database: Query book.id=21 Database-->>gRPC Server: Book record gRPC Server-->>Client: GetBookResponse(Book)
3. Simulasi Penggunaan File .proto
Setelah file .proto selesai, langkah berikutnya adalah meng-generate kode. Sebagai contoh, berikut simulasi di Python (pakai grpcio-tools):
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. book.proto
Akan menghasilkan file book_pb2.py dan book_pb2_grpc.py.
Sketsa Kode Server Sederhana (Python)
import grpc
from concurrent import futures
import book_pb2, book_pb2_grpc
FAKE_BOOK_DB = {
21: book_pb2.Book(id=21, title='Atomic Habits', author='James Clear', genre=book_pb2.FICTION, tags=['habit', 'self-development'])
}
class BookServiceServicer(book_pb2_grpc.BookServiceServicer):
def GetBook(self, request, context):
book = FAKE_BOOK_DB.get(request.id, None)
if book:
return book_pb2.GetBookResponse(book=book)
context.set_code(grpc.StatusCode.NOT_FOUND)
context.set_details('Book not found')
return book_pb2.GetBookResponse()
# Jalankan server
if __name__ == '__main__':
server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))
book_pb2_grpc.add_BookServiceServicer_to_server(BookServiceServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
print('Server running...')
server.wait_for_termination()
4. Tabel Perbandingan Struktur: Protobuf vs JSON
| Protobuf (binary) | JSON (textual) | |
|---|---|---|
| Ukuran | Sangat kecil | Relatif besar |
| Speed | Parsing sangat cepat | Parsing lambat |
| Evolusi | Mendukung kompatibilitas versi | Sulit, rentan typo/miss field |
| Kompat | Bisa lintas bahasa | Bisa, tapi kurang optimal |
| Typing | Lebih kuat/strict | Tidak ketat |
5. Tips Berharga Saat Menulis .proto
- Gunakan nomor field < 15 untuk akses termuda. (Nomor field 1-15 lebih efisien secara storage)
- Selalu set default value pada enum urutan pertama = 0.
- Jangan ganti meaning dari field existing (nomor, nama, atau tipe-nya) setelah di-publish.
- Pakai
repeatedhanya jika yakin field adalah list. - Namespace via
package, apalagi kalau lintas tim/proyek.
6. Kesimpulan
Menulis file .proto merupakan fondasi komunikasi modern APIs skala besar. Selain membuat contract yang eksplisit, Protobuf memungkinkan efisiensi, portabilitas, dan evolusi aplikasi secara mulus.
Sebagai engineer, memahami structure .proto, serta good practices-nya, akan membawa Anda ke level berikutnya, terutama ketika tim Anda butuh scale atau melakukan polyglot programming.
Sudah siap membuat file .proto pertama Anda sendiri? Silakan bereksperimen, dan jangan ragu share pertanyaan di kolom komentar!
Referensi lebih lanjut:
Selamat mencoba, dan semoga file .proto pertama Anda menjadi awal kolaborasi berstandar tinggi di tim engineering Anda! 🚀