0Pricing
C# Academy · Pelajaran

Dasar-Dasar gRPC & Protobuf

Definisikan kontrak layanan dalam file .proto, buat kode C# dengan Grpc.Tools, dan pahami transportasi gRPC.

Dasar-Dasar gRPC & Protobuf adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Apa Itu gRPC?

gRPC adalah kerangka kerja RPC berperforma tinggi dan tidak bergantung pada bahasa yang dikembangkan oleh Google. gRPC menggunakan HTTP/2 untuk transportasi dan Protocol Buffers (Protobuf) sebagai format serialisasi—jauh lebih cepat dan ringkas daripada JSON melalui HTTP/1.1.

Protocol Buffers: IDL

Anda menentukan kontrak layanan dalam berkas .proto. IDL Protobuf (Bahasa Definisi Antarmuka) memiliki tipe kuat dan netral terhadap bahasa—berkas yang sama menghasilkan kode klien/peladen dalam C#, Go, Python, dan sebagainya.

// greet.proto
syntax = "proto3";

option csharp_namespace = "GrpcService";

package greet;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Menyiapkan Server gRPC di .NET

Buat proyek gRPC dengan dotnet new grpc. Tambahkan berkas .proto ke proyek, lalu Grpc.Tools akan secara otomatis menghasilkan kelas C# pada waktu pembangunan.

// .csproj snippet
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

// Program.cs
builder.Services.AddGrpc();

var app = builder.Build();
app.MapGrpcService<GreeterService>();
app.Run();

Mengimplementasikan Layanan gRPC

Turunkan kelas dasar yang dihasilkan dan ganti implementasi metode RPC. Kerangka kerja menangani serialisasi, pembingkaian HTTP/2, dan perutean secara otomatis.

using Grpc.Core;
using GrpcService;

public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;
    public GreeterService(ILogger<GreeterService> logger) => _logger = logger;

    public override Task<HelloReply> SayHello(
        HelloRequest request,
        ServerCallContext context)
    {
        _logger.LogInformation("Saying hello to {Name}", request.Name);
        return Task.FromResult(new HelloReply
        {
            Message = $"Hello, {request.Name}!"
        });
    }
}

Membuat Klien gRPC

Kompilator Protobuf juga menghasilkan kelas klien dengan tipe kuat. Gunakan GrpcChannel untuk terhubung dan memanggil layanan seolah-olah layanan tersebut merupakan metode lokal.

// Client project: add Grpc.Net.Client package
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);

var reply = await client.SayHelloAsync(
    new HelloRequest { Name = "Alice" });

Console.WriteLine(reply.Message); // Hello, Alice!

Tipe Protobuf dan Nomor Bidang

Setiap bidang dalam pesan Protobuf memiliki nomor bidang unik (1–536870911). Nomor bidang dikodekan dalam format biner—jangan pernah mengubahnya setelah diterapkan karena akan merusak kompatibilitas mundur.

message Product {
  int32  id          = 1;
  string name        = 2;
  double price       = 3;
  int32  stock       = 4;
  bool   is_active   = 5;
  repeated string tags = 6; // array
}

// Supported scalar types:
// int32, int64, uint32, uint64, float, double
// bool, string, bytes, enum

Enumerasi dan Pesan Bertingkat

Protobuf mendukung enumerasi dan tipe pesan bertingkat. Gunakan keduanya untuk memodelkan objek domain kompleks dalam kontrak layanan Anda.

enum OrderStatus {
  ORDER_STATUS_UNSPECIFIED = 0;
  ORDER_STATUS_PENDING     = 1;
  ORDER_STATUS_SHIPPED     = 2;
  ORDER_STATUS_CANCELLED   = 3;
}

message Order {
  int32       id       = 1;
  OrderStatus status   = 2;
  repeated OrderLine lines = 3;
}

message OrderLine {
  int32  product_id = 1;
  int32  quantity   = 2;
  double price      = 3;
}

Transportasi HTTP/2 dan gRPC

gRPC menggunakan HTTP/2 yang mendukung multiplexing—beberapa panggilan RPC serentak melalui satu koneksi TCP—sehingga mengurangi latensi dan overhead koneksi dibandingkan HTTP/1.1.

// gRPC requires HTTP/2
// For local dev with HTTP (not HTTPS), enable HTTP/2 cleartext:
builder.WebHost.ConfigureKestrel(opt =>
    opt.ListenLocalhost(5000, o => o.Protocols = HttpProtocols.Http2));

// Client for cleartext (dev only)
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
using var channel = GrpcChannel.ForAddress("http://localhost:5000");

Penanganan Galat dengan StatusCode

gRPC menggunakan kode statusnya sendiri, yang berbeda dari HTTP. Lempar RpcException dengan Status untuk mengirim respons galat bertipe kepada klien.

public override Task<ProductReply> GetProduct(
    ProductRequest request,
    ServerCallContext context)
{
    var product = _repo.FindById(request.Id);
    if (product is null)
        throw new RpcException(
            new Status(StatusCode.NotFound, $"Product {request.Id} not found"));

    return Task.FromResult(MapToReply(product));
}

Refleksi gRPC untuk Pengembangan

Aktifkan refleksi gRPC agar alat seperti grpcurl dan Postman dapat menemukan layanan Anda tanpa mengakses berkas .proto secara langsung.

// dotnet add package Grpc.AspNetCore.Server.Reflection

builder.Services.AddGrpcReflection();

if (app.Environment.IsDevelopment())
    app.MapGrpcReflectionService();

// Now use grpcurl:
// grpcurl -plaintext localhost:5000 list
// grpcurl -plaintext localhost:5000 greet.Greeter/SayHello

Contoh Dunia Nyata: Pencarian Produk Layanan Mikro

Layanan produk yang menyediakan titik akhir gRPC dan digunakan secara internal oleh layanan pesanan—pola klasik komunikasi antarlayanan.

// product.proto
service ProductService {
  rpc GetProduct (GetProductRequest) returns (ProductResponse);
  rpc ListProducts (ListProductsRequest) returns (ListProductsResponse);
}

// Order service calls it:
public class OrderService
{
    private readonly ProductService.ProductServiceClient _products;
    public OrderService(ProductService.ProductServiceClient p) => _products = p;

    public async Task<Order> PlaceOrderAsync(int productId, int qty)
    {
        var product = await _products.GetProductAsync(
            new GetProductRequest { Id = productId });
        return new Order { ProductName = product.Name, Quantity = qty };
    }
}

Pemeriksaan Singkat

Mengapa Anda tidak boleh mengubah nomor bidang Protobuf yang sudah ada setelah penerapan?

Ringkasan: Dasar-Dasar gRPC & Protobuf

Hal-hal penting:

  • gRPC menggunakan HTTP/2 + Protobuf untuk komunikasi antarlayanan yang cepat dan memiliki tipe kuat
  • Tentukan kontrak layanan dalam berkas .proto—kode dihasilkan pada waktu pembangunan
  • Nomor bidang merupakan pengodean pada format kabel—jangan pernah mengubah atau menggunakannya kembali
  • Turunkan kelas dasar yang dihasilkan dan ganti implementasi metode RPC
  • Gunakan RpcException dengan StatusCode untuk respons galat bertipe
  • Aktifkan refleksi gRPC untuk mendukung alat pengembangan

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Dasar-Dasar gRPC & Protobuf” gratis?

Ya — teks lengkap “Dasar-Dasar gRPC & Protobuf” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Dasar-Dasar gRPC & Protobuf”?

Definisikan kontrak layanan dalam file .proto, buat kode C# dengan Grpc.Tools, dan pahami transportasi gRPC. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Dasar-Dasar gRPC & Protobuf” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar gRPC & Protobuf
  2. RPC Unary & Streaming Server
  3. Streaming Klien & Dua Arah
  4. Batas Waktu, Pembatalan & Interceptor
← Kembali ke C# Academy