gRPC
Last updated
Last updated
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.
İki uygulama arasındaki iletişimin nasıl olacağını belirleyen sözleşmedir.
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.
Eğer GitHub sayfasından indirdiyseniz, sisteminize dosya yolunu tanıtmanız gerekir. Bunun için örnek olarak;
Ö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.
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.
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.
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.
Ş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: