Bu makalede Reliable Web App desenini uygulama hakkında yönergeler sağlanmaktadır. Bu düzende, bulut geçişi için web uygulamalarının nasıl değiştirileceği (yeniden platform oluşturma) özetlenmiştir. İyi Tasarlanmış Çerçeve ilkeleriyle uyumlu açıklayıcı mimari, kod ve yapılandırma yönergeleri sunar.
Neden .NET için Reliable Web App deseni?
Reliable Web App düzeni, buluta geçiş yaparken web uygulamalarını nasıl yeniden hazırlamanız gerektiğini tanımlayan bir dizi ilke ve uygulama tekniğidir. Bulutta başarılı olmak için yapmanız gereken en düşük kod güncelleştirmelerine odaklanır. Aşağıdaki kılavuz, başvuru uygulamasını örnek olarak kullanır ve yolculuğunuz için iş bağlamı sağlamak üzere kurgusal relecloud şirketinin yeniden platform yolculuğunu izler. .NET için Reliable Web App desenini uygulamadan önce, Relecloud'un ASP.NET çerçevesini kullanan monolitik, şirket içi bilet oluşturma web uygulaması vardı.
İpucu
Reliable Web App deseninin başvuru uygulaması (örnek) vardır. Relecloud adlı kurgusal bir şirket için Reliable Web App uygulamasının son durumunu temsil eder. Bu makalede ele alınan tüm kod, mimari ve yapılandırma güncelleştirmelerini içeren üretim sınıfı bir web uygulamasıdır. Reliable Web App desenini uygulamanıza yol göstermek için başvuru uygulamasını dağıtın ve kullanın.
Reliable Web App desenini uygulama
Bu makale Reliable Web App desenini uygulamak için mimari, kod ve yapılandırma yönergelerini içerir. İhtiyacınız olan belirli yönergelere gitmek için aşağıdaki bağlantıları kullanın:
- İş bağlamı: Bu kılavuzu iş bağlamınızla uyumlu hale getirme ve yeniden form oluşturma kararlarını yönlendiren anlık ve uzun vadeli hedefleri tanımlamayı öğrenin.
- Mimari kılavuzu: Doğru bulut hizmetlerini seçmeyi ve iş gereksinimlerinizi karşılayan bir mimari tasarlamayı öğrenin.
- Kod kılavuzu: Buluttaki web uygulamanızın güvenilirliğini ve performans verimliliğini artırmak için üç tasarım deseni uygulayın: Yeniden Deneme, Devre Kesici ve Edilgen Önbellek desenleri
- Yapılandırma kılavuzu: Kimlik doğrulamasını ve yetkilendirmeyi, yönetilen kimlikleri, haklanmış ortamları, kod olarak altyapıyı ve izlemeyi yapılandırın.
İş bağlamı
Web uygulamasını yeniden oluşturmanın ilk adımı, iş hedeflerinizi tanımlamaktır. Hizmet düzeyi hedefleri ve maliyet iyileştirme hedefleri gibi anlık hedeflerin yanı sıra web uygulamanız için gelecekteki hedefleri de belirlemelisiniz. Bu hedefler, bulut hizmetleri seçiminizi ve buluttaki web uygulamanızın mimarisini etkiler. Web uygulamanız için %99,9 çalışma süresi gibi bir hedef SLO tanımlayın. Web uygulamanızın kullanılabilirliğini etkileyen tüm hizmetler için bileşik SLA'yı hesaplayın.
Örneğin Relecloud'un pozitif bir satış tahmini vardır ve bilet oluşturma web uygulamasına olan talebin artacağını tahmin eder. Bu talebi karşılamak için web uygulamasının hedeflerini tanımladılar:
- Düşük maliyetli, yüksek değerli kod değişiklikleri uygulama
- %99,9 hizmet düzeyi hedeflerine (SLO) ulaşma
- DevOps uygulamalarını benimseme
- Maliyet için iyileştirilmiş ortamlar oluşturma
- Güvenilirliği ve güvenliği geliştirme
Relecloud'un şirket içi altyapısı bu hedeflere ulaşmak için uygun maliyetli bir çözüm değildi. Bu nedenle, web uygulamalarını Azure'a geçirmenin, anlık ve gelecekteki hedeflerine ulaşmanın en uygun maliyetli yolu olduğuna karar verdiler.
Mimari kılavuzu
Reliable Web App deseninin birkaç temel mimari öğesi vardır. Uç nokta çözümlemesini yönetmek için DNS, kötü amaçlı HTTP trafiğini engellemek için bir web uygulaması güvenlik duvarı ve gelen kullanıcı isteklerini korumak ve yönlendirmek için bir yük dengeleyici gerekir. Uygulama platformu web uygulaması kodunuzu barındırıyor ve sanal ağdaki özel uç noktalar üzerinden tüm arka uç hizmetlerine çağrı yapıyor. Uygulama performansı izleme aracı, web uygulamanızı anlamak için ölçümleri ve günlükleri yakalar.
Şekil 1. Reliable Web App deseninin temel mimari öğeleri.
Mimariyi tasarlama
Kurtarma süresi hedefi (RTO) ve kurtarma noktası hedefi (RPO) gibi kurtarma ölçümlerinizi destekleyecek şekilde altyapınızı tasarlar. RTO kullanılabilirliği etkiler ve SLO'nuzu desteklemelidir. Bir kurtarma noktası hedefi (RPO) belirleyin ve RPO'yu karşılamak için veri yedekliliğini yapılandırın.
Altyapı güvenilirliğini seçin. Kullanılabilirlik gereksinimlerinizi karşılamak için kaç kullanılabilirlik alanına ve bölgeye ihtiyacınız olduğunu belirleyin. Bileşik SLA SLO'nuzu karşılayana kadar kullanılabilirlik alanları ve bölgeleri ekleyin. Reliable Web App deseni, etkin-etkin veya etkin-pasif yapılandırma için birden çok bölgeyi destekler. Örneğin, başvuru uygulaması %99,9 SLO'larını karşılamak için etkin-pasif yapılandırma kullanır.
Çok bölgeli bir web uygulaması için yük dengeleyicinizi, iş ihtiyacınıza bağlı olarak etkin-etkin veya etkin-pasif yapılandırmayı destekleyecek şekilde trafiği ikinci bölgeye yönlendirecek şekilde yapılandırın. İki bölge, bölgeleri bağlayan bir merkez sanal ağına sahip olması dışında aynı hizmetleri gerektirir. Ağ güvenlik duvarı gibi kaynakları merkezileştirmek ve paylaşmak için merkez-uç ağ topolojisini benimseyin. Sanal makineleriniz varsa, bunları güvenli bir şekilde yönetmek için merkez sanal ağına bir savunma konağı ekleyin (bkz. Şekil 2).
Şekil 2. İkinci bölge ve merkez-uç topolojisi ile Reliable Web App düzeni.
Bir ağ topolojisi seçin. Web ve ağ gereksinimleriniz için doğru ağ topolojisini seçin. Birden çok sanal ağa sahip olmayı planlıyorsanız merkez-uç ağ topolojisi kullanın. Şirket içi ve sanal ağlara karma bağlantı seçenekleriyle maliyet, yönetim ve güvenlik avantajları sağlar.
Doğru Azure hizmetlerini seçme
Bir web uygulamasını buluta taşıdığınızda, iş gereksinimlerinizi karşılayan ve şirket içi web uygulamasının geçerli özellikleriyle uyumlu Azure hizmetlerini seçmeniz gerekir. Hizalama, yeniden platform oluşturma çabasını en aza indirmeye yardımcı olur. Örneğin, aynı veritabanı altyapısını tutmanıza ve mevcut ara yazılımları ve çerçeveleri desteklemenize olanak sağlayan hizmetleri kullanın. Aşağıdaki bölümlerde, web uygulamanız için doğru Azure hizmetlerini seçmeye yönelik yönergeler sağlanır.
Örneğin, buluta geçmeden önce Relecloud'un bilet oluşturma web uygulaması şirket içi, monolitik ASP.NET bir uygulamaydı. İki sanal makinede çalıştı ve bir Microsoft SQL Server veritabanı vardı. Web uygulaması ölçeklenebilirlik ve özellik dağıtımında sık karşılaşılan zorluklardan muzdariptir. Bu başlangıç noktası, iş hedefleri ve SLO hizmet seçimlerini başlattı.
Uygulama platformu: Azure Uygulaması Hizmeti'ni uygulama platformunuz olarak kullanın. Relecloud, aşağıdaki nedenlerle uygulama platformu olarak Azure Uygulaması Hizmeti'ni seçti:
- Yüksek hizmet düzeyi sözleşmesi (SLA): %99,9 üretim ortamı SLO'sunu karşılayan yüksek bir SLA'ya sahiptir.
- Azaltılmış yönetim yükü: Ölçeklendirmeyi, sistem durumu denetimlerini ve yük dengelemeyi işleyen tam olarak yönetilen bir çözüm.
- .NET desteği: Uygulamanın yazıldığını .NET sürümünü destekler.
- Kapsayıcıya alma özelliği: Web uygulaması kapsayıcı oluşturmadan bulutta yakınsama gerçekleştirebilir, ancak uygulama platformu Azure hizmetlerini değiştirmeden kapsayıcılı hale getirme özelliğini de destekler.
- Otomatik ölçeklendirme: Web uygulaması, kullanıcı trafiği ve yapılandırma ayarlarına göre otomatik olarak ölçeği daraltabilir ve genişletebilir. Platform, farklı barındırma gereksinimlerini karşılamak için ölçeği artırmayı veya azaltmayı da destekler.
Kimlik yönetimi: Kimlik ve erişim yönetimi çözümünüz olarak Microsoft Entra Id kullanın. Relecloud aşağıdaki nedenlerle Microsoft Entra Id'yi seçti:
- Kimlik doğrulaması ve yetkilendirme: Uygulamanın çağrı merkezi çalışanlarının kimliğini doğrulaması ve yetkilendirmesi gerekir.
- Ölçeklenebilir: Daha büyük senaryoları destekleyecek şekilde ölçeklendirilir.
- Kullanıcı kimliği denetimi: Çağrı merkezi çalışanları mevcut kurumsal kimliklerini kullanabilir.
- Yetkilendirme protokolü desteği: Yönetilen kimlikler için OAuth 2.0'ı destekler.
Veritabanı: Aynı veritabanı altyapısını tutmanızı sağlayan bir hizmet kullanın. Veri deposu karar ağacını kullanın. Relecloud'un web uygulaması şirket içi SQL Server'ı kullandı. Bu nedenle mevcut veritabanı şemasını, saklı yordamları ve işlevleri kullanmak istediler. Azure'da çeşitli SQL ürünleri mevcuttur, ancak Relecloud aşağıdaki nedenlerle Azure SQL Veritabanı seçti:
- Güvenilirlik: Genel amaçlı katman, yüksek bir SLA ve çok bölgeli yedeklilik sağlar. Yüksek kullanıcı yükünü destekleyebilir.
- Azaltılmış yönetim yükü: Yönetilen bir SQL veritabanı örneği sağlar.
- Geçiş desteği: Şirket içi SQL Server'dan veritabanı geçişlerini destekler.
- Şirket içi yapılandırmalarla tutarlılık: Mevcut saklı yordamları, işlevleri ve görünümleri destekler.
- Dayanıklılık: Yedeklemeleri ve belirli bir noktaya geri yüklemeyi destekler.
- Uzmanlık ve minimum yeniden çalışma: SQL Veritabanı şirket içi uzmanlığından yararlanır ve benimsemek için minimum çalışma gerektirir.
Uygulama performansı izleme: Uygulamanızdaki telemetri verilerini analiz etmek için Application Insights'ı kullanın. Relecloud aşağıdaki nedenlerle Application Insights'ı kullanmayı seçti:
- Azure İzleyici ile tümleştirme: Azure İzleyici ile en iyi tümleştirmeyi sağlar.
- Anomali algılama: Performans anomalilerini otomatik olarak algılar.
- Sorun giderme: Çalışan uygulamadaki sorunları tanılamanıza yardımcı olur.
- İzleme: Kullanıcıların uygulamayı nasıl kullandığı hakkında bilgi toplar ve özel olayları kolayca izlemenize olanak tanır.
- Görünürlük açığı: Şirket içi çözümde uygulama performansı izleme çözümü yoktu. Application Insights, uygulama platformu ve koduyla kolay tümleştirme sağlar.
Önbellek: Web uygulaması mimarinize önbellek eklenip eklenmeyeceğini seçin. Redis için Azure Cache, Azure'ın birincil önbellek çözümüdür. Redis yazılımını temel alan, yönetilen bir bellek içi veri deposu. Relecloud'un web uygulaması yükü, konserleri ve mekan ayrıntılarını görüntülemeye yönelik olarak büyük ölçüde dengesizdir ve aşağıdaki nedenlerden dolayı Redis için Azure Cache eklendi:
- Azaltılmış yönetim yükü: Tam olarak yönetilen bir hizmettir.
- Hız ve birim: Yaygın olarak erişilen ve yavaş değişen veriler için yüksek veri aktarım hızına ve düşük gecikme süresi okumalarına sahiptir.
- Çeşitli desteklenebilirlik: Web uygulamasının tüm örneklerinin kullanabileceği birleşik bir önbellek konumudur.
- Dış veri deposu: Şirket içi uygulama sunucuları VM yerel önbelleğe alma işlemi gerçekleştirdi. Bu kurulum son derece sık kullanılan verileri boşaltmadı ve verileri geçersiz kılamaz.
- Yapışkan olmayan oturumlar: Oturum durumunu dışlaştırma, yapışkan olmayan oturumları destekler.
Yük dengeleyici: PaaS çözümlerini kullanan web uygulamaları Azure Front Door, Azure Uygulaması lication Gateway veya her ikisini de web uygulaması mimarisine ve gereksinimlerine göre kullanmalıdır. Doğru yük dengeleyiciyi seçmek için yük dengeleyici karar ağacını kullanın. Relecloud'un trafiği birden çok bölgeye yönlendirebilecek 7. katman yük dengeleyiciye ihtiyacı vardı. Relecloud'un %99,9 SLO'nun karşılanması için çok bölgeli bir web uygulaması gerekiyordu. Relecloud aşağıdaki nedenlerle Azure Front Door'ı seçti:
- Genel yük dengeleme: Trafiği birden çok bölgeye yönlendirebilen katman 7 yük dengeleyicidir.
- Web uygulaması güvenlik duvarı: Azure Web Uygulaması Güvenlik Duvarı ile yerel olarak tümleşir.
- Yönlendirme esnekliği: Uygulama ekibinin, uygulamada gelecekteki değişiklikleri desteklemek için giriş gereksinimlerini yapılandırmasına olanak tanır.
- Trafik hızlandırma: En yakın Azure iletişim noktasına ulaşmak ve web uygulamasına en hızlı yolu bulmak için herhangi bir yayını kullanır.
- Özel etki alanları: Esnek etki alanı doğrulaması ile özel etki alanı adlarını destekler.
- Sistem durumu yoklamaları: Uygulamanın akıllı sistem durumu yoklaması izlemesi gerekir. Azure Front Door, istemci isteklerini yönlendirmek için en iyi kaynağı belirlemek için yoklamadan gelen yanıtları kullanır.
- İzleme desteği: Hem Front Door hem de güvenlik desenleri için hepsi bir arada panoya sahip yerleşik raporları destekler. Azure İzleyici ile tümleşen uyarıları yapılandırabilirsiniz. Uygulamanın her isteği ve başarısız durum yoklamalarını günlüğe kaydetmesini sağlar.
- DDoS koruması: Yerleşik katman 3-4 DDoS korumasına sahiptir.
- İçerik teslim ağı: Relecloud'u bir içerik teslim ağı kullanacak şekilde konumlandırabilir. İçerik teslim ağı, site hızlandırma sağlar.
Web uygulaması güvenlik duvarı: Yaygın web açıklarına ve güvenlik açıklarına karşı merkezi koruma sağlamak için Azure Web Uygulaması Güvenlik Duvarı kullanın. Relecloud aşağıdaki nedenlerle Azure Web Uygulaması Güvenlik Duvarı kullandı:
- Genel koruma: Performansdan ödün vermeden gelişmiş küresel web uygulaması koruması sağlar.
- Botnet koruması: Ekip, botnet'lerle ilgili güvenlik sorunlarını gidermek için ayarları izleyebilir ve yapılandırabilir.
- Şirket içi eşlik: Şirket içi çözüm, BT tarafından yönetilen bir web uygulaması güvenlik duvarının arkasında çalışıyordu.
- Kullanım kolaylığı: Web Uygulaması Güvenlik Duvarı Azure Front Door ile tümleşir.
Yapılandırma depolama alanı: Web uygulamanıza uygulama yapılandırma depolama alanı eklenip eklenmeyeceğini seçin. Azure Uygulaması Yapılandırması, uygulama ayarlarını ve özellik bayraklarını merkezi olarak yönetmeye yönelik bir hizmettir. Bu hizmetin uygulamanız için uygun olup olmadığına karar vermek için Uygulama Yapılandırması en iyi yöntemleri gözden geçirin. Relecloud, dosya tabanlı yapılandırmayı uygulama platformu ve koduyla tümleşen merkezi bir yapılandırma deposuyla değiştirmek istedi. Mimariye aşağıdaki nedenlerle Uygulama Yapılandırması eklediler:
- Esneklik: Özellik bayraklarını destekler. Özellik bayrakları, kullanıcıların uygulamayı yeniden dağıtmadan üretim ortamındaki erken önizleme özelliklerini kabul etmelerini ve devre dışı bırakmalarını sağlar.
- Git işlem hattını destekler: Git deposu olması gereken yapılandırma verilerinin gerçek kaynağıdır. İşlem hattı, merkezi yapılandırma deposundaki verileri güncelleştirmek için gerekli.
- Yönetilen kimlikleri destekler: Yapılandırma deposu bağlantısını basitleştirmek ve güvenli hale getirmek için yönetilen kimlikleri destekler.
Gizli dizi yöneticisi: Azure'da yönetecek gizli dizileriniz varsa Azure Key Vault'ı kullanın. ConfigurationBuilder nesnesini kullanarak Key Vault'un .NET uygulamalarına dahil edebilirsiniz. Relecloud'un şirket içi web uygulaması gizli dizileri kod yapılandırma dosyalarında depolasa da, gizli dizileri RBAC ve denetim denetimlerini destekleyen bir konumda depolamak daha iyi bir güvenlik uygulamasıdır. Yönetilen kimlikler Azure kaynaklarına bağlanmak için tercih edilen çözüm olsa da Relecloud'un yönetmesi gereken uygulama gizli dizileri vardı. Relecloud, Key Vault'un aşağıdaki nedenlerle kullanıldığını gösteriyor:
- Şifreleme: Bekleyen ve aktarımdaki şifrelemeyi destekler.
- Yönetilen kimlik desteği: Uygulama hizmetleri gizli dizi deposuna erişmek için yönetilen kimlikleri kullanabilir.
- İzleme ve günlüğe kaydetme: Denetim erişimini kolaylaştırır ve depolanan gizli diziler değiştiğinde uyarılar oluşturur.
- Tümleştirme: Azure yapılandırma deposu (Uygulama Yapılandırması) ve web barındırma platformu (App Service) ile yerel tümleştirme sağlar.
Depolama çözümü: Gereksinimlerinize göre doğru depolama çözümünü seçmek için Azure depolama seçeneklerini gözden geçirin. Relecloud'un şirket içi web uygulamasında her web sunucusuna bağlı disk depolama alanı vardı, ancak ekip bir dış veri depolama çözümü kullanmak istedi. Relecloud aşağıdaki nedenlerle Azure Blob Depolama seçti:
- Güvenli erişim: Web uygulaması, anonim erişimle genel İnternet'e sunulan depolamaya erişim için uç noktaları ortadan kaldırabilir.
- Şifreleme: Bekleyen ve aktarımdaki verileri şifreler.
- Dayanıklılık: Alanlar arası yedekli depolamayı (ZRS) destekler. Alanlar arası yedekli depolama, verileri birincil bölgedeki üç Azure kullanılabilirlik alanında zaman uyumlu olarak çoğaltır. Her kullanılabilirlik alanı bağımsız güç, soğutma ve ağa sahip ayrı bir fiziksel konumdadır. Bu yapılandırma, bilet oluşturma görüntülerinin kayıplara karşı dayanıklı olmasını sağlamalıdır.
Uç nokta güvenliği: Sanal ağınızdaki özel bir uç nokta üzerinden hizmet olarak platform çözümlerine erişmek için Azure Özel Bağlantı kullanın. Sanal ağınız ile hizmet arasındaki trafik, Microsoft omurga ağı üzerinden hareket eder. Relecloud aşağıdaki nedenlerle Özel Bağlantı seçti:
- Gelişmiş güvenlik iletişimi: Uygulamanın Azure platformundaki hizmetlere özel olarak erişmesine olanak tanır ve veri sızıntılarına karşı korunmaya yardımcı olmak için veri depolarının ağ ayak izini azaltır.
- En az çaba: Özel uç noktalar, web uygulamasının kullandığı web uygulaması platformunu ve veritabanı platformunu destekler. Her iki platform da en az değişiklik için mevcut şirket içi yapılandırmaları yansıtır.
Ağ güvenliği: Gelen ve giden trafiği ağ düzeyinde denetlemek için Azure Güvenlik Duvarı kullanın. RDP/SSH bağlantı noktalarını göstermeden sanal makinelere güvenli bir şekilde bağlanmak için Azure Bastion'ı kullanın. Relecloud bir merkez-uç ağ topolojisini benimsedi ve paylaşılan ağ güvenlik hizmetlerini hub'a yerleştirmek istedi. Azure Güvenlik Duvarı, ağ güvenliğini artırmak için uçlardan giden tüm trafiği inceleyerek güvenliği artırır. Relecloud, DevOps alt ağındaki bir atlama konağından güvenli dağıtımlar için Azure Bastion'a ihtiyaç duyulur.
Kod kılavuzu
Bir web uygulamasını başarıyla buluta taşımak için web uygulaması kodunuzu Yeniden Deneme düzeni, Devre Kesici düzeni ve Edilgen Önbellek tasarım düzeniyle güncelleştirmeniz gerekir.
Şekil 3. Tasarım desenlerinin rolü.
Her tasarım deseni, İyi Tasarlanmış Çerçeve'nin diğer yapılarından biriyle uyumlu iş yükü tasarımı avantajları sağlar. Uygulamanız gereken desenlere genel bir bakış aşağıdadır:
Yeniden deneme düzeni: Yeniden deneme düzeni, aralıklı olarak başarısız olabilecek işlemleri yeniden deneyerek geçici hataları işler. Bu düzeni diğer Azure hizmetlerine yapılan tüm giden çağrılarda uygulayın.
Devre Kesici düzeni: Devre Kesici düzeni, bir uygulamanın geçici olmayan işlemleri yeniden denemesini engeller. Bu düzeni diğer Azure hizmetlerine yapılan tüm giden çağrılarda uygulayın.
Edilgen Önbellek düzeni: Edilgen Önbellek düzeni, veri deposuna göre daha sık bir önbelleğe ekler ve önbellekten alır. Veritabanına yönelik isteklerde bu düzeni uygulayın.
Tasarım deseni | Güvenilirlik (RE) | Güvenlik (SE) | Maliyet İyileştirme (CO) | Operasyonel Mükemmellik (OE) | Performans Verimliliği (PE) | WAF ilkelerini destekleme |
---|---|---|---|---|---|---|
Yeniden deneme düzeni | ✔ | RE:07 | ||||
Devre Kesici düzeni | ✔ | ✔ | RE:03 RE:07 PE:07 PE:11 |
|||
Edilgen Önbellek düzeni | ✔ | ✔ | RE:05 PE:08 PE:12 |
Yeniden Deneme desenini uygulama
Geçici hizmet kesintilerini gidermek için uygulama kodunuza Yeniden Deneme desenini ekleyin. Bu kesintilere geçici hatalar denir. Geçici hatalar genellikle saniyeler içinde çözülür. Yeniden Deneme düzeni, başarısız istekleri yeniden göndermenizi sağlar. Ayrıca istek gecikmelerini ve hatanın karşılanmadan önceki deneme sayısını yapılandırmanıza da olanak tanır.
Yerleşik yeniden deneme mekanizmalarını kullanma Azure hizmetlerinin çoğunun uygulamayı hızlandırmak için sahip olduğu yerleşik yeniden deneme mekanizmasını kullanın. Örneğin başvuru uygulaması, Azure SQL Veritabanı isteklerde Yeniden Deneme desenini uygulamak için Entity Framework Core'daki bağlantı dayanıklılığını kullanır (aşağıdaki koda bakın).
services.AddDbContextPool<ConcertDataContext>(options => options.UseSqlServer(sqlDatabaseConnectionString, sqlServerOptionsAction: sqlOptions => { sqlOptions.EnableRetryOnFailure( maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(3), errorNumbersToAdd: null); }));
Programlama kitaplıklarını yeniden deneme'yi kullanın. HTTP iletişimleri için Polly veya
Microsoft.Extensions.Http.Resilience
gibi standart bir dayanıklılık kitaplığını tümleştirin. Bu kitaplıklar, dış web hizmetleriyle iletişimi yönetmek için kritik öneme sahip kapsamlı yeniden deneme mekanizmaları sunar. Örneğin, başvuru uygulaması, kod nesneyi çağıranIConcertSearchService
bir nesne oluşturduğunuzda Yeniden Deneme düzenini zorlamak için Polly kullanır (aşağıdaki koda bakın).private void AddConcertSearchService(IServiceCollection services) { var baseUri = Configuration["App:RelecloudApi:BaseUri"]; if (string.IsNullOrWhiteSpace(baseUri)) { services.AddScoped<IConcertSearchService, MockConcertSearchService>(); } else { services.AddHttpClient<IConcertSearchService, RelecloudApiConcertSearchService>(httpClient => { httpClient.BaseAddress = new Uri(baseUri); httpClient.DefaultRequestHeaders.Add(HeaderNames.Accept, "application/json"); httpClient.DefaultRequestHeaders.Add(HeaderNames.UserAgent, "Relecloud.Web"); }) .AddPolicyHandler(GetRetryPolicy()) .AddPolicyHandler(GetCircuitBreakerPolicy()); } } private static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy() { var delay = Backoff.DecorrelatedJitterBackoffV2(TimeSpan.FromMilliseconds(500), retryCount: 3); return HttpPolicyExtensions .HandleTransientHttpError() .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) .WaitAndRetryAsync(delay); }
Devre Kesici desenini uygulama
Geçici hata olmayan hizmet kesintilerini işlemek için Devre Kesici düzenini kullanın. Devre Kesici düzeni, bir uygulamanın yanıt vermeyen bir hizmete sürekli olarak erişmeye çalışmasını engeller. Uygulamayı serbest bırakır ve cpu döngülerinin boşa harcanmasını önler, böylece uygulama son kullanıcılar için performans bütünlüğünü korur.
Örneğin, başvuru uygulaması API'ye yapılan tüm isteklerde Devre Kesici desenini uygular. Güvenli bir şekilde yeniden deneyebileceği HTTP isteklerini algılamak için mantığını kullanır HandleTransientHttpError
ancak belirtilen süre boyunca toplam hata sayısını sınırlar (aşağıdaki koda bakın).
private static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
}
Cache-Aside desenini uygulama
Bellek içi veri yönetimini geliştirmek için web uygulamanıza Cache-Aside desenini ekleyin. Desen, uygulamaya veri isteklerini işleme ve önbellek ile veritabanı gibi kalıcı bir depolama alanı arasında tutarlılık sağlama sorumluluğunu atar. Yanıt sürelerini kısaltır, aktarım hızını artırır ve daha fazla ölçeklendirme gereksinimini azaltır. Ayrıca birincil veri deposundaki yükü azaltarak güvenilirliği ve maliyet iyileştirmesini artırır. Edilgen Önbellek düzenini uygulamak için şu önerileri izleyin:
Uygulamayı önbellek kullanacak şekilde yapılandırın. Üretim uygulamaları Dağıtılmış Redis Cache'i kullanmalıdır çünkü veritabanı sorgularını azaltarak performansı artırır ve yük dengeleyicinin trafiği eşit bir şekilde dağıtabilmesi için yapışkan olmayan oturumları etkinleştirir. Örneğin, başvuru uygulaması dağıtılmış Redis önbelleğini kullanır. yöntemi,
AddAzureCacheForRedis
uygulamayı Redis için Azure Cache kullanacak şekilde yapılandırıyor (aşağıdaki koda bakın).private void AddAzureCacheForRedis(IServiceCollection services) { if (!string.IsNullOrWhiteSpace(Configuration["App:RedisCache:ConnectionString"])) { services.AddStackExchangeRedisCache(options => { options.Configuration = Configuration["App:RedisCache:ConnectionString"]; }); } else { services.AddDistributedMemoryCache(); } }
Yüksek ihtiyaç duyulan verileri önbelleğe alın. Etkinliğini yükseltmek için yüksek ihtiyaç duyulan verilere Cache-Aside desenini uygulayın. Veritabanının CPU'sunu, belleğini ve depolama alanını izlemek için Azure İzleyici'yi kullanın. Bu ölçümler, Edilgen Önbellek düzenini uyguladıktan sonra daha küçük bir veritabanı SKU'su kullanıp kullanamayacağınızı belirlemenize yardımcı olur. Örneğin, başvuru uygulaması Yaklaşan Konserler sayfasını destekleyen yüksek ihtiyaç duyulan verileri önbelleğe alır. yöntemi verileri
GetUpcomingConcertsAsync
SQL Veritabanı Redis önbelleğine çeker ve önbelleği en son konser verileriyle doldurur (aşağıdaki koda bakın).public async Task<ICollection<Concert>> GetUpcomingConcertsAsync(int count) { IList<Concert>? concerts; var concertsJson = await this.cache.GetStringAsync(CacheKeys.UpcomingConcerts); if (concertsJson != null) { // There is cached data. Deserialize the JSON data. concerts = JsonSerializer.Deserialize<IList<Concert>>(concertsJson); } else { // There's nothing in the cache. Retrieve data // from the repository and cache it for one hour. concerts = await this.database.Concerts.AsNoTracking() .Where(c => c.StartTime > DateTimeOffset.UtcNow && c.IsVisible) .OrderBy(c => c.StartTime) .Take(count) .ToListAsync(); concertsJson = JsonSerializer.Serialize(concerts); var cacheOptions = new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1) }; await this.cache.SetStringAsync(CacheKeys.UpcomingConcerts, concertsJson, cacheOptions); } return concerts ?? new List<Concert>(); }
Önbellek verilerini güncel tutun. En son veritabanı değişiklikleriyle eşitlemek için düzenli önbellek güncelleştirmeleri zamanlayın. Veri dalgalanmasına ve kullanıcı gereksinimlerine göre en uygun yenileme hızını belirleyin. Bu uygulama, uygulamanın hem hızlı erişim hem de geçerli bilgileri sağlamak için Cache-Aside desenini kullanmasını sağlar. Örneğin, başvuru uygulaması verileri yalnızca bir saat önbelleğe alır ve veriler değiştiğinde
CreateConcertAsync
önbellek anahtarını temizlemek için yöntemini kullanır (aşağıdaki koda bakın).public async Task<CreateResult> CreateConcertAsync(Concert newConcert) { database.Add(newConcert); await this.database.SaveChangesAsync(); this.cache.Remove(CacheKeys.UpcomingConcerts); return CreateResult.SuccessResult(newConcert.Id); }
Veri tutarlılığı sağlayın. Herhangi bir veritabanı yazma işleminden hemen sonra önbelleği güncelleştirmek için mekanizmalar uygulayın. Önbellek tutarlılığını sağlamak için olay temelli güncelleştirmeleri veya ayrılmış veri yönetimi sınıflarını kullanın. Önbelleği veritabanı değişiklikleriyle tutarlı bir şekilde eşitlemek, Cache-Aside deseninin merkezinde yer alır. Örneğin, başvuru uygulaması önbellekteki verileri tutarlı tutmak için yöntemini kullanır
UpdateConcertAsync
(aşağıdaki koda bakın).public async Task<UpdateResult> UpdateConcertAsync(Concert existingConcert), { database.Update(existingConcert); await database.SaveChangesAsync(); this.cache.Remove(CacheKeys.UpcomingConcerts); return UpdateResult.SuccessResult(); }
Yapılandırma kılavuzu
Aşağıdaki bölümlerde yapılandırma güncelleştirmelerini uygulama konusunda rehberlik sağlanır. Her bölüm, İyi Tasarlanmış Çerçeve'nin bir veya daha fazla sütunuyla uyumludur.
Yapılandırma | Güvenilirlik (RE) | Güvenlik (SE) | Maliyet İyileştirme (CO) | Operasyonel Mükemmellik (OE) | Performans Verimliliği (PE) | WAF ilkelerini destekleme |
---|---|---|---|---|---|---|
Kullanıcı kimlik doğrulama ve yetkilendirmeyi yapılandırma | ✔ | ✔ | SE:05 OE:10 |
|||
Yönetilen kimlikleri uygulama | ✔ | ✔ | SE:05 OE:10 |
|||
Doğru boyutta ortamlar | ✔ | CO:05 CO:06 |
||||
Otomatik ölçeklendirmeyi uygulama | ✔ | ✔ | ✔ | RE:06 CO:12 PE:05 |
||
Kaynak dağıtımını otomatikleştirme | ✔ | OE:05 | ||||
İzlemeyi uygulama | ✔ | ✔ | ✔ | OE:07 PE:04 |
Kullanıcı kimlik doğrulama ve yetkilendirmeyi yapılandırma
Web uygulamalarını Azure'a geçirirken kullanıcı kimlik doğrulaması ve yetkilendirme mekanizmalarını yapılandırın. Şu önerileri izleyin:
Kimlik platformu kullanın. Web uygulaması kimlik doğrulamasını ayarlamak için Microsoft Identity platformunu kullanın. Bu platform hem tek kiracılı hem de çok kiracılı uygulamaları destekler ve kullanıcıların Microsoft kimlikleriyle veya sosyal hesaplarıyla oturum açmasına olanak tanır.
Uygulama kaydı oluşturun. Microsoft Entra Id, birincil kiracıda bir uygulama kaydı gerektirir. Uygulama kaydı, web uygulamasına erişim elde eden kullanıcıların birincil kiracıda kimliklere sahip olmasını sağlar.
Platform özelliklerini kullanın. Kullanıcıların kimliğini doğrulamak ve verilere erişmek için platform özelliklerini kullanarak özel kimlik doğrulama kodu gereksinimini en aza indirin. Örneğin App Service, web uygulamanızda en az kod yazarak veya hiç kod yazmadan kullanıcılarda oturum açabilmeniz ve verilere erişebilmeniz için yerleşik kimlik doğrulama desteği sağlar.
Uygulamada yetkilendirmeyi zorunlu kılma. Uygulama rollerine en az ayrıcalık atamak için rol tabanlı erişim denetimlerini (RBAC) kullanın. Çakışmayı önlemek ve netlik sağlamak için farklı kullanıcı eylemleri için belirli roller tanımlayın. Kullanıcıları uygun rollerle eşleyin ve yalnızca gerekli kaynaklara ve eylemlere erişebildiklerinden emin olun.
Depolamaya geçici erişimi tercih edin. Paylaşılan erişim imzaları (SAS) gibi yetkisiz erişim ve ihlallere karşı koruma sağlamak için geçici izinleri kullanın. Geçici erişim sağlarken güvenliği en üst düzeye çıkarmak için Kullanıcı Temsilcisi SAS'lerini kullanın. Microsoft Entra Id kimlik bilgilerini kullanan ve kalıcı bir depolama hesabı anahtarı gerektirmeyen tek SAS'tir.
Azure'da yetkilendirmeyi zorunlu kılma. Kullanıcı kimliklerine en az ayrıcalık atamak için Azure RBAC kullanın. Azure RBAC, hangi Azure kaynak kimliklerinin erişebileceğini, bu kaynaklarla neler yapabileceklerini ve hangi alanlara erişebileceklerini belirler.
Kalıcı yükseltilmiş izinlerden kaçının. Ayrıcalıklı işlemler için tam zamanında erişim vermek için Microsoft Entra Privileged Identity Management'ı kullanın. Örneğin, geliştiricilerin veritabanlarını oluşturmak/silmek, tablo şemalarını değiştirmek ve kullanıcı izinlerini değiştirmek için genellikle yönetici düzeyinde erişime ihtiyacı vardır. Tam zamanında erişimle, kullanıcı kimlikleri ayrıcalıklı görevleri gerçekleştirmek için geçici izinler alır.
Yönetilen kimlikleri uygulama
Yönetilen kimlikleri destekleyen tüm Azure hizmetleri için Yönetilen Kimlikler'i kullanın. Yönetilen kimlik, Kimlik bilgilerini yönetmeden Azure kaynaklarının (iş yükü kimlikleri) kimlik doğrulaması yapmasına ve diğer Azure hizmetleriyle etkileşim kurmasına olanak tanır. Karma ve eski sistemler, geçişi basitleştirmek için şirket içi kimlik doğrulama çözümlerini tutabilir, ancak en kısa sürede yönetilen kimliklere geçiş yapmalıdır. Yönetilen kimlikleri uygulamak için şu önerileri izleyin:
Doğru yönetilen kimlik türünü seçin. Aynı izin kümesine ihtiyaç duyan iki veya daha fazla Azure kaynağınız varsa, kullanıcı tarafından atanan yönetilen kimlikleri tercih edin. Bu kurulum, bu kaynakların her biri için sistem tarafından atanan yönetilen kimlikler oluşturmaktan ve tümüne aynı izinleri atamaktan daha verimlidir. Aksi takdirde, sistem tarafından atanan yönetilen kimlikleri kullanın.
En düşük ayrıcalıkları yapılandırın. Veritabanlarındaki CRUD eylemleri veya gizli dizilere erişme gibi yalnızca işlemler için kritik olan izinleri vermek için Azure RBAC kullanın. İş yükü kimliği izinleri kalıcıdır, bu nedenle iş yükü kimliklerine tam zamanında veya kısa vadeli izinler sağlayamazsınız. Azure RBAC belirli bir senaryoya uymuyorsa Azure RBAC'yi Azure hizmet düzeyi erişim ilkeleriyle destekleyin.
Kalan gizli dizilerin güvenliğini sağlama. Kalan tüm gizli dizileri Azure Key Vault'ta depolayın. Her HTTP isteği yerine uygulama başlangıcında Key Vault'tan gizli dizileri yükleyin. HTTP isteklerinde yüksek frekanslı erişim Key Vault işlem sınırlarını aşabilir. Uygulama yapılandırmalarını Azure Uygulaması Yapılandırması'nda depolayın.
Örneğin, başvuru uygulaması SQL veritabanı bağlantı dizesi bağımsız değişkenini Authentication
kullanarak App Service'in yönetilen kimlikle SQL veritabanına bağlanabilmesini sağlar: Server=tcp:my-sql-server.database.windows.net,1433;Initial Catalog=my-sql-database;Authentication=Active Directory Default
. Web API'sinin yönetilen kimlik kullanarak Key Vault'a bağlanmasına izin vermek için kullanır DefaultAzureCredential
(aşağıdaki koda bakın).
builder.Configuration.AddAzureAppConfiguration(options =>
{
options
.Connect(new Uri(builder.Configuration["Api:AppConfig:Uri"]), new DefaultAzureCredential())
.ConfigureKeyVault(kv =>
{
// Some of the values coming from Azure App Configuration
// are stored in Key Vault. Use the managed identity
// of this host for the authentication.
kv.SetCredential(new DefaultAzureCredential());
});
});
Doğru boyutta ortamlar
Her ortamın gereksinimlerini fazla olmadan karşılayan Azure hizmetlerinin performans katmanlarını (SKU' lar) kullanın. Ortamlarınızı doğru boyutlandırmak için şu önerileri izleyin:
Maliyetleri tahmin edin. Her ortamın maliyetini tahmin etmek için Azure fiyatlandırma hesaplayıcısını kullanın.
Maliyet iyileştirme üretim ortamları. Üretim ortamlarında, üretim için gereken hizmet düzeyi sözleşmelerini (SLA), özellikleri ve ölçeği karşılayan SKU'lar gerekir. Kaynak kullanımını sürekli izleyin ve SKU'ları gerçek performans gereksinimleriyle uyumlu olacak şekilde ayarlayın.
Maliyet iyileştirme ön üretim ortamları. Ön üretim ortamları daha düşük maliyetli kaynaklar kullanmalı, gereksiz hizmetleri devre dışı bırakmalı ve Azure Geliştirme/Test fiyatlandırması gibi indirimler uygulamalıdır. Ön üretim ortamlarının, risklerden kaçınmak için üretim ortamına yeterince benzediğinden emin olun. Bu denge, gereksiz maliyetlere neden olmadan testin etkili kalmasını sağlar.
Kod olarak altyapı (IaC) kullanarak SKU'ları tanımlayın. Ortama göre doğru SKU'ları dinamik olarak seçmek ve dağıtmak için IaC uygulayın. Bu yaklaşım tutarlılığı artırır ve yönetimi basitleştirir.
Örneğin, başvuru uygulaması üretim ortamına daha pahalı katmanlar (SKU' lar) dağıtmak için Bicep parametrelerini kullanır.
var redisCacheSkuName = isProd ? 'Standard' : 'Basic'
var redisCacheFamilyName = isProd ? 'C' : 'C'
var redisCacheCapacity = isProd ? 1 : 0
Otomatik ölçeklendirmeyi uygulama
Otomatik ölçeklendirme, bir web uygulamasının dayanıklı, esnek ve dinamik iş yüklerini verimli bir şekilde işleyebilmesini sağlar. Otomatik ölçeklendirmeyi uygulamak için şu önerileri izleyin:
Ölçeği genişletmeyi otomatikleştirme. Üretim ortamlarında yatay ölçeklendirmeyi otomatikleştirmek için Azure otomatik ölçeklendirmeyi kullanın. Uygulamanızın farklı yükleri işleyebilmesi için önemli performans ölçümlerine göre ölçeği genişletmek için otomatik ölçeklendirme kurallarını yapılandırın.
Ölçeklendirme tetikleyicilerini daraltma. Uygulamanızın ölçeklendirme gereksinimlerini bilmiyorsanız ilk ölçeklendirme tetikleyiciniz olarak CPU kullanımıyla başlayın. Ölçeklendirme tetikleyicilerinizi RAM, ağ aktarım hızı ve disk G/Ç gibi diğer ölçümleri içerecek şekilde geliştirin. Amaç, daha iyi performans için web uygulamanızın davranışıyla eşleştirmektir.
Ölçeği genişletme arabelleği sağlayın. Maksimum kapasiteye ulaşmadan önce ölçeklendirme eşiklerinizi tetiklenmesi için ayarlayın. Örneğin, ölçeklendirmeyi %100'e ulaşana kadar beklemek yerine %85 CPU kullanımıyla gerçekleşecek şekilde yapılandırın. Bu proaktif yaklaşım performansı korumaya ve olası performans sorunlarını önlemeye yardımcı olur.
Kaynak dağıtımını otomatikleştirme
Tüm ortamlarda Azure kaynaklarını ve kodunu dağıtmak ve güncelleştirmek için otomasyonu kullanın. Şu önerileri izleyin:
Altyapıyı kod olarak kullanın. Sürekli tümleştirme ve sürekli teslim (CI/CD) işlem hatları aracılığıyla altyapıyı kod olarak dağıtın. Azure'da her Azure kaynağı için önceden hazırlanmış Bicep, ARM (JSON) ve Terraform şablonları vardır.
Sürekli tümleştirme/sürekli dağıtım (CI/CD) işlem hattı kullanın. Kaynak denetiminden test, hazırlama ve üretim gibi çeşitli ortamlarınıza kod dağıtmak için CI/CD işlem hattı kullanın. GitHub projeleri için Azure DevOps veya GitHub Actions ile çalışıyorsanız Azure Pipelines'ı kullanın.
Birim testlerini tümleştirme. App Services'e herhangi bir dağıtımdan önce işlem hattınızdaki tüm birim testlerinin yürütülmesine ve geçirilmesine öncelik verme. Kapsamlı test kapsamı elde etmek için SonarQube gibi kod kalitesi ve kapsam araçlarını birleştirir.
Sahte çerçeveyi benimseyin. Dış uç noktaları içeren testler için sahte çerçeveleri kullanın. Bu çerçeveler sanal uç noktalar oluşturmanıza olanak sağlar. Gerçek dış uç noktaları yapılandırma gereksinimini ortadan kaldırır ve ortamlar arasında tekdüzen test koşulları sağlar.
Güvenlik taramaları gerçekleştirin. Kaynak kodunuzda güvenlik açıklarını ve kodlama hatalarını bulmak için statik uygulama güvenlik testi (SAST) kullanın. Ayrıca, güvenlik riskleri için üçüncü taraf kitaplıklarını ve bileşenlerini incelemek için yazılım oluşturma analizi (SCA) gerçekleştirin. Bu analizlere yönelik araçlar hem GitHub hem de Azure DevOps ile kolayca tümleştirilir.
İzlemeyi uygulama
Web uygulamanızın operasyonel mükemmelliği ve performans verimliliğini artırmak için uygulama ve platform izleme uygulayın. İzlemeyi uygulamak için şu önerileri izleyin:
Uygulama telemetrisi toplayın. kod değişikliği olmadan istek aktarım hızı, ortalama istek süresi, hatalar ve bağımlılık izleme gibi uygulama telemetrisini toplamak için Azure Uygulaması lication Insights'ta otomatik yetkisiz kullanımı kullanın.
Başvuru uygulaması, telemetri koleksiyonunu etkinleştirmek için NuGet paketinden
Microsoft.ApplicationInsights.AspNetCore
kullanırAddApplicationInsightsTelemetry
(aşağıdaki koda bakın).public void ConfigureServices(IServiceCollection services) { ... services.AddApplicationInsightsTelemetry(Configuration["App:Api:ApplicationInsights:ConnectionString"]); ... }
Özel uygulama ölçümleri oluşturun. Özel uygulama telemetrisi için kod tabanlı izleme kullanın. Kodunuza Application Insights SDK'sını ekleyin ve Application Insights API'sini kullanın.
Başvuru uygulaması, sepet etkinliğiyle ilgili olaylar üzerinde telemetri toplar.
this.telemetryClient.TrackEvent
sepete eklenen biletleri sayar. Olay adını (AddToCart
) sağlar ve vecount
içeren bir sözlükconcertId
belirtir (aşağıdaki koda bakın).this.telemetryClient.TrackEvent("AddToCart", new Dictionary<string, string> { { "ConcertId", concertId.ToString() }, { "Count", count.ToString() } });
Platformu izleyin. Desteklenen tüm hizmetler için tanılamayı etkinleştirin ve bağıntı için uygulama günlükleriyle aynı hedefe tanılama gönderin. Azure hizmetleri platform günlüklerini otomatik olarak oluşturur ancak yalnızca tanılamayı etkinleştirdiğinizde depolar. Tanılamayı destekleyen her hizmet için tanılama ayarlarını etkinleştirin.
Başvuru uygulamasını dağıtma
Başvuru uygulaması, geliştiricilere şirket içi ASP.NET uygulamasından Azure'a sanal geçişte yol gösterir ve ilk benimseme aşamasında gerekli değişiklikleri vurgular. Bu örnekte, şirket içi web uygulaması aracılığıyla bilet satan kurgusal Relecloud şirketi için bir konser bileti uygulaması kullanılır. Relecloud, web uygulaması için aşağıdaki hedefleri belirler:
- Düşük maliyetli, yüksek değerli kod değişiklikleri uygulama
- %99,9 hizmet düzeyi hedefi (SLO) elde edin
- DevOps uygulamalarını benimseme
- Maliyet için iyileştirilmiş ortamlar oluşturma
- Güvenilirliği ve güvenliği geliştirme
Relecloud, şirket içi altyapılarının bu hedeflere ulaşmak için uygun maliyetli bir çözüm olmadığını belirledi. CamS web uygulamalarını Azure'a geçirmenin, anlık ve gelecekteki hedeflerine ulaşmanın en uygun maliyetli yolu olduğuna karar verdiler. Aşağıdaki mimari, Relecloud'un Reliable Web App desen uygulamasının son durumunu temsil eder.
Şekil 3. Başvuru uygulamasının mimarisi. Bu mimarinin Visio dosyasını indirin.