gRPC
gRPC Nedir?
gRPC, Google tarafından geliştirilen, açık kaynaklı uzaktan prosedür çağırma (rpc) kütüphanesi (sistemi)'dir. Aktarım için HTTP/2
kullanır. Arayüz tanımlama dili olarak protokol tamponları (buffers)
kullanır. Kimlik doğrulama, Çift yönlü akış, engelleme ve engelleme olmayan bağlantılar, iptal ve zaman aşımı işlemleri için kullanılır.
JSON ve HTTP API'larının aksine, daha katı bir spesifikasyona sahiptirler. Tek bir spesifikasyona sahip olduğu için, gRPC tartışmalarını ortadan kaldırır ve geliştiriciye zaman kazandırır. Çünkü gRPC, platformlar ve uygulamalar arasında tutarlıdır.
Özet olarak, uzaktan prosedür çağırarak client (müşteri) ve server (sunucu) programları arasındaki iletişimi sağlayan bir kütüphanedir.
Protokol Tamponları (Buffers) Nedir?
İki uygulama arasındaki iletişimin nasıl olacağını belirleyen sözleşmedir.
Örnek Uygulama Yapalım
Bu örneğimizde sunucuya mesaj gönderip, karşılığında mesaj alan bir uygulama yazacağız. Bir nevi chat uygulaması olacak.
Öncelikle, iletişim protokülünü Go koduna dönüştürebilmemiz (generating) için protoc
'yi bilgisayarımıza kuralım.
İndirmek için buradaki adrese gidin. Buradaki versiyon v3.13.0 versiyonu. Daha güncel versiyonlar için buradaki sayfayı kontrol etmeyi unutmayın.
GNU/Linux İS kullanan arkadaşlarımız uygulama depolarından protobuf adıyla yükleyebilirler. Böylece PATH olarak eklemelerine gerek kalmaz.
Sisteme Yol Olarak Ekleme
Eğer GitHub sayfasından indirdiyseniz, sisteminize dosya yolunu tanıtmanız gerekir. Bunun için örnek olarak;
Windows üzerinde
Örnek olarak protoc.exe
dosyamız C:\\protoc\bin
klasörü içerisinde olsun.
Başlar menüsünde "Ortam değişkenleri" yazarak aratalım. Açılan pencerede Gelişmiş sekmesinde alt tarafta Ortam Değişkenleri butonuna basalım.
PATH seçeneğini Düzenle diyerek protoc.exe
'nin konumunu ekleyelim.
GNU/Linux, MacOS vs. Bash Kullanan Sistemler Üzerinde
protoc
çalıştırılabilir dosyamızı örnek olarak Home (Ev)
dizinine atmış olalım.
Örnek: ~/protoc/bin
olsun.
Ev dizinimizdeki .bashrc
dosyamızın en altına şunları ekleyelim.
.bashrc
dosyasını kaydettikten sonra komut satırına source ~/.bashrc
yazarak dosyada yaptığımız değişimi onaylayalım.
Protoc'yi kontrol edelim
Komut satırına aşağıdakileri yazarak protoc
'nin versiyonuna bakalım.
Protoc
'ye Golang desteğini eklemek için aşağıdaki paketleri kuralım.
Aynı şekilde Windows üzerinde C:\\Users\isim\go\bin
klasörünü ekli değilse ortam değişkenlerine ekleyelim. Unix-like sistemler için ~/go/bin
'i path'e ekleyelim.
Yukarıda belirttiğimiz örnek chat
uygulamasını yazmak için aşağıdaki gibi bir proje yapımız olacak.
Client ve Server arasındaki iletişim protokolünü belirleyelim.
chat.proto
dosyamız şöyle olsun.
Yukarıdaki chat.proto
dosyasını Go koduna dönüştürelim. Bunun için proje dizinindeyken aşağıdaki komutu yazalım.
protoc --go_out=plugins=grpc:chat chat.proto
Bu işlem sonucunda chat klasörümüzüm içerisinde chat.pb.go
dosyamız oluşacak. Bu dosyanın en başında yorum olarak düzenleme yapmamızın uygun olamayacağı yazıyor. O yüzden bu dosyayla çok uğraşmamakta fayda var.
Server (Sunucu) Oluşturalım
chat
klasörümüzdeki chat.go
dosyasını oluşturalım.
Go modules'tan faydalanarak chat paketini diğer paketlerde kullanabiliriz. Bunun için proje dizinindeyken komut satırına:
go mod init github.com/ksckaan1/grpcOrnek
yazalım. Buradaki yaptığımız şey, GitHub'a paket yüklemeden sanal olarak yazdığımız chat
paketini kullanabileceğiz. Bu komuttan sonra proje dizinimizde go.mod
dosyası oluşacak. Böylece chat klasörünü paket olarak diğer yerlerde de kullanabileceğiz.
server.go
dosyamızı oluşturalım.
go run server.go
komutunu yazarak test edelim. Eğer çıktı vermiyorsa ve program kapanmıyorsa server dinleniyor demektir. Yani şuana kadar başarılıyız.
Client (Müşteri) Oluşturalım
Şimdi de Server'a mesaj yollayabilmek için Client'i oluşturalım. client.go
dosyamız aşağıdaki gibi olsun.
Yukarıda yazdığımız kodların çalışma mantığını açıklayacak olursak:
Server
9080
portunu belirlediğimiz protokol sözleşmesine (chat.proto) göre dinliyor.Client.go
dosyamız çalıştırılınca server'a mesaj yolluyor.Client'ten gelen mesajı server ekrana bastırıyor ve bunun karşılığında server client'e cevap veriyor.
Server'dan gelen cevabı da client ekrana bastırıyor.
Son olarak client programımız sonlanıyor (kapanıyor).
Gif olarak sonucu göstermek gerekirse:
Last updated