> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apinizer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# gRPC API Proxy Oluşturma

> gRPC servislerinizi Apinizer platformu üzerinden yönetebilir ve güvenli bir şekilde expose edebilirsiniz. Google tarafından geliştirilen yüksek performanslı RPC framework'ünü kullanabilir, Protocol Buffers (protobuf) formatında çalışabilirsiniz. Protobuf dosyasından gRPC API Proxy oluşturabilir, proto file import edebilir, service ve method tanımları yapabilir ve routing yapılandırması gerçekleştirebilirsiniz

<CardGroup cols={2}>
  <Card title="Protobuf Formatı" icon="file-code">
    gRPC API Proxy, Protocol Buffers (protobuf) formatında mesaj işleme yapar. Bu format, JSON'dan daha kompakt ve hızlıdır.
  </Card>

  <Card title="HTTP/2 Protokolü" icon="network-wired">
    gRPC, HTTP/2 protokolü üzerinde çalışır ve çoklu akış (multiplexing) desteği sağlar.
  </Card>

  <Card title="Streaming Desteği" icon="stream">
    Unary, Server Streaming, Client Streaming ve Bidirectional Streaming metodlarını destekler.
  </Card>

  <Card title="Yüksek Performans" icon="gauge">
    Binary protobuf formatı sayesinde JSON'a göre daha yüksek performans sağlar.
  </Card>
</CardGroup>

## gRPC API Proxy Oluşturma Yöntemleri

gRPC API Proxy oluşturmak için birkaç yöntem mevcuttur:

<AccordionGroup>
  <Accordion title="Protobuf (.proto) Dosyasından Import">
    En yaygın yöntem, protobuf (.proto) dosyasından import etmektir. Bu yöntem, servislerinizi, metodlarınızı ve mesaj tiplerinizi otomatik olarak içe aktarır.
  </Accordion>

  <Accordion title="Manuel Oluşturma">
    Protobuf dosyası olmadan da manuel olarak gRPC API Proxy oluşturabilirsiniz. Bu durumda servisleri ve metodları manuel olarak tanımlamanız gerekir.
  </Accordion>

  <Accordion title="Mevcut API Proxy'den Kopyalama">
    Mevcut bir gRPC API Proxy'yi kopyalayarak yeni bir proxy oluşturabilirsiniz. Bu yöntem, benzer servisler için zaman kazandırır.
  </Accordion>
</AccordionGroup>

## Protobuf Dosyasından Import

<Steps>
  <Step title="API Proxy Oluşturma Sayfasına Gidin">
    Sol taraftaki ana menüde **Geliştirme → API Proxy'ler (Development → API Proxies)** ögesi seçilir. Açılan arayüzde sağ üstteki **+Create** butonuna tıklanır ve **gRPC API** seçeneği seçilir.
  </Step>

  <Step title="Protobuf Dosyasını Yükleyin">
    Protobuf dosyasını yüklemek için üç yöntem mevcuttur:

    <AccordionGroup>
      <Accordion title="Yöntem 1: Dosya Yükleme">
        **Dosya Yükle (Upload File)** butonuna tıklanır. Bilgisayarınızdan `.proto` dosyası seçilir. Dosya otomatik olarak parse edilir ve servis bilgileri görüntülenir.

        <Info>
          **Protobuf Dosyası Formatı** Protobuf dosyası, gRPC servislerinizi tanımlayan bir dosyadır. Dosya içinde `service`, `rpc`, `message` gibi tanımlar bulunur.
        </Info>
      </Accordion>

      <Accordion title="Yöntem 2: URL'den Yükleme">
        **URL Gir** bağlantısına tıklanır. Protobuf dosyasının URL'si girilir ve **Parse** butonuna tıklanır. Dosya parse edilir ve servis bilgileri görüntülenir.

        <Info>
          **Kimlik Doğrulama ve SSL** Spec URL'si kimlik doğrulama gerektiriyorsa, **Spec Authorization Kullan** seçeneğini etkinleştirerek özel header'lar veya **Basic Auth** (kullanıcı adı/şifre) bilgilerini girebilirsiniz. **SSL / Sertifika Ayarları** bölümünde **Bağlantı Zaman Aşımı**, **SSL/TLS Ayarlarını Özelleştir**, **SSL Doğrulamayı Atla** ve **Sunucu Sertifikası Doğrulaması** ayarlarını yapılandırabilirsiniz. Detay için [API Proxy Oluşturma](/tr/develop/api-proxy-olusturma/api-proxy-olusturma) sayfasına bakınız.
        </Info>
      </Accordion>

      <Accordion title="Yöntem 3: Metin Olarak Yapıştırma">
        **Metin Olarak Yapıştır (Paste as Text)** seçeneği seçilir. Protobuf içeriği metin alanına yapıştırılır ve **Parse** butonuna tıklanır. İçerik parse edilir ve servis bilgileri görüntülenir.
      </Accordion>
    </AccordionGroup>
  </Step>

  <Step title="Servis Bilgilerini Kontrol Edin">
    Parse işlemi tamamlandıktan sonra, aşağıdaki bilgiler görüntülenir:

    <CardGroup cols={2}>
      <Card title="Package" icon="tag">
        Protobuf package adı
      </Card>

      <Card title="Servisler" icon="network-wired">
        Tüm gRPC servisleri
      </Card>

      <Card title="Metodlar" icon="list">
        Her servis için RPC metodları
      </Card>

      <Card title="Mesaj Tipleri" icon="file-code">
        Request ve response mesaj tipleri
      </Card>

      <Card title="Streaming Tipi" icon="stream">
        Unary, Server Streaming, Client Streaming veya Bidirectional Streaming
      </Card>
    </CardGroup>
  </Step>

  <Step title="Routing Yapılandırması">
    <AccordionGroup>
      <Accordion title="Client Route (Relative Path)">
        Client Route, API Proxy'nin dış dünyaya açılan endpoint'idir. İstemciler bu endpoint üzerinden gRPC servisine erişir.

        **Örnek:**

        ```
        Relative Path: /grpc/user-service
        ```

        Bu durumda gRPC servisine şu şekilde erişilir:

        ```
        {apinizer-gateway}/grpc/user-service
        ```
      </Accordion>

      <Accordion title="Upstream Target (Backend Address)">
        Upstream Target, backend gRPC servisinizin adresidir. API Proxy, istekleri bu adrese yönlendirir.

        **Yapılandırma Formatı:**

        ```
        host:port
        ```

        **Örnek:**

        ```
        backend-grpc.example.com:50051
        ```

        <Info>
          **gRPC Port** gRPC servisleri genellikle 50051 gibi özel portlarda çalışır. Backend servisinizin port numarasını doğru belirttiğinizden emin olun.
        </Info>
      </Accordion>
    </AccordionGroup>
  </Step>

  <Step title="gRPC Routing Yapılandırması">
    gRPC için özel routing yapılandırması yapılabilir. Daha fazla bilgi için [gRPC Routing](/tr/develop/yonlendirme/grpc-yonlendirme) sayfasına bakılabilir.
  </Step>

  <Step title="API Proxy'yi Kaydedin">
    Tüm bilgiler kontrol edilir. **Relative Path** alanı doldurulur (zorunlu). **Upstream Target** bilgisi girilir (host:port formatında). Sağ üstteki **Kaydet** butonuna tıklanır.
  </Step>
</Steps>

<Check>
  gRPC API Proxy başarıyla oluşturuldu!
</Check>

## Protobuf Dosyası Yapısı

Protobuf dosyası genellikle şu yapıya sahiptir:

```protobuf theme={null}
syntax = "proto3";

package com.example.service;

// Mesaj tanımları
message UserRequest {
  string user_id = 1;
}

message UserResponse {
  string user_id = 1;
  string name = 2;
  string email = 3;
}

// Servis tanımı
service UserService {
  // Unary RPC
  rpc GetUser(UserRequest) returns (UserResponse);
  
  // Server Streaming RPC
  rpc ListUsers(UserRequest) returns (stream UserResponse);
  
  // Client Streaming RPC
  rpc CreateUsers(stream UserRequest) returns (UserResponse);
  
  // Bidirectional Streaming RPC
  rpc ChatUsers(stream UserRequest) returns (stream UserResponse);
}
```

## gRPC Metod Tipleri

gRPC dört farklı metod tipini destekler:

<CardGroup cols={2}>
  <Card title="Unary RPC" icon="arrow-right">
    Tek bir request, tek bir response. En yaygın kullanılan metod tipidir.

    **Örnek:**

    ```protobuf theme={null}
    rpc GetUser(UserRequest) returns (UserResponse);
    ```
  </Card>

  <Card title="Server Streaming RPC" icon="arrow-down">
    Tek bir request, çoklu response. Sunucu bir stream gönderir.

    **Örnek:**

    ```protobuf theme={null}
    rpc ListUsers(UserRequest) returns (stream UserResponse);
    ```
  </Card>

  <Card title="Client Streaming RPC" icon="arrow-up">
    Çoklu request, tek bir response. İstemci bir stream gönderir.

    **Örnek:**

    ```protobuf theme={null}
    rpc CreateUsers(stream UserRequest) returns (UserResponse);
    ```
  </Card>

  <Card title="Bidirectional Streaming RPC" icon="arrows-rotate">
    Çoklu request, çoklu response. Her iki taraf da stream gönderir.

    **Örnek:**

    ```protobuf theme={null}
    rpc ChatUsers(stream UserRequest) returns (stream UserResponse);
    ```
  </Card>
</CardGroup>

## Import Sonrası Yapılandırma

API Proxy oluşturulduktan sonra, aşağıdaki yapılandırmalar yapılabilir:

<CardGroup cols={2}>
  <Card title="gRPC Routing Yapılandırması" icon="route" href="/tr/develop/yonlendirme/grpc-yonlendirme">
    gRPC Routing, metodların nasıl yönlendirileceğini belirler.
  </Card>

  <Card title="Politikalar Ekleme" icon="shield" href="/tr/develop/api-proxy-konfigurasyonu/politika-yonetimi">
    API Proxy'ye güvenlik, doğrulama, dönüştürme gibi politikalar eklenebilir.

    <Tip>
      gRPC için bazı politikalar özel olarak uygulanabilir. Örneğin, protobuf mesajlarını doğrulama veya dönüştürme politikaları.
    </Tip>
  </Card>

  <Card title="Test Etme" icon="flask" href="/tr/develop/test-debug-araclari/test-console">
    gRPC API Proxy test edilebilir. Apinizer Test Console, gRPC test desteği sağlar.
  </Card>

  <Card title="Yükleme ve Sürüm" icon="rocket" href="/tr/develop/yukleme-ve-surum-yonetimi">
    API Proxy ortam(lar)a deploy edilebilir.
  </Card>
</CardGroup>

## Yaygın Senaryolar

<AccordionGroup>
  <Accordion title="Senaryo 1: Internal gRPC Servisini Expose Etme">
    Internal bir gRPC servisini dış dünyaya expose etmek için:

    <Steps>
      <Step title="Proto Dosyasını Yükleyin">
        gRPC servisinizin `.proto` dosyası yüklenir.
      </Step>

      <Step title="Relative Path Belirleyin">
        Relative Path belirlenir (örneğin: `/grpc/user-service`).
      </Step>

      <Step title="Upstream Target Ayarlayın">
        Upstream Target olarak internal servisin adresi kullanılır (örneğin: `internal-grpc.example.com:50051`).
      </Step>

      <Step title="Güvenlik Politikaları Ekleyin">
        mTLS, Authentication gibi güvenlik politikaları eklenir.
      </Step>

      <Step title="Kaydedin ve Deploy Edin">
        API Proxy kaydedilir ve deploy edilir.
      </Step>
    </Steps>
  </Accordion>

  <Accordion title="Senaryo 2: gRPC Servis Versiyonlama">
    Farklı versiyonlar için ayrı API Proxy'ler oluşturmak için:

    <Steps>
      <Step title="Her Versiyon İçin Ayrı Proto Dosyası">
        Her versiyon için ayrı `.proto` dosyası kullanılır.
      </Step>

      <Step title="Farklı Relative Path'ler">
        Farklı Relative Path'ler kullanılır (örneğin: `/grpc/v1/user-service`, `/grpc/v2/user-service`).
      </Step>

      <Step title="Ayrı Politikalar">
        Her versiyon için ayrı politikalar tanımlanır.
      </Step>

      <Step title="Geçiş Stratejisi">
        Versiyonlar arasında geçiş stratejisi belirlenir.
      </Step>
    </Steps>
  </Accordion>

  <Accordion title="Senaryo 3: gRPC'den REST'e Dönüştürme">
    gRPC servisini REST API olarak expose etmek için:

    <Steps>
      <Step title="gRPC API Proxy Oluşturun">
        gRPC API Proxy oluşturulur.
      </Step>

      <Step title="REST Dönüştürme Politikaları">
        REST dönüştürme politikaları eklenir.
      </Step>

      <Step title="Metodları Map Edin">
        gRPC metodları REST endpoint'lerine map edilir.
      </Step>

      <Step title="Dönüştürmeleri Yapılandırın">
        Request/Response dönüştürmeleri yapılandırılır.
      </Step>
    </Steps>
  </Accordion>
</AccordionGroup>

## En İyi Uygulamalar

<CardGroup cols={2}>
  <Card title="Protobuf Dosyası Kalitesi" icon="file-code">
    Protobuf dosyanızın geçerli ve güncel olduğundan emin olun. Geçersiz dosyalar import sırasında hata verebilir.
  </Card>

  <Card title="Relative Path Stratejisi" icon="route">
    Relative Path'ler için tutarlı bir isimlendirme kuralı kullanın. Örneğin: `/grpc/{servis-adı}/{versiyon}`
  </Card>

  <Card title="Backend Adresi" icon="server">
    Backend adreslerini environment variable olarak tanımlayın. Bu, farklı ortamlar için esneklik sağlar.
  </Card>

  <Card title="mTLS Güvenliği" icon="shield">
    gRPC için mutlaka mTLS (mutual TLS) güvenliği kullanın. gRPC servisleri genellikle internal network'te çalışır ve güvenlik kritiktir.
  </Card>

  <Card title="Streaming Performansı" icon="stream">
    Streaming metodları için performans optimizasyonları yapın. Büyük veri akışları için buffer ayarlarını optimize edin.
  </Card>

  <Card title="Error Handling" icon="circle-exclamation">
    gRPC error kodlarını (status codes) doğru şekilde handle edin. gRPC, HTTP status kodlarından farklı bir error sistemi kullanır.
  </Card>
</CardGroup>

## Sorun Giderme

<AccordionGroup>
  <Accordion title="Import Hatası">
    **Sorun:** Protobuf dosyası import edilemiyor.

    **Çözüm:**

    * Protobuf dosyasının geçerli syntax'a sahip olduğundan emin olun (proto2 veya proto3).
    * Dosyanın tüm bağımlılıklarının (import edilen dosyalar) mevcut olduğundan emin olun.
    * URL erişilebilirliğini kontrol edin.
    * Dosya boyutunun limit içinde olduğundan emin olun.
  </Accordion>

  <Accordion title="Servisler Görünmüyor">
    **Sorun:** Import sonrası servisler görünmüyor.

    **Çözüm:**

    * Protobuf dosyasında `service` tanımlarının doğru olduğundan emin olun.
    * Package adının doğru tanımlandığını kontrol edin.
    * RPC metodlarının doğru şekilde tanımlandığını kontrol edin.
  </Accordion>

  <Accordion title="Routing Hatası">
    **Sorun:** İstekler backend'e yönlendirilmiyor.

    **Çözüm:**

    * Upstream Target adresinin doğru formatda olduğundan emin olun (host:port).
    * Backend gRPC servisinizin erişilebilir olduğunu kontrol edin.
    * gRPC Routing yapılandırmasını kontrol edin.
    * Port numarasının doğru olduğundan emin olun.
  </Accordion>

  <Accordion title="Streaming Hatası">
    **Sorun:** Streaming metodları çalışmıyor.

    **Çözüm:**

    * Streaming metodlarının doğru tanımlandığını kontrol edin.
    * HTTP/2 desteğinin aktif olduğundan emin olun.
    * Timeout ayarlarını kontrol edin (streaming için daha uzun timeout gerekebilir).
  </Accordion>
</AccordionGroup>

## Sonraki Adımlar

<CardGroup cols={2}>
  <Card title="gRPC Routing" icon="route" href="/tr/develop/yonlendirme/grpc-yonlendirme">
    gRPC Routing yapılandırmasını öğrenin
  </Card>

  <Card title="Politika Yönetimi" icon="shield" href="/tr/develop/api-proxy-konfigurasyonu/politika-yonetimi">
    Politikalar eklemeyi öğrenin
  </Card>

  <Card title="mTLS Güvenliği" icon="lock" href="/tr/develop/politikalar/mTLS">
    mTLS güvenliği hakkında bilgi edinin
  </Card>

  <Card title="Yükleme ve Sürüm" icon="rocket" href="/tr/develop/yukleme-ve-surum-yonetimi">
    Deployment yapmayı öğrenin
  </Card>
</CardGroup>
