Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
15 Jun 2025 · 4 mnt baca ·Artikel 7 / 110
Go

7 Menulis File `.proto` Pertama Anda

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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 .proto bisa 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:

KomponenFungsi
syntaxVersi syntax Protobuf yang digunakan (wajib, biasanya “proto3”)
packageNamespace untuk menghindari konflik nama
messageStruktur data semacam “class”
enumTipe data enumerasi
serviceUntuk 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

proto
 1syntax = "proto3";
 2
 3package library;
 4
 5// Enum untuk jenis buku
 6enum Genre {
 7    GENRE_UNSPECIFIED = 0;
 8    FICTION = 1;
 9    NON_FICTION = 2;
10    SCIENCE = 3;
11    HISTORY = 4;
12}
13
14// Struktur data "Book"
15message Book {
16    int32 id = 1;
17    string title = 2;
18    string author = 3;
19    Genre genre = 4;
20    repeated string tags = 5;
21}
22
23// Permintaan untuk mengambil data buku berdasarkan ID
24message GetBookRequest {
25    int32 id = 1;
26}
27
28// Response untuk satu buku
29message GetBookResponse {
30    Book book = 1;
31}
32
33// Service (gRPC)
34service BookService {
35    rpc GetBook(GetBookRequest) returns (GetBookResponse) {}
36}

Penjelasan Setiap Bagian

  • Enum: Genre dengan nilai default GENRE_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: berarti tags adalah array/list string.
  • Service Block: Mendefinisikan RPC bernama GetBook, menerima GetBookRequest, mengembalikan GetBookResponse.

2. Alur Data BookService

Mari gambarkan bagaimana alur data saat client meminta data buku:

MERMAID
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):

bash
1python -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)

python
 1import grpc
 2from concurrent import futures
 3import book_pb2, book_pb2_grpc
 4
 5FAKE_BOOK_DB = {
 6    21: book_pb2.Book(id=21, title='Atomic Habits', author='James Clear', genre=book_pb2.FICTION, tags=['habit', 'self-development'])
 7}
 8
 9class BookServiceServicer(book_pb2_grpc.BookServiceServicer):
10    def GetBook(self, request, context):
11        book = FAKE_BOOK_DB.get(request.id, None)
12        if book:
13            return book_pb2.GetBookResponse(book=book)
14        context.set_code(grpc.StatusCode.NOT_FOUND)
15        context.set_details('Book not found')
16        return book_pb2.GetBookResponse()
17
18# Jalankan server
19if __name__ == '__main__':
20    server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))
21    book_pb2_grpc.add_BookServiceServicer_to_server(BookServiceServicer(), server)
22    server.add_insecure_port('[::]:50051')
23    server.start()
24    print('Server running...')
25    server.wait_for_termination()

4. Tabel Perbandingan Struktur: Protobuf vs JSON

Protobuf (binary)JSON (textual)
UkuranSangat kecilRelatif besar
SpeedParsing sangat cepatParsing lambat
EvolusiMendukung kompatibilitas versiSulit, rentan typo/miss field
KompatBisa lintas bahasaBisa, tapi kurang optimal
TypingLebih kuat/strictTidak ketat

5. Tips Berharga Saat Menulis .proto

  1. Gunakan nomor field < 15 untuk akses termuda. (Nomor field 1-15 lebih efisien secara storage)
  2. Selalu set default value pada enum urutan pertama = 0.
  3. Jangan ganti meaning dari field existing (nomor, nama, atau tipe-nya) setelah di-publish.
  4. Pakai repeated hanya jika yakin field adalah list.
  5. 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! 🚀

Artikel Terkait

💬 Komentar