TypeScript ile gRPC API Oluşturmak

Salih Can
3 min readMay 24, 2022

--

Bir önceki makale ile gRPC nedir? Başlığı ile basit bir şekilde gRPC hakkında bilgi vermiştim. Bu makalede daha çok gRPC TypeScript ile nasıl ele alacağımızı ve gRPC API nasıl ayağa kaldırılacağından bahsedeceğim.

gRPC hakkında genel ve detaylı bir bilgi isterseniz aşağıdaki bağlantıyı kullanarak ilgili makaleye gidebilirsiniz.

TypeScript ile gRPC kurulumu nasıl yapılır?

Başlamadan önce aşağıdaki paketleri projemize dahil edelim.

@grpc/grpc-js
@grpc/proto-loader

Aşağıdaki adımları tamamladıktan sonra projenin son dosya yapısı aşağıdaki şekildeki gibi olacaktır.

API kuracağımız proto modelimizi oluşturalım.

greeter.proto

service: Kullanılabilecek bir servis oluşturur. Bu servis altından ilgili işlemleri yürütebilirsiniz.

rpc: Servise ait endpointleri oluşturmak için kullandığımız keyword.

message: Request ve Response için kullanılacak model yapılarını belirttiğimiz keyword.

ProtoBuf ile desteklenen veri tiplerini buradan görebilirsiniz.

Yukarıdaki proto dosyamız sayesinde serializer methodları üretmek için ‘proto-loader-gen’ paketini yüklemiştik. Bu paketin sunduğu ‘proto-loader-gen-types’ kod üretici script ile arayüz (interface) ve ilgili tanımlamaları üretebileceğiz.

Arayüz (interface) ve ilgili tanımlamaları üretebilmek için aşağıdaki komutu kullanacağız. Bu komutları daha detaylı görmek için ‘ — help’ opsiyonel parametresini ekleyebilir veya npm paketi sayfasından bakabilirsiniz.

— outDir: Üretilen seriliazer ve arayüz(interface) yapılarının çıktılarının dosya dizini yolu.

— includeComments: ProtoBuf içerisinde eklediğiniz yorum satırlarını üretilmiş dosyalara da ilgili satırlara eklenmesini istiyorsanız true olarak devam etmelisiniz.

Son Satır: Üretilmesi gereken proto dosyalarınızın bulunduğu klasör yolu (./src/proto) *.proto ile sonu proto ile bütün bütün proto dosyalarını almış oluyoruz.

Proto dosyalarını TypeScript ile entegre edebilmemiz için gereken bütün kodlarını aşağıda görebilirsiniz. Kodların altında satır satır açıklamasını bulabilirsiniz. TypeScript kurulumuna değinmedim, bu tarz temel kurulum işlemlerini halledildiğini varsayarak anlatımda bulundum. Eğer bu konuda bir engeliniz olursa bana Linkedin veya Twitter’dan ulaşabilirsiniz.

İhtiyaç duyduğumuz interface (arayüz) ve paketlerin dosyaya dahil edilmesini sağlıyoruz. (‘generated’ dosyası altından import ettiklerimizi, proto-loader kod üreticisi (shell file) tarafından üretilen dosyalar olduğunu unutmayın.)

ProtoBuf ile yazdığımız Greeter servisinin TypeScript ile üretmiş olduğumuz “GreeterHandlers” arayüzüne (interface) göre servis endpoint’lerini ele alacağı sınıfımızı oluşturuyoruz. Parametre olarak gelen callback fonksiyonu aracılığı ile istemciye cevap dönebiliyoruz. Aşağıda gördüğünüz üzere istek içerisinde gelen name parametresinin başına “Hello” ekleyip, istemciye geri dönüyoruz. (İstemci tarafını bir sonraki makalede Dart(Flutter) programlama dili ile işleyeceğim)

Belirtilen dizindeki proto dosyalarını ayrıştırmak için yükleme işlemlerini yapıyoruz.

Yükleme işlemini yaptığımız proto dosyalarını bu satırda GrpcObject yapısına göre parse ediyoruz.

Elde ettiğimiz objeden ilgili tanımlamasını almak için ‘as’ ile öncelikle ‘unknown’ casting işlemi yapıyoruz daha sonra hangi servis için servis arayüzlerini(interface) almak istiyorsak ‘ServisAdıGrpcType’ ile type casting işlemini yapıyoruz. Bu şekilde içerisindeki ‘service’ ulaşıp ‘addService’ methodunun istediği veriyi sunmuş oluyoruz. ‘as’ ile yapmasaydık aşağıdaki şekilde güvenli olmayan bir yapı ile almak zorunda kalacaktık.

Güvenli yapı;

Güvensiz yapı;

Oluşturduğumuz gRPC API’sinin belirttiğimiz ip ve port’a bağlıyoruz ve bağlandıktan sonra sunucunun işleve geçmesi için 3. satırdaki işlemi yapıyoruz.

Uygulama dosyasının son hali bu şekilde olacaktır.

Yukarıdaki bazı satırlar karışık veya anlamsız gelebilir, TypeScript ile definition/arayüz oluşturma başlı başına tam olarak oturmamış bir işlem. Go dilini kullanarak daha kolay entegre edilebilirliğini belirtmek isterim.

Eğer anlamadığın veya benim yanlış bir kelamda bulunduğum bir konu var ise lütfen yorum bırak veya aşağıdaki bağlantılar üzerinden bana ulaşmayı ihmal etme. Okuduğunuz için teşekkürler 🙏 👋

--

--

Salih Can
Salih Can

No responses yet