Bagikan melalui


gRPC

Petunjuk / Saran

Konten ini adalah kutipan dari eBook, Merancang Aplikasi .NET Cloud Native untuk Azure, tersedia di .NET Docs atau sebagai PDF gratis yang dapat diunduh yang dapat dibaca secara offline.

Aplikasi .NET Cloud Native untuk gambar mini sampul Azure eBook.

Sejauh ini dalam buku ini, kami telah berfokus pada komunikasi berbasis REST. Kami menyadari bahwa REST merupakan gaya arsitektur fleksibel yang menentukan operasi berbasis CRUD terhadap sumber daya entitas. Klien berinteraksi dengan sumber daya di seluruh HTTP dengan model komunikasi permintaan/respons. Sementara REST diimplementasikan secara luas, teknologi komunikasi yang lebih baru, gRPC, telah mendapatkan momentum yang luar biasa di seluruh komunitas cloud-native.

Apa itu gRPC?

gRPC adalah kerangka kerja modern dengan performa tinggi yang mengembangkan protokol remote procedure call (RPC) yang lama. Pada tingkat aplikasi, gRPC menyederhanakan olahpesan antara klien dan layanan back-end. Berasal dari Google, gRPC sumber terbuka dan bagian dari ekosistem Cloud Native Computing Foundation (CNCF) dari penawaran cloud-native. CNCF menganggap gRPC sebagai proyek inkubasi. Inkubasi berarti pengguna akhir menggunakan teknologi dalam aplikasi produksi, dan proyek memiliki jumlah kontributor yang sehat.

Aplikasi klien gRPC yang khas akan mengekspos fungsi lokal dalam proses yang mengimplementasikan operasi bisnis. Di balik itu, fungsi lokal memanggil fungsi lain pada komputer jarak jauh. Yang tampak sebagai panggilan lokal pada dasarnya menjadi panggilan di luar proses yang transparan ke layanan jarak jauh. Pipa RPC mengabstraksi komunikasi jaringan titik-ke-titik, serialisasi, dan eksekusi antar komputer.

Dalam aplikasi cloud-native, pengembang sering bekerja di seluruh bahasa pemrograman, kerangka kerja, dan teknologi. Interoperabilitas ini mempersulit kontrak pesan dan pipa yang diperlukan untuk komunikasi lintas platform. gRPC menyediakan "lapisan horizontal seragam" yang mengabstraksi kekhawatiran ini. Pengembang membuat kode di platform asli mereka yang berfokus pada fungsionalitas bisnis, sementara gRPC menangani pipa komunikasi.

gRPC menawarkan dukungan komprehensif di sebagian besar tumpukan pengembangan populer, termasuk Java, JavaScript, C#, Go, Swift, dan NodeJS.

Manfaat gRPC

gRPC menggunakan HTTP/2 untuk protokol transportasinya. Meskipun kompatibel dengan HTTP 1.1, HTTP/2 memiliki banyak kemampuan tingkat lanjut:

  • Protokol pembingkaian biner untuk transportasi data - tidak seperti HTTP 1.1, yang berbasis teks.
  • Dukungan multipleks untuk mengirim beberapa permintaan paralel melalui koneksi yang sama - Batas HTTP 1.1 memproses ke satu pesan permintaan/respons pada satu waktu.
  • Komunikasi dupleks penuh dua arah untuk mengirim permintaan klien dan respons server secara bersamaan.
  • Streaming bawaan memungkinkan permintaan dan tanggapan untuk mengalirkan kumpulan data besar secara asinkron.
  • Pemadatan header yang mengurangi penggunaan jaringan.

gRPC bersifat ringan dan berkinerja tinggi. Kecepatannya dapat mencapai hingga 8x lebih cepat dari serialisasi JSON dengan pesan 60-80% lebih kecil. Dalam bahasa Microsoft Windows Communication Foundation (WCF), performa gRPC melebihi kecepatan dan efisiensi pengikatan NetTCP yang sangat dioptimalkan. Tidak seperti NetTCP yang mendukung tumpukan Microsoft, gRPC adalah lintas platform.

Buffer Protokol

gRPC menggunakan teknologi sumber terbuka yang disebut Buffer Protokol. Teknologi tersebut menyediakan format serialisasi yang sangat efisien dan netral-platform untuk menserialisasikan pesan terstruktur yang dikirim oleh layanan ke satu sama lain. Menggunakan Interface Definition Language (IDL) lintas platform, pengembang menentukan kontrak layanan untuk setiap layanan mikro. Kontrak yang diimplementasikan sebagai file .proto berbasis teks menjelaskan metode, input, dan output untuk setiap layanan. File kontrak yang sama dapat digunakan untuk klien dan layanan gRPC yang dibangun di platform pengembangan yang berbeda.

Menggunakan file proto, penyusun Protobuf, protoc, menghasilkan kode klien dan layanan untuk platform target Anda. Kodenya mencakup komponen-komponen berikut:

  • Objek yang tersedia dibagikan oleh klien dan layanan yang mewakili operasi layanan dan elemen data untuk pesan.
  • Kelas dasar yang tersedia dan pipa jaringan yang diperlukan yang dapat diwarisi dan diperluas oleh layanan gRPC jarak jauh.
  • Potongan klien yang berisi pipa yang diperlukan untuk memanggil layanan gRPC jarak jauh.

Saat durasi, setiap pesan diserialisasikan sebagai representasi Protobuf standar dan ditukar antara klien dan layanan jarak jauh. Tidak seperti JSON atau XML, pesan Protobuf diserialisasikan sebagai byte biner yang dikompilasi.

Dukungan gRPC di .NET

gRPC diintegrasikan ke dalam .NET Core 3.0 SDK dan yang lebih baru. Alat yang mendukung adalah sebagai berikut:

  • Visual Studio 2022 atau yang lebih baru dengan beban kerja pengembangan ASP.NET dan web terinstal
  • Visual Studio Code
  • CLI dotnet

SDK mencakup alat untuk perutean titik akhir, IoC bawaan, dan pengelogan. Server web Kestrel sumber terbuka mendukung koneksi HTTP/2. Gambar 4-20 memperlihatkan templat Visual Studio 2022 yang menyusun proyek kerangka untuk layanan gRPC. Perhatikan bagaimana .NET sepenuhnya mendukung Windows, Linux, dan macOS.

Dukungan gRPC di Visual Studio 2022

Gambar 4-20. dukungan gRPC di Visual Studio 2022

Gambar 4-21 menunjukkan layanan gRPC kerangka yang dihasilkan dari perancah bawaan yang disertakan dalam Visual Studio 2022.

proyek gRPC pada Visual Studio 2022

Gambar 4-21. proyek gRPC pada Visual Studio 2022

Pada gambar sebelumnya, perhatikan file deskripsi proto dan kode layanan. Seperti yang akan Anda lihat segera, Visual Studio menghasilkan konfigurasi tambahan di kelas Startup dan file proyek yang mendasar.

Penggunaan gRPC

Mendukung gRPC untuk skenario berikut:

  • Komunikasi backend microservice-to-microservice sinkron di mana respons segera diperlukan untuk melanjutkan pemrosesan.
  • Lingkungan poliglot yang perlu mendukung platform pemrograman campuran.
  • Latensi rendah dan komunikasi throughput tinggi di mana performa sangat penting.
  • Komunikasi real time titik-ke-titik - gRPC dapat mendorong pesan secara real time tanpa polling dan memiliki dukungan yang sangat baik untuk streaming dua arah.
  • Lingkungan yang dibatasi jaringan – pesan gRPC biner selalu lebih kecil dari pesan JSON berbasis teks yang setara.

Pada saat penulisan ini, gRPC terutama digunakan dengan layanan backend. Browser modern tidak dapat menyediakan tingkat kontrol HTTP/2 yang diperlukan untuk mendukung klien gRPC front-end. Meskipun demikian, ada dukungan untuk gRPC-Web dengan .NET yang memungkinkan komunikasi gRPC dari aplikasi berbasis browser yang dibangun dengan JavaScript atau teknologi Blazor WebAssembly. gRPC-Web memungkinkan aplikasi gRPC ASP.NET Core untuk mendukung fitur gRPC di aplikasi browser:

  • Klien yang tersedia dan dihasilkan kode
  • Pesan Protobuf Ringkas
  • Streaming server

implementasi gRPC

Arsitektur referensi layanan mikro, eShop on Containers, dari Microsoft, menunjukkan cara menerapkan layanan gRPC dalam aplikasi .NET. Gambar 4-22 menyajikan arsitektur back-end.

Arsitektur backend untuk eShop pada Kontainer

Gambar 4-22. Arsitektur backend untuk eShop pada Kontainer

Pada gambar sebelumnya, perhatikan bagaimana eShop merangkul pola Backend for Frontends (BFF) dengan mengekspos beberapa gateway API. Kami membahas pola BFF di bagian awal bab ini. Perhatikan layanan mikro Agregator (abu-abu) yang berada di antara Web-Shopping API Gateway dan layanan mikro Shopping backend. Agregator menerima satu permintaan dari klien, mengirimkannya ke berbagai layanan mikro, mengagregasi hasilnya, dan mengirimkannya kembali ke klien yang meminta. Operasi tersebut biasanya memerlukan komunikasi sinkron untuk menghasilkan respons langsung. Dalam eShop, panggilan backend dari Agregator dilakukan menggunakan gRPC seperti yang ditunjukkan pada Gambar 4-23.

gRPC di eShop pada Kontainer

Gambar 4-23. gRPC di eShop pada Kontainer

Komunikasi gRPC memerlukan komponen klien dan server. Pada gambar sebelumnya, perhatikan bagaimana Shopping Agregator mengimplementasikan klien gRPC. Klien membuat panggilan gRPC sinkron (berwarna merah) ke layanan mikro backend, yang masing-masing mengimplementasikan server gRPC. Klien dan server memanfaatkan pipa gRPC bawaan dari .NET SDK. Potongan sisi klien menyediakan pipa untuk memanggil panggilan gRPC jarak jauh. Komponen sisi server menyediakan pipa gRPC yang dapat diwarisi dan dikonsumsi oleh kelas layanan kustom.

Layanan mikro yang mengekspos RESTful API dan komunikasi gRPC memerlukan beberapa titik akhir untuk mengelola lalu lintas. Anda akan membuka titik akhir yang mendengarkan lalu lintas HTTP untuk panggilan RESTful dan satu lagi untuk panggilan gRPC. Titik akhir gRPC harus dikonfigurasi untuk protokol HTTP/2 yang diperlukan untuk komunikasi gRPC.

Meskipun kami berusaha untuk memisahkan layanan mikro dengan pola komunikasi asinkron, beberapa operasi memerlukan panggilan langsung. gRPC harus menjadi pilihan utama untuk komunikasi sinkron langsung antara layanan mikro. Protokol komunikasi berkinerja tinggi, berdasarkan HTTP/2 dan buffer protokol, menjadikannya pilihan yang sempurna.

Melihat ke depan

Ke depannya, gRPC akan terus mendapatkan daya tarik untuk sistem cloud-native. Manfaat performa dan kemudahan pengembangan adalah hal yang sangat menarik. Namun, REST kemungkinan akan berada di sekitar untuk waktu yang lama. REST unggul untuk API yang diekspos secara publik dan untuk alasan kompatibilitas mundur.