Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
UYGULANANLAR: Tüm API Management katmanları
Azure API Management hizmeti, anahtar olarak kaynak URL'sini kullanarak HTTP yanıtı önbelleğe alma için yerleşik desteğe sahiptir. Özellikleri kullanan vary-by istek üst bilgilerini kullanarak anahtarı değiştirebilirsiniz. Bu teknik, HTTP yanıtlarının tamamını önbelleğe almak için yararlıdır (gösterimler olarak da bilinir), ancak bazen gösterimin yalnızca bir bölümünü önbelleğe almak yararlı olabilir.
Cache-lookup-value ve cache-store-value ilkeleri, ilke tanımları içinde rastgele veri parçalarını depolama ve alma olanağı sağlar. Bu özellik, dış hizmetlerden gelen yanıtları önbelleğe alabildiğiniz için gönderme isteği ilkesine de değer ekler.
Architecture
API Management hizmeti, birden çok birimde ölçeği artırdıkça aynı önbelleğe alınmış verilere erişmeye devam edebilmeniz için kiracı başına paylaşılan bir iç veri önbelleği kullanır. Ancak, çok bölgeli bir dağıtımla çalışırken her bölgede bağımsız önbellekler vardır. Önbelleği bir veri deposu olarak ele almamak önemlidir; burada bazı bilgilerin tek kaynağıdır. Bunu yaptıysanız ve daha sonra çok bölgeli dağıtımdan yararlanmaya karar verdiyseniz, seyahat eden kullanıcıları olan müşteriler önbelleğe alınan verilere erişimi kaybedebilir.
Uyarı
İç önbellek, Azure API Management'ın Tüketim katmanında kullanılamaz. Bunun yerine dış Redis uyumlu bir önbellek kullanabilirsiniz . Dış önbellek, tüm katmanlardaki API Management örnekleri için daha fazla önbellek denetimi ve esneklik sağlar.
Parça önbelleğe alma
Döndürülen yanıtların, verilerin hesaplanması maliyetli olan belirli bir kısmını içerdiği bazı durumlar vardır. Ancak veriler makul bir süre boyunca güncel kalır. Örneğin, uçuş rezervasyonları, uçuş durumu vb. ile ilgili bilgi sağlayan bir havayolu şirketi tarafından oluşturulan bir hizmeti düşünün. Kullanıcı havayolları puan programına üyeyse, geçerli durumu ve birikmiş mesafe ile ilgili bilgilere de sahip olacaktır. Kullanıcıyla ilgili bu bilgiler farklı bir sistemde depolanabilir, ancak uçuş durumu ve rezervasyonlar hakkında döndürülen yanıtlara eklenmesi istenebilir. Parça önbelleğe alma adlı bir işlem kullanarak bu verileri ekleyebilirsiniz. Birincil gösterim, kullanıcıyla ilgili bilgilerin nereye eklendiğini belirtmek için bir tür belirteç kullanılarak kaynak sunucudan döndürülebilir.
Arka uç API'sinden aşağıdaki JSON yanıtını göz önünde bulundurun.
{
"airline" : "Air Canada",
"flightno" : "871",
"status" : "ontime",
"gate" : "B40",
"terminal" : "2A",
"userprofile" : "$userprofile$"
}
İkincil bir kaynak /userprofile/{userid} şu şekilde görünür:
{ "username" : "Bob Smith", "Status" : "Gold" }
Eklenecek uygun kullanıcı bilgilerini belirlemek için API Management'ın son kullanıcının kim olduğunu belirlemesi gerekir. Bu mekanizma uygulamaya bağımlıdır. Aşağıdaki örnek, bir Subject belirteç JWT talebini kullanır.
<set-variable
name="enduserid"
value="@(context.Request.Headers.GetValueOrDefault("Authorization","").Split(' ')[1].AsJwt()?.Subject)" />
API Management değeri enduserid daha sonra kullanmak üzere bir bağlam değişkeninde depolar. Sonraki adım, önceki bir isteğin kullanıcı bilgilerini alıp önbellekte depolayıp depolamadığını belirlemektir. Bunun için API Management ilkeyi cache-lookup-value kullanır.
<cache-lookup-value
key="@("userprofile-" + context.Variables["enduserid"])"
variable-name="userprofile" />
<rate-limit calls="10" renewal-period="60" />
Uyarı
Önbellek aramasının ardından, çağrı sayısını sınırlamaya ve önbelleğin kullanılabilir olmaması durumunda arka uç hizmetinde aşırı yüklemeyi önlemeye yardımcı olmak için bir hız sınırı ilkesi (veya anahtara göre hız sınırı ilkesi) ekleyin.
Önbellekte anahtar değerine karşılık gelen bir giriş yoksa bağlam userprofile değişkeni oluşturulmaz. API Management, kontrol akışı politikasını kullanarak aramanın başarısını choose denetler.
<choose>
<when condition="@(!context.Variables.ContainsKey("userprofile"))">
<!-- If the userprofile context variable doesn’t exist, make an HTTP request to retrieve it. -->
</when>
</choose>
userprofile Bağlam değişkeni yoksa API Management'ın bunu almak için bir HTTP isteğinde bulunması gerekir.
<send-request
mode="new"
response-variable-name="userprofileresponse"
timeout="10"
ignore-error="true">
<!-- Build a URL that points to the profile for the current end-user -->
<set-url>@(new Uri(new Uri("https://apimairlineapi.azurewebsites.net/UserProfile/"),
(string)context.Variables["enduserid"]).AbsoluteUri)
</set-url>
<set-method>GET</set-method>
</send-request>
API Management, kullanıcı profili kaynağının URL'sini oluşturmak için öğesini kullanır enduserid . API Management yanıtı aldıktan sonra gövde metnini yanıttan çıkarır ve bir bağlam değişkenine geri depolar.
<set-variable
name="userprofile"
value="@(((IResponse)context.Variables["userprofileresponse"]).Body.As<string>())" />
Aynı kullanıcı başka bir istek yaptığında API Management'ın bu HTTP isteğini yeniden yapmasını önlemek için, kullanıcı profilinin önbellekte depolandığını belirtebilirsiniz.
<cache-store-value
key="@("userprofile-" + context.Variables["enduserid"])"
value="@((string)context.Variables["userprofile"])" duration="100000" />
API Management, API Management'ın ilk olarak almaya çalıştığı anahtarı kullanarak değeri önbellekte depolar. API Management'ın değeri depolamak için seçtiği süre, bilgilerin ne sıklıkta değiştiğine ve kullanıcıların güncel olmayan bilgilere ne kadar dayanıklı olduğuna bağlı olmalıdır.
Önbellekten bilgi almanın hala işlem dışı bir ağ isteği olduğunu ve isteğe onlarca milisaniye ekleyebileceğini fark etmek önemlidir. Kullanıcı profili bilgilerinin belirlenmesinin, veritabanı sorguları veya birden fazla arka uç sistemden bilgi toplama gereksinimi nedeniyle önbellekten bilgi alınmasından daha uzun sürmesi durumunda avantajlar ortaya çıkar.
İşlemin son adımı, döndürülen yanıtı kullanıcı profili bilgileriyle güncelleştirmektir.
<!-- Update response body with user profile-->
<find-and-replace
from='"$userprofile$"'
to="@((string)context.Variables["userprofile"])" />
Değiştirme gerçekleşmediğinde bile yanıtın geçerli bir JSON olması için tırnak işaretlerini belirtecin parçası olarak eklemeyi seçebilirsiniz.
Bu adımları birleştirdikten sonra sonuç, aşağıdakine benzer bir ilke olur.
<policies>
<inbound>
<!-- How you determine user identity is application dependent -->
<set-variable
name="enduserid"
value="@(context.Request.Headers.GetValueOrDefault("Authorization","").Split(' ')[1].AsJwt()?.Subject)" />
<!--Look for userprofile for this user in the cache -->
<cache-lookup-value
key="@("userprofile-" + context.Variables["enduserid"])"
variable-name="userprofile" />
<rate-limit calls="10" renewal-period="60" />
<!-- If API Management doesn’t find it in the cache, make a request for it and store it -->
<choose>
<when condition="@(!context.Variables.ContainsKey("userprofile"))">
<!-- Make HTTP request to get user profile -->
<send-request
mode="new"
response-variable-name="userprofileresponse"
timeout="10"
ignore-error="true">
<!-- Build a URL that points to the profile for the current end-user -->
<set-url>@(new Uri(new Uri("https://apimairlineapi.azurewebsites.net/UserProfile/"),(string)context.Variables["enduserid"]).AbsoluteUri)</set-url>
<set-method>GET</set-method>
</send-request>
<!-- Store response body in context variable -->
<set-variable
name="userprofile"
value="@(((IResponse)context.Variables["userprofileresponse"]).Body.As<string>())" />
<!-- Store result in cache -->
<cache-store-value
key="@("userprofile-" + context.Variables["enduserid"])"
value="@((string)context.Variables["userprofile"])"
duration="100000" />
</when>
</choose>
<base />
</inbound>
<outbound>
<!-- Update response body with user profile-->
<find-and-replace
from='"$userprofile$"'
to="@((string)context.Variables["userprofile"])" />
<base />
</outbound>
</policies>
Bu önbelleğe alma yaklaşımı öncelikle HTML'nin sunucu tarafında oluşturularak tek bir sayfa olarak işlenebilmesi için web sitelerinde kullanılır. İstemcilerin istemci tarafı HTTP önbelleğe alma işlemini gerçekleştiremediği veya bu sorumluluğu istemciye yüklememek istendiği API'lerde de yararlı olabilir.
Bu tür parça önbelleğe alma işlemi, redis önbelleğe alma sunucusu kullanılarak arka uç web sunucularında da yapılabilir. Ancak, önbelleğe alınan parçalar birincil yanıtlardan farklı arka uçlardan geliyorsa, bu işi gerçekleştirmek için API Management hizmetini kullanmak yararlıdır.
Saydam sürüm oluşturma
Bir API'nin birden çok farklı uygulama sürümünün herhangi bir anda desteklenmesi yaygın bir uygulamadır. Örneğin, farklı ortamları (geliştirme, test, üretim vb.) desteklemek veya API tüketicilerinin daha yeni sürümlere geçişine zaman tanımak için API'nin eski sürümlerini desteklemek.
İstemci geliştiricilerin URL'leri /v1/customers/v2/customersolarak değiştirmesini gerektirmek yerine, birden çok sürümü işlemeye yönelik bir yaklaşım, tüketicinin profil verilerinde kullanmak istedikleri API'nin hangi sürümünü depolamak ve uygun arka uç URL'sini çağırmaktır. Belirli bir istemci için çağrılacak doğru arka uç URL'sini belirlemek için bazı yapılandırma verilerini sorgulamak gerekir. Bu yapılandırma verilerini önbelleğe aldığınızda, API Management bu aramayı yapmayla ilgili performans etkisini en aza indirebilir.
İlk adım, istenen sürümü yapılandırmak için kullanılan tanımlayıcıyı belirlemektir. Bu örnekte sürümü ürün abonelik anahtarıyla ilişkilendireceğiz.
<set-variable name="clientid" value="@(context.Subscription.Key)" />
ARDıNDAN API Management, istenen istemci sürümünü alıp almadığını görmek için bir önbellek araması yapar.
<cache-lookup-value
key="@("clientversion-" + context.Variables["clientid"])"
variable-name="clientversion" />
<rate-limit calls="10" renewal-period="60" />
Uyarı
Önbellek aramasının ardından, çağrı sayısını sınırlamaya ve önbelleğin kullanılabilir olmaması durumunda arka uç hizmetinde aşırı yüklemeyi önlemeye yardımcı olmak için bir hız sınırı ilkesi (veya anahtara göre hız sınırı ilkesi) ekleyin.
Ardından API Management, önbellekte bulup bulmadığını denetler.
<choose>
<when condition="@(!context.Variables.ContainsKey("clientversion"))">
API Management aradığını bulamazsa, onu geri getirir.
<send-request
mode="new"
response-variable-name="clientconfiguresponse"
timeout="10"
ignore-error="true">
<set-url>@(new Uri(new Uri(context.Api.ServiceUrl.ToString() + "api/ClientConfig/"),(string)context.Variables["clientid"]).AbsoluteUri)</set-url>
<set-method>GET</set-method>
</send-request>
Yanıt gövdesi metnini yanıttan ayıklayın.
<set-variable
name="clientversion"
value="@(((IResponse)context.Variables["clientconfiguresponse"]).Body.As<string>())" />
Gelecekte kullanmak üzere önbellekte depolayın.
<cache-store-value
key="@("clientversion-" + context.Variables["clientid"])"
value="@((string)context.Variables["clientversion"])"
duration="100000" />
Son olarak, istemci tarafından istenen hizmet sürümünü seçmek için arka uç URL'sini güncelleştirin.
<set-backend-service
base-url="@(context.Api.ServiceUrl.ToString() + "api/" + (string)context.Variables["clientversion"] + "/")" />
İlkenin tamamı aşağıdaki gibidir:
<inbound>
<base />
<set-variable name="clientid" value="@(context.Subscription.Key)" />
<cache-lookup-value key="@("clientversion-" + context.Variables["clientid"])" variable-name="clientversion" />
<rate-limit calls="10" renewal-period="60" />
<!-- If API Management doesn’t find it in the cache, make a request for it and store it -->
<choose>
<when condition="@(!context.Variables.ContainsKey("clientversion"))">
<send-request mode="new" response-variable-name="clientconfiguresponse" timeout="10" ignore-error="true">
<set-url>@(new Uri(new Uri(context.Api.ServiceUrl.ToString() + "api/ClientConfig/"),(string)context.Variables["clientid"]).AbsoluteUri)</set-url>
<set-method>GET</set-method>
</send-request>
<!-- Store response body in context variable -->
<set-variable name="clientversion" value="@(((IResponse)context.Variables["clientconfiguresponse"]).Body.As<string>())" />
<!-- Store result in cache -->
<cache-store-value key="@("clientversion-" + context.Variables["clientid"])" value="@((string)context.Variables["clientversion"])" duration="100000" />
</when>
</choose>
<set-backend-service base-url="@(context.Api.ServiceUrl.ToString() + "api/" + (string)context.Variables["clientversion"] + "/")" />
</inbound>
Bu zarif çözüm, API tüketicilerinin istemcilerini güncelleştirmek ve yeniden dağıtmak zorunda kalmadan istemcilerinin hangi arka uç sürümüne eriştiğini şeffaf bir şekilde denetlemesini sağlayarak birçok API sürümü oluşturma sorunlarını giderir.
Kiracı yalıtımı
Daha büyük, çok kiracılı dağıtımlarda bazı şirketler arka uç donanımının ayrı dağıtımlarında ayrı kiracı grupları oluşturur. Bu yapı, arka uçta donanım sorunu olduğunda etkilenen müşteri sayısını en aza indirir. Ayrıca, yeni yazılım sürümlerinin aşamalı olarak dağıtılabilmesini sağlar. İdeal olan bu arka uç mimarisinin API tüketicileri için şeffaf olmasıdır. Saydam sürüm oluşturma gibi bir teknik kullanarak ve API anahtarı başına yapılandırma durumunu kullanarak arka uç URL'sini düzenleyerek bu saydamlığı elde edebilirsiniz.
Her abonelik anahtarı için API'nin tercih edilen bir sürümünü döndürmek yerine, kiracıyı atanan donanım grubuyla ilişkilendiren bir tanımlayıcı döndürebilirsiniz. Bu tanımlayıcı uygun arka uç URL'sini oluşturmak için kullanılabilir.
Özet
Her tür veriyi depolamak için Azure API yönetim önbelleğini kullanma özgürlüğü, gelen isteğin işlenme şeklini etkileyebilecek yapılandırma verilerine verimli erişim sağlar. Ayrıca, arka uç API'sinden döndürülen yanıtları artırabilen veri parçalarını depolamak için de kullanılabilir.