Genel Bakış

Apinizer'ın Client Route özelliği, API Gateway'de gelen isteklerin daha esnek ve dinamik bir şekilde yönlendirilmesini sağlar. Bu özellik sayesinde:

  • Bir proxy'e birden fazla relative path tanımlanabilir
  • Host bilgisine göre farklı proxy'lere yönlendirme yapılabilir
  • HTTP header değerlerine göre yönlendirme kuralları oluşturulabilir
  • Method bazlı yönlendirme yapılabilir

Bu özellik geliştirilmeden önce, her proxy için yalnızca tek bir benzersiz (unique) relative path tanımlanabiliyordu. Yeni özellik ile aynı relative path'e sahip birden fazla proxy oluşturulabilir ve bunlar arasında host, header veya method bilgilerine göre dinamik yönlendirme yapılabilir.

Client Route Nasıl Çalışır?

Client Route özelliği, gelen istekleri belirli bir öncelik sırasına göre değerlendirerek doğru proxy'e yönlendirir.

Yönlendirme Öncelik Sırası

Gateway, gelen istekleri aşağıdaki öncelik sırasına göre değerlendirir:

  1. Relative Path (En yüksek öncelik)
  2. Hosts
  3. Headers
  4. Methods (En düşük öncelik)

Eşleştirme Mantığı

  • Hosts: Birden fazla host tanımlandığında OR mantığı ile çalışır. Yani tanımlanan hostlardan herhangi birinin eşleşmesi yeterlidir.
  • Headers: Birden fazla header tanımlandığında AND mantığı ile çalışır. Yani tanımlanan tüm header'ların eşleşmesi gerekir.

Wildcard Hostname Kullanımı

Apinizer, host tanımlamalarında esneklik sağlamak için wildcard (joker karakter) kullanımını destekler. Wildcard hostname'ler, belirli bir pattern'e uyan tüm Host header değerlerinin koşulu sağlamasına ve böylece ilgili Route ile eşleşmesine olanak tanır.

Wildcard Kuralları

Wildcard hostname'ler aşağıdaki kurallara uygun olmalıdır:

  • Domain'in en solundaki veya en sağındaki label'ında yalnızca bir adet asterisk (*) içerebilir
  • Asterisk, domain'in başında veya sonunda kullanılabilir

Wildcard Örnekleri

Sol Taraf Wildcard

*.example.com
TEXT

Bu tanımlama aşağıdaki Host değerlerinin eşleşmesini sağlar:

  • a.example.com
  • x.y.example.com
  • api.example.com
  • test.subdomain.example.com

Sağ Taraf Wildcard

example.*
TEXT

Bu tanımlama aşağıdaki Host değerlerinin eşleşmesini sağlar:

  • example.com
  • example.org
  • example.net
  • example.io

Örnek Senaryo

Aşağıdaki tabloda 5 farklı proxy ve bunlara tanımlanmış Client Route yapılandırmaları gösterilmektedir. 

Proxy IDRelative PathMethodsHosts (VEYA)Headers (VE)
1/jokes--testmode:true, test:true
2/jokes-hostname_x.com, hostname_y.com-
3/jokes1/endpoint_x---
4/jokes1---
5/jokes---

Yönlendirme Örnekleri

Bu yapılandırmaya göre gelen istekler şu şekilde yönlendirilir:

Örnek 1: Temel Yönlendirme

İstek:

GET https://<ACCESS_URL>/jokes
TEXT

Sonuç: Proxy 5'e yönlendirilir (herhangi bir koşul sağlanmadığı için varsayılan proxy)

Örnek 2: Host Bazlı Yönlendirme

İstek:

GET https://<ACCESS_URL>/jokes
Host: hostname_x.com
TEXT

Sonuç: Proxy 2'ye yönlendirilir (host koşulu sağlandı)

Örnek 3: Eksik Header ile Yönlendirme

İstek:

GET https://<ACCESS_URL>/jokes
testmode: true
TEXT

Sonuç: Proxy 5'e yönlendirilir (Proxy 1 için her iki header gerekli, sadece biri sağlandı)

Örnek 4: Tam Header Eşleşmesi

İstek:

GET https://<ACCESS_URL>/jokes
testmode: true
test: true
TEXT

Sonuç: Proxy 1'e yönlendirilir (tüm header koşulları sağlandı)

Örnek 5: Path Önceliği - Temel Path

İstek:

GET https://<ACCESS_URL>/jokes1
TEXT

Sonuç: Proxy 4'e yönlendirilir (path tam eşleşme)

Örnek 6: Path Önceliği - Uzun Path

İstek:

GET https://<ACCESS_URL>/jokes1/endpoint_x
TEXT

Sonuç: Proxy 3'e yönlendirilir (daha spesifik path öncelikli)

Örnek 7: Path ile Alt Yol

İstek:

GET https://<ACCESS_URL>/jokes1/endpoint_x/endpoint_y
TEXT

Sonuç: Proxy 3'e yönlendirilir (en yakın parent path eşleşmesi)

Örnek 8: Path Eşleşmesi - Farklı Alt Yol

İstek:

GET https://<ACCESS_URL>/jokes1/endpoint_y
TEXT

Sonuç: Proxy 4'e yönlendirilir (parent path olarak /jokes1 eşleşti)

Örnek 9: Host ve Header Kombinasyonu

İstek:

GET https://<ACCESS_URL>/jokes
Host: hostname_x.com
testmode: true
test: true
TEXT

Sonuç: Proxy 2'ye yönlendirilir (host, header'dan daha yüksek önceliğe sahip)

Örnek 10: Farklı Path ile Host ve Header

İstek:

GET https://<ACCESS_URL>/jokes1
Host: hostname_x.com
testmode: true
test: true
TEXT

Sonuç: Proxy 4'e yönlendirilir (path önceliği en yüksek, host ve header'lar göz ardı edilir)

Önemli Notlar

Path Eşleştirme

  • Relative path eşleştirmesi en yüksek önceliğe sahiptir.
  • Daha spesifik (uzun) path'ler, daha genel (kısa) path'lerden önce değerlendirilir.
  • Tam eşleşme bulunamazsa, en yakın parent path kullanılır.

Host Eşleştirme

  • Birden fazla host tanımlanabilir.
  • Hostlar OR mantığı ile çalışır.
  • İstekteki host değeri, tanımlanan hostlardan herhangi biriyle eşleşirse koşul sağlanır.

Header Eşleştirme

  • Birden fazla header tanımlanabilir.
  • Header'lar AND mantığı ile çalışır.
  • İstekte tanımlanan tüm header'lar mevcut olmalıdır.
  • Eksik veya hatalı header durumunda bir sonraki uygun proxy'ye geçilir.

Method Eşleştirme

  • Method kontrolü en düşük önceliğe sahiptir.
  • Belirtilmezse tüm HTTP methodları kabul edilir.

Client Route özelliği, API Gateway'inizde karmaşık yönlendirme senaryolarını kolayca yönetmenizi sağlar. Öncelik sırası ve eşleştirme mantığını doğru anlayarak, esnek ve güçlü API yönlendirme yapılandırmaları oluşturabilirsiniz.

Routing Kombinasyon Tablosu

Yok → Api proxy tanımında bulunmamaktadır. Client'ın gönderdiği kontrol edilmez.

Eşleşti → Api proxy tanımında bulunmaktadır. Client'ın gönderdiği kontrol edilir, beklenen değeri gönderdi.

Eşleşmedi → Api proxy tanımında bulunmaktadır. Client'ın gönderdiği kontrol edilir, beklenen değeri göndermedi.

Bu tablo API Proxy açısından, API Proxy nasıl seçilir bilgisini göstermektedir.

#HOSTPATHMETHODHEADERSONUÇAÇIKLAMA
1YokYokYokYok✓ SEÇİLİRHiçbir kriter tanımlı değil
2YokYokYokEşleşti✓ SEÇİLİRTüm tanımlı kriterler OK (HEADER)
3YokYokYokEşleşmedi✗ REDDEDİLİRHEADER eşleşmediği için routing yapılamaz
4YokYokEşleştiYok✓ SEÇİLİRTüm tanımlı kriterler OK (METHOD)
5YokYokEşleştiEşleşti✓ SEÇİLİRTüm tanımlı kriterler OK (METHOD, HEADER)
6YokYokEşleştiEşleşmedi✗ REDDEDİLİRHEADER eşleşmediği için routing yapılamaz
7YokYokEşleşmediYok✗ REDDEDİLİRMETHOD eşleşmediği için routing yapılamaz
8YokYokEşleşmediEşleşti✗ REDDEDİLİRMETHOD eşleşmediği için routing yapılamaz
9YokYokEşleşmediEşleşmedi✗ REDDEDİLİRMETHOD, HEADER eşleşmediği için routing yapılamaz
10YokEşleştiYokYok✓ SEÇİLİRTüm tanımlı kriterler OK (PATH)
11YokEşleştiYokEşleşti✓ SEÇİLİRTüm tanımlı kriterler OK (PATH, HEADER)
12YokEşleştiYokEşleşmedi✗ REDDEDİLİRHEADER eşleşmediği için routing yapılamaz
13YokEşleştiEşleştiYok✓ SEÇİLİRTüm tanımlı kriterler OK (PATH, METHOD)
14YokEşleştiEşleştiEşleşti✓ SEÇİLİRTüm tanımlı kriterler OK (PATH, METHOD, HEADER)
15YokEşleştiEşleştiEşleşmedi✗ REDDEDİLİRHEADER eşleşmediği için routing yapılamaz
16YokEşleştiEşleşmediYok✗ REDDEDİLİRMETHOD eşleşmediği için routing yapılamaz
17YokEşleştiEşleşmediEşleşti✗ REDDEDİLİRMETHOD eşleşmediği için routing yapılamaz
18YokEşleştiEşleşmediEşleşmedi✗ REDDEDİLİRMETHOD, HEADER eşleşmediği için routing yapılamaz
19YokEşleşmediYokYok✗ REDDEDİLİRPATH eşleşmediği için routing yapılamaz
20YokEşleşmediYokEşleşti✗ REDDEDİLİRPATH eşleşmediği için routing yapılamaz
21YokEşleşmediYokEşleşmedi✗ REDDEDİLİRPATH, HEADER eşleşmediği için routing yapılamaz
22YokEşleşmediEşleştiYok✗ REDDEDİLİRPATH eşleşmediği için routing yapılamaz
23YokEşleşmediEşleştiEşleşti✗ REDDEDİLİRPATH eşleşmediği için routing yapılamaz
24YokEşleşmediEşleştiEşleşmedi✗ REDDEDİLİRPATH, HEADER eşleşmediği için routing yapılamaz
25YokEşleşmediEşleşmediYok✗ REDDEDİLİRPATH, METHOD eşleşmediği için routing yapılamaz
26YokEşleşmediEşleşmediEşleşti✗ REDDEDİLİRPATH, METHOD eşleşmediği için routing yapılamaz
27YokEşleşmediEşleşmediEşleşmedi✗ REDDEDİLİRPATH, METHOD, HEADER eşleşmediği için routing yapılamaz
28EşleştiYokYokYok✓ SEÇİLİRTüm tanımlı kriterler OK (HOST)
29EşleştiYokYokEşleşti✓ SEÇİLİRTüm tanımlı kriterler OK (HOST, HEADER)
30EşleştiYokYokEşleşmedi✗ REDDEDİLİRHEADER eşleşmediği için routing yapılamaz
31EşleştiYokEşleştiYok✓ SEÇİLİRTüm tanımlı kriterler OK (HOST, METHOD)
32EşleştiYokEşleştiEşleşti✓ SEÇİLİRTüm tanımlı kriterler OK (HOST, METHOD, HEADER)
33EşleştiYokEşleştiEşleşmedi✗ REDDEDİLİRHEADER eşleşmediği için routing yapılamaz
34EşleştiYokEşleşmediYok✗ REDDEDİLİRMETHOD eşleşmediği için routing yapılamaz
35EşleştiYokEşleşmediEşleşti✗ REDDEDİLİRMETHOD eşleşmediği için routing yapılamaz
36EşleştiYokEşleşmediEşleşmedi✗ REDDEDİLİRMETHOD, HEADER eşleşmediği için routing yapılamaz
37EşleştiEşleştiYokYok✓ SEÇİLİRTüm tanımlı kriterler OK (HOST, PATH)
38EşleştiEşleştiYokEşleşti✓ SEÇİLİRTüm tanımlı kriterler OK (HOST, PATH, HEADER)
39EşleştiEşleştiYokEşleşmedi✗ REDDEDİLİRHEADER eşleşmediği için routing yapılamaz
40EşleştiEşleştiEşleştiYok✓ SEÇİLİRTüm tanımlı kriterler OK (HOST, PATH, METHOD)
41EşleştiEşleştiEşleştiEşleşti✓ SEÇİLİRTüm tanımlı kriterler OK (HOST, PATH, METHOD, HEADER)
42EşleştiEşleştiEşleştiEşleşmedi✗ REDDEDİLİRHEADER eşleşmediği için routing yapılamaz
43EşleştiEşleştiEşleşmediYok✗ REDDEDİLİRMETHOD eşleşmediği için routing yapılamaz
44EşleştiEşleştiEşleşmediEşleşti✗ REDDEDİLİRMETHOD eşleşmediği için routing yapılamaz
45EşleştiEşleştiEşleşmediEşleşmedi✗ REDDEDİLİRMETHOD, HEADER eşleşmediği için routing yapılamaz
46EşleştiEşleşmediYokYok✗ REDDEDİLİRPATH eşleşmediği için routing yapılamaz
47EşleştiEşleşmediYokEşleşti✗ REDDEDİLİRPATH eşleşmediği için routing yapılamaz
48EşleştiEşleşmediYokEşleşmedi✗ REDDEDİLİRPATH, HEADER eşleşmediği için routing yapılamaz
49EşleştiEşleşmediEşleştiYok✗ REDDEDİLİRPATH eşleşmediği için routing yapılamaz
50EşleştiEşleşmediEşleştiEşleşti✗ REDDEDİLİRPATH eşleşmediği için routing yapılamaz
51EşleştiEşleşmediEşleştiEşleşmedi✗ REDDEDİLİRPATH, HEADER eşleşmediği için routing yapılamaz
52EşleştiEşleşmediEşleşmediYok✗ REDDEDİLİRPATH, METHOD eşleşmediği için routing yapılamaz
53EşleştiEşleşmediEşleşmediEşleşti✗ REDDEDİLİRPATH, METHOD eşleşmediği için routing yapılamaz
54EşleştiEşleşmediEşleşmediEşleşmedi✗ REDDEDİLİRPATH, METHOD, HEADER eşleşmediği için routing yapılamaz
55EşleşmediYokYokYok✗ REDDEDİLİRHOST eşleşmediği için routing yapılamaz
56EşleşmediYokYokEşleşti✗ REDDEDİLİRHOST eşleşmediği için routing yapılamaz
57EşleşmediYokYokEşleşmedi✗ REDDEDİLİRHOST, HEADER eşleşmediği için routing yapılamaz
58EşleşmediYokEşleştiYok✗ REDDEDİLİRHOST eşleşmediği için routing yapılamaz
59EşleşmediYokEşleştiEşleşti✗ REDDEDİLİRHOST eşleşmediği için routing yapılamaz
60EşleşmediYokEşleştiEşleşmedi✗ REDDEDİLİRHOST, HEADER eşleşmediği için routing yapılamaz
61EşleşmediYokEşleşmediYok✗ REDDEDİLİRHOST, METHOD eşleşmediği için routing yapılamaz
62EşleşmediYokEşleşmediEşleşti✗ REDDEDİLİRHOST, METHOD eşleşmediği için routing yapılamaz
63EşleşmediYokEşleşmediEşleşmedi✗ REDDEDİLİRHOST, METHOD, HEADER eşleşmediği için routing yapılamaz
64EşleşmediEşleştiYokYok✗ REDDEDİLİRHOST eşleşmediği için routing yapılamaz
65EşleşmediEşleştiYokEşleşti✗ REDDEDİLİRHOST eşleşmediği için routing yapılamaz
66EşleşmediEşleştiYokEşleşmedi✗ REDDEDİLİRHOST, HEADER eşleşmediği için routing yapılamaz
67EşleşmediEşleştiEşleştiYok✗ REDDEDİLİRHOST eşleşmediği için routing yapılamaz
68EşleşmediEşleştiEşleştiEşleşti✗ REDDEDİLİRHOST eşleşmediği için routing yapılamaz
69EşleşmediEşleştiEşleştiEşleşmedi✗ REDDEDİLİRHOST, HEADER eşleşmediği için routing yapılamaz
70EşleşmediEşleştiEşleşmediYok✗ REDDEDİLİRHOST, METHOD eşleşmediği için routing yapılamaz
71EşleşmediEşleştiEşleşmediEşleşti✗ REDDEDİLİRHOST, METHOD eşleşmediği için routing yapılamaz
72EşleşmediEşleştiEşleşmediEşleşmedi✗ REDDEDİLİRHOST, METHOD, HEADER eşleşmediği için routing yapılamaz
73EşleşmediEşleşmediYokYok✗ REDDEDİLİRHOST, PATH eşleşmediği için routing yapılamaz
74EşleşmediEşleşmediYokEşleşti✗ REDDEDİLİRHOST, PATH eşleşmediği için routing yapılamaz
75EşleşmediEşleşmediYokEşleşmedi✗ REDDEDİLİRHOST, PATH, HEADER eşleşmediği için routing yapılamaz
76EşleşmediEşleşmediEşleştiYok✗ REDDEDİLİRHOST, PATH eşleşmediği için routing yapılamaz
77EşleşmediEşleşmediEşleştiEşleşti✗ REDDEDİLİRHOST, PATH eşleşmediği için routing yapılamaz
78EşleşmediEşleşmediEşleştiEşleşmedi✗ REDDEDİLİRHOST, PATH, HEADER eşleşmediği için routing yapılamaz
79EşleşmediEşleşmediEşleşmediYok✗ REDDEDİLİRHOST, PATH, METHOD eşleşmediği için routing yapılamaz
80EşleşmediEşleşmediEşleşmediEşleşti✗ REDDEDİLİRHOST, PATH, METHOD eşleşmediği için routing yapılamaz
81EşleşmediEşleşmediEşleşmediEşleşmedi✗ REDDEDİLİRHOST, PATH, METHOD, HEADER eşleşmediği için routing yapılamaz