.NET için Güvenilir Web Uygulaması düzeni
Bu makalede Reliable Web App desenini uygulamaya yönelik 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 platforma alındığı) açıklanmaktadır. Azure Well-Architected Framework ilkeleriyle uyumlu açıklayıcı mimari, kod ve yapılandırma yönergeleri sağlar.
Neden .NET için Reliable Web App deseni?
Reliable Web App düzeni, web uygulamalarını buluta geçirirken nasıl yeniden platform oluşturmanı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ılavuzda, örnek olarak bir başvuru uygulaması kullanılır. Kılavuz, 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 bir şirket içi anahtarlama 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 uygulamaya yönelik 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.
- Mimarisi kılavuzu. Doğru bulut hizmetlerini seçmeyi ve iş gereksinimlerinizi karşılayan bir mimari tasarlamayı öğrenin.
- Kodu kılavuzu. Bulutta 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 Cache-Aside desenleri.
- Yapılandırma kılavuzu. Kimlik doğrulaması 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 (SLO) ve maliyet iyileştirme hedefleri ve ayrıca web uygulamanız için gelecekteki hedefler gibi anlık hedefler belirlemeniz gerekir. 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 uygulayın.
- 99,9%SLO'ya ulaşın.
- DevOps uygulamalarını benimseme.
- Maliyet için iyileştirilmiş ortamlar oluşturun.
- Güvenilirliği ve güvenliği geliştirin.
Relecloud'un şirket içi altyapısı bu hedeflere ulaşmak için uygun maliyetli bir çözüm değildi. Web uygulamalarını Azure'a geçirmenin, hemen 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 yönlendirmek ve korumaya yardımcı olmak 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ı anlamanıza yardımcı olmak için ölçümleri ve günlükleri yakalar.
Reliable Web App deseninin temel mimari öğelerini gösteren
Şekil 1. Reliable Web App deseninin temel mimari öğeleri.
Mimariyi tasarlama
Altyapınızı, kurtarma süresi hedefiniz (RTO) ve kurtarma noktası hedefiniz (RPO) gibi kurtarma ölçümlerinizi destekleyecek şekilde tasarlar. RTO kullanılabilirliği etkiler ve SLO'nuzu desteklemelidir. RPO'yu belirleyin ve RPO'yu karşılamak için veri yedekliliği 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ş gereksiniminize 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. Bir bölgenin bölgeleri bağlayan bir merkez sanal ağına sahip olması dışında, iki bölge 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ı gelişmiş güvenlikle 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ğ kullanmayı planlıyorsanız, merkez-uç ağ topolojisi kullanın. Şirket içi ve sanal ağlara maliyet, yönetim ve güvenlik avantajları ile karma bağlantı seçenekleri 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 Olan Azure hizmetlerini seçmeniz gerekir. Bu 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 taşınmadan önce Relecloud'un bilet oluşturma web uygulaması şirket içi monolitik bir ASP.NET uygulamasıydı. İki sanal makinede çalıştı ve bir SQL Server veritabanı kullandı. Web uygulaması ölçeklenebilirlik ve özellik dağıtımıyla ilgili yaygın sorunlardan 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 App Service'i seçti:
- Yüksek hizmet düzeyi sözleşmesi (SLA). 99,9%üretim ortamı SLO'sunu karşılayan yüksek bir SLA'sı vardır.
- 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 bulut üzerinde yakınsama gerçekleştirebilir, ancak uygulama platformu Azure hizmetlerini değiştirmeden kapsayıcılı hale getirmeyi de destekler.
- Otomatik ölçeklendirme. Web uygulaması, kullanıcı trafiğine ve yapılandırma ayarlarına göre ölçeği otomatik olarak 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. Microsoft Entra Id, 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. Microsoft Entra ID, yönetilen kimlikler için OAuth 2.0'ı destekler.
Veritabanı: Aynı veritabanı altyapısını tutmanızı sağlayan bir hizmet kullanın. Seçiminize yol göstermek için veri deposu karar ağacı kullanın. Relecloud'un web uygulaması şirket içi SQL Server'ı kullandı. 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ü. SQL Veritabanı 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.
- Esnek -lik. Yedeklemeleri ve belirli bir noktaya geri yüklemeyi destekler.
- Uzmanlık ve minimum yeniden çalışma. SQL Veritabanı, Relecloud'un mevcut uzmanlıklardan yararlanmasını sağlar ve benimsemek için minimum çalışma gerektirir.
Uygulama performansı izleme: Uygulamanız için telemetriyi 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.
- Izleme. Kullanıcıların uygulamayı nasıl kullandığı hakkında bilgi toplar ve özel olayları kolayca izlemenizi sağlar.
- Görünürlük boşluğu. Şirket içi çözümün uygulama performansı izleme çözümü yoktu. Application Insights, uygulama platformu ve koduyla kolay tümleştirme sağlar.
Önbelleği: Web uygulaması mimarinize önbellek eklenip eklenmeyeceğini seçin. Redis için Azure Cache birincil Azure önbelleği çö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. Relecloud aşağıdaki nedenlerle Redis için Azure Cache'i ekledi:
- Azaltılmış yönetim yükü. Tam olarak yönetilen bir hizmettir.
- Hız ve ses düzeyi. 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. Bu, web uygulamasının tüm örneklerinin kullanması için 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ının web uygulaması mimarisine ve gereksinimlerine bağlı olarak Azure Front Door, Azure Application Gateway veya her ikisini birden kullanması gerekir. 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ı. Şirketin 99,9%SLO'sunu karşılamak için çok bölgeli bir web uygulamasına ihtiyacı vardı. Relecloud aşağıdaki nedenlerle Azure Front Door'ı seçti:
- Genel yük dengeleme. Bu, trafiği birden çok bölgeye yönlendirebilen 7. katman 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ı. Uygulama akıllı sistem durumu yoklaması izlemesi gerektirir. 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 Azure Front Door hem de güvenlik desenleri için hepsi bir arada pano içeren yerleşik raporları destekler. Azure İzleyici ile tümleşen uyarıları yapılandırabilirsiniz. Azure Front Door, 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 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ı'nı kullanır:
- Küresel koruma. Performansdan ödün vermeden gelişmiş küresel web uygulaması koruması sağlar.
- Botnet koruması. Ekip, botnetlerle 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 uygulama yeniden dağıtımına gerek kalmadan üretim ortamındaki erken önizleme özelliklerini kabul etmelerini ve devre dışı bırakmalarını sağlar.
- Git işlem hattı desteği. Yapılandırma verilerinin doğruluk kaynağı bir Git deposu olması gerekiyordu. İşlem hattı, merkezi yapılandırma deposundaki verileri güncelleştirmek için gerekli.
- Yönetilen kimlik desteği. 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. Key Vault, denetim erişimini kolaylaştırır ve depolanan gizli diziler değiştiğinde uyarılar oluşturur.
- Entegrasyon. Key Vault, 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 Azure depolama seçeneklerine bakın. 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:
- Gelişmiş güvenlik erişimi. Web uygulaması, anonim erişimle genel İnternet'e sunulan depolamaya erişim için uç noktaları ortadan kaldırabilir.
- Şifreleme. Blob Depolama bekleyen ve aktarımdaki verileri şifreler.
- Esnek -lik. Blob Depolama 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 uç nokta üzerinden hizmet olarak platform (PaaS) çö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. Özel Bağlantı, 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.
- Çok az çaba. Özel uç noktalar, web uygulamasının kullandığı web uygulaması platformunu ve veritabanı platformunu destekler. Her iki platform da mevcut şirket içi yapılandırmaları yansıtır, bu nedenle en az değişiklik gereklidir.
Ağ güvenliği. Ağ düzeyinde gelen ve giden trafiği denetlemek için Azure Güvenlik Duvarı kullanın. RDP/SSH bağlantı noktalarını göstermeden gelişmiş güvenlikle sanal makinelere bağlanmak için azure bastion kullanın. Relecloud, 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 gelişmiş güvenlik dağıtımları için Azure Bastion'a ihtiyaç duyulu.
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 Cache-Aside düzeniyle güncelleştirmeniz gerekir.
Şekil 3. Tasarım desenlerinin rolleri.
Her tasarım deseni, Well-Architected Framework'ün bir veya daha fazla yapı taşıyla 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.
Cache-Aside deseni. Cache-Aside deseni, isteğe bağlı verileri bir veri deposundan önbelleğe yükler. 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 | ✔ | YENIDEN 07 | ||||
Devre Kesici deseni | ✔ | ✔ |
RE:03 YENIDEN 07 PE:07 PE:11 |
|||
Cache-Aside desen | ✔ | ✔ |
YENIDEN 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, yeniden denemeler arasındaki gecikmeyi ve başarısızlığı kaldırmadan önce yapılması gereken girişimlerin sayısını yapılandırmanıza olanak tanır.
Yerleşik yeniden deneme mekanizmalarını kullanın. Uygulamanızı hızlandırmak için azure hizmetlerinin çoğunun sağladığı yerleşik yeniden deneme mekanizmasını kullanın. Örneğin başvuru uygulaması, SQL Veritabanı'na isteklerde Yeniden Deneme desenini uygulamak için Entity Framework Core bağlantı dayanıklılığını kullanır:
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ı sağlar. Örneğin, başvuru uygulaması, kodIConcertSearchService
nesnesini çağıran bir nesne oluşturduğunuzda Yeniden Deneme düzenini zorlamak için Polly kullanır: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ı önlemeye yardımcı olur, 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 HandleTransientHttpError
mantığını kullanır ancak belirtilen süre boyunca toplam hata sayısını sınırlar:
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ı 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 deposu üzerindeki yükü azaltır ve bu da 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ış bir Redis önbelleği kullanmalıdır. Bu önbellek, veritabanı sorgularını azaltarak performansı artırır. Ayrıca, yük dengeleyicinin trafiği eşit bir şekilde dağıtabilmesi için yapışkan olmayan oturumları etkinleştirir. Başvuru uygulaması dağıtılmış bir Redis önbelleği kullanır.
AddAzureCacheForRedis
yöntemi uygulamayı Redis için Azure Cache kullanacak şekilde yapılandırır: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. Verimliliğini artırmak için yüksek gereksinimli 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, Cache-Aside desenini 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.
GetUpcomingConcertsAsync
yöntemi VERILERI SQL Veritabanından Redis önbelleğine çeker ve önbelleği en son konser verileriyle doldurur: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ını kullanın ve kullanıcının en uygun yenileme hızını belirlemesi gerekir. 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 önbellek anahtarını temizlemek için
CreateConcertAsync
yöntemini kullanır: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. Başvuru uygulaması, önbellekteki verileri tutarlı tutmak için
UpdateConcertAsync
yöntemini kullanır: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 uygulamaya ilişkin yönergeler 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 |
|||
Ortamları haklarına ayırma | ✔ |
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, tek bir Microsoft Entra dizini, farklı kuruluşlardan birden çok Microsoft Entra dizini ve Microsoft kimlikleri veya sosyal hesapları kullanan uygulamaları destekler.
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 kimlikleri olduğundan emin olmanıza yardımcı olur.
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 yazarken veya hiç kod yazmadan kullanıcılara 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 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. Yetkisiz erişim ve ihlallere karşı koruma sağlamak için geçici izinleri kullanın. Örneğin, erişimi belirli bir süreyle sınırlamak için paylaşılan erişim imzaları (SAS) kullanabilirsiniz. Geçici erişim verdiğinizde güvenliği en üst düzeye çıkarmak için kullanıcı temsilcisi SAS'sini 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, kimliklerin erişebileceği Azure kaynaklarını, bu kaynaklarla neler yapabileceklerini ve erişimleri olan alanları tanımlar.
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şim kullandığınızda, kullanıcı kimlikleri ayrıcalıklı görevleri gerçekleştirmek için geçici izinler alır.
Yönetilen kimlikleri kullanma
Bunları destekleyen tüm Azure hizmetleri için yönetilen kimlikleri kullanın. Yönetilen kimlik, Azure kaynaklarının (iş yükü kimlikleri) kimlik bilgilerini yönetmenize gerek kalmadan diğer Azure hizmetlerinde kimlik doğrulaması yapmasına ve bunlarla etkileşim kurmasına olanak tanır. Geçişi basitleştirmek için karma ve eski sistemler için şirket içi kimlik doğrulama çözümlerini kullanmaya devam edebilirsiniz, ancak bunları en kısa sürede yönetilen kimliklere geçirmeniz gerekir. 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 yaklaşım, 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. Azure RBAC kullanarak yalnızca veritabanlarındaki CRUD eylemleri veya gizli dizilere erişme gibi işlemler için kritik olan izinleri verin. İş 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 diziler için güvenlik sağlayın. 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.
Başvuru uygulaması, App Service'in yönetilen kimlik kullanarak SQL veritabanı Authentication
bağlanabilmesi için SQL veritabanı bağlantı dizesindeki bağımsız değişkenini kullanır: 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 DefaultAzureCredential
kullanır:
builder.Configuration.AddAzureAppConfiguration(options =>
{
options
.Connect(new Uri(builder.Configuration["Api:AppConfig:Uri"]), new DefaultAzureCredential())
.ConfigureKeyVault(kv =>
{
// Some of the values coming from App Configuration
// are stored in Key Vault. Use the managed identity
// of this host for the authentication.
kv.SetCredential(new DefaultAzureCredential());
});
});
Ortamları haklarına ayırma
Her ortamın gereksinimlerini aşmadan karşılayan Azure hizmetlerinin performans katmanlarını (SKU) kullanın. Ortamlarınızı hak etmek 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.
Üretim ortamlarını maliyet iyileştirme. Ü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.
Üretim öncesi ortamları maliyet iyileştirme.Ön Üretim ortamları daha düşük maliyetli kaynaklar kullanmalı ve Azure Geliştirme/Test fiyatlandırmasıgibi indirimlerden yararlanmalıdır. Bu ortamlarda, gerekli olmayan hizmetleri devre dışı bırakmanız gerekir. Aynı zamanda, ön üretim ortamlarının risklerden kaçınmak için üretim ortamlarına yeterince benzediğinden emin olun. Bu dengenin korunması, gereksiz maliyetlere neden olmadan testin etkili kalmasını sağlar.
SKU'ları tanımlamak için kod olarak altyapıyı (IaC) kullanı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ğlamaya yardımcı olur. 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ını kullanı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şılabilmesi için ö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ını kullanarak altyapısını kod olarak dağıtın. Azure, her Azure kaynağı için önceden oluşturulmuş Bicep, ARM (JSON) ve Terraform şablonları sağlar.
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. Azure DevOps ile çalışıyorsanız Azure Pipelines'ı kullanın. GitHub projeleri için GitHub Actions'i 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çeveleri benimseyin. Dış uç noktaları içeren testler için sahte çerçeveler kullanın. Bu çerçeveler sanal uç noktalar oluşturmanıza olanak tanır. 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ın hem GitHub hem de Azure DevOps ile tümleştirilmesi kolaydır.
İ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. İstek aktarım hızı, ortalama istek süresi, hatalar ve bağımlılık izleme gibi uygulama telemetritoplamak için Azure Application Insights'ta otomatik kullanın. Bu telemetriyi kullanmak için kod değişikliği yapmanız gerekmez.
Başvuru uygulaması,
AddApplicationInsightsTelemetry
etkinleştirmek için NuGet paketiMicrosoft.ApplicationInsights.AspNetCore
kullanır: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 veconcertId
vecount
içeren bir sözlük belirtir: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. Tanılamaları, bağıntı için uygulama günlükleriyle aynı hedefe 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 uygulayın.
- 99,9%SLO elde edin.
- DevOps uygulamalarını benimseme.
- Maliyet için iyileştirilmiş ortamlar oluşturun.
- Güvenilirliği ve güvenliği geliştirin.
Relecloud, şirket içi altyapılarının bu hedeflere ulaşmak için uygun maliyetli bir çözüm olmadığını belirledi. 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 4. Başvuru uygulamasının mimarisi. Bu mimarinin bir Visio dosyası indirin.