Aracılığıyla paylaş


Öğretici: .NET uygulamasında anında iletme yenileme kullanarak dinamik yapılandırma kullanma

Uygulama Yapılandırması .NET istemci kitaplığı, bir uygulamanın yeniden başlatılmasına neden olmadan yapılandırmanın isteğe bağlı olarak güncelleştirilmesini destekler. Bir uygulama, aşağıdaki iki yaklaşımdan biri veya her ikisi kullanılarak Uygulama Yapılandırması değişiklikleri algılamak için yapılandırılabilir.

  1. Yoklama Modeli: Bu, yapılandırmadaki değişiklikleri algılamak için yoklama kullanan varsayılan davranıştır. Bir ayarın önbelleğe alınmış değeri sona erdikten sonra, sonraki çağrısı TryRefreshAsync veya RefreshAsync sunucuya yapılandırmanın değişip değişmediğini denetlemek için bir istek gönderir ve gerekirse güncelleştirilmiş yapılandırmayı çeker.

  2. Gönderme Modeli: Bu, yapılandırmadaki değişiklikleri algılamak için Uygulama Yapılandırması olayları kullanır. Uygulama Yapılandırması, anahtar değer değişikliği olaylarını Azure Event Grid'e gönderecek şekilde ayarlandıktan sonra, uygulama yapılandırmayı güncel tutmak için gereken toplam istek sayısını iyileştirmek için bu olayları kullanabilir. Uygulamalar bunlara doğrudan Event Grid'den veya web kancası, Azure işlevi veya Service Bus konusu gibi desteklenen olay işleyicilerinden biri aracılığıyla abone olmayı seçebilir.

Bu öğreticide, anında yenilemeyi kullanarak kodunuzda dinamik yapılandırma güncelleştirmelerini nasıl uygulayabileceğiniz gösterilmektedir. Öğreticide tanıtılan uygulama üzerinde derler. Devam etmeden önce Öğretici: Önce bir .NET uygulamasında dinamik yapılandırmayı kullanma işlemini tamamlayın.

Bu öğreticideki adımları gerçekleştirmek için herhangi bir kod düzenleyicisini kullanabilirsiniz. Visual Studio Code , Windows, macOS ve Linux platformlarında kullanılabilen mükemmel bir seçenektir.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Yapılandırma değişikliği olaylarını Uygulama Yapılandırması Service Bus konusuna göndermek için bir abonelik ayarlama
  • .NET uygulamanızı Uygulama Yapılandırması'daki değişikliklere yanıt olarak yapılandırmasını güncelleştirecek şekilde ayarlayın.
  • Uygulamanızda en son yapılandırmayı kullanma.

Önkoşullar

Azure Service Bus konusunu ve aboneliğini ayarlama

Bu öğreticide, sürekli olarak değişiklikler için Uygulama Yapılandırması yoklama yapmak istemeyen uygulamaların yapılandırma değişikliklerini algılamayı basitleştirmek amacıyla Event Grid için Service Bus tümleştirmesi gerçekleştirilir. Azure Service Bus SDK'sı, Uygulama Yapılandırması'de değişiklikler algılandığında yapılandırmayı güncelleştirmek için kullanılabilecek bir ileti işleyicisi kaydetmek için bir API sağlar. Hızlı Başlangıç: Service Bus konu başlığı ve aboneliği oluşturmak için Azure portalını kullanarak service bus ad alanı, konu ve abonelik oluşturma adımlarını izleyin.

Kaynaklar oluşturulduktan sonra aşağıdaki ortam değişkenlerini ekleyin. Bunlar, uygulama kodundaki yapılandırma değişiklikleri için bir olay işleyicisi kaydetmek için kullanılır.

Anahtar Değer
ServiceBus Bağlan ionString Service Bus ad alanı için Bağlan ion dizesi
ServiceBusTopic Service Bus konusunun adı
ServiceBusSubscription Service Bus aboneliğinin adı

Olay aboneliğini ayarlama

  1. Azure portalında Uygulama Yapılandırması kaynağını açın ve bölmede Events öğesine tıklayın+ Event Subscription.

    olayları Uygulama Yapılandırması

  2. ve System Topiciçin Event Subscription bir ad girin.

    Olay aboneliği oluşturma

  3. olarak Service Bus Topicöğesini Endpoint Type seçin, Service Bus konusunu seçin ve ardından öğesine Confirm Selectiontıklayın.

    Olay aboneliği hizmet veri yolu uç noktası

  4. Create Olay aboneliğini oluşturmak için öğesine tıklayın.

  5. Event Subscriptions Aboneliğin Events başarıyla oluşturulduğunu doğrulamak için bölmeye tıklayın.

    olay aboneliklerini Uygulama Yapılandırması

Not

Yapılandırma değişikliklerine abone olurken, uygulamanıza gönderilen olay sayısını azaltmak için bir veya daha fazla filtre kullanılabilir. Bunlar Event Grid abonelik filtreleri veya Service Bus abonelik filtreleri olarak yapılandırılabilir. Örneğin, abonelik filtresi yalnızca belirli bir dizeyle başlayan bir anahtardaki değişiklikler için olaylara abone olmak için kullanılabilir.

verileri Uygulama Yapılandırması yeniden yüklemek için olay işleyicisini kaydetme

Program.cs açın ve dosyayı aşağıdaki kodla güncelleştirin.

using Azure.Messaging.EventGrid;
using Azure.Messaging.ServiceBus;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureAppConfiguration;
using Microsoft.Extensions.Configuration.AzureAppConfiguration.Extensions;
using System;
using System.Threading.Tasks;

namespace TestConsole
{
    class Program
    {
        private const string AppConfigurationConnectionStringEnvVarName = "AppConfigurationConnectionString";
        // e.g. Endpoint=https://{store_name}.azconfig.io;Id={id};Secret={secret}
        
        private const string ServiceBusConnectionStringEnvVarName = "ServiceBusConnectionString";
        // e.g. Endpoint=sb://{service_bus_name}.servicebus.windows.net/;SharedAccessKeyName={key_name};SharedAccessKey={key}
        
        private const string ServiceBusTopicEnvVarName = "ServiceBusTopic";
        private const string ServiceBusSubscriptionEnvVarName = "ServiceBusSubscription";

        private static IConfigurationRefresher _refresher = null;

        static async Task Main(string[] args)
        {
            string appConfigurationConnectionString = Environment.GetEnvironmentVariable(AppConfigurationConnectionStringEnvVarName);

            IConfiguration configuration = new ConfigurationBuilder()
                .AddAzureAppConfiguration(options =>
                {
                    options.Connect(appConfigurationConnectionString);
                    options.ConfigureRefresh(refresh =>
                        refresh
                            .Register("TestApp:Settings:Message")
                            // Important: Reduce poll frequency
                            .SetCacheExpiration(TimeSpan.FromDays(1))  
                    );

                    _refresher = options.GetRefresher();
                }).Build();

            await RegisterRefreshEventHandler();
            var message = configuration["TestApp:Settings:Message"];
            Console.WriteLine($"Initial value: {configuration["TestApp:Settings:Message"]}");

            while (true)
            {
                await _refresher.TryRefreshAsync();

                if (configuration["TestApp:Settings:Message"] != message)
                {
                    Console.WriteLine($"New value: {configuration["TestApp:Settings:Message"]}");
                    message = configuration["TestApp:Settings:Message"];
                }

                await Task.Delay(TimeSpan.FromSeconds(1));
            }
        }

        private static async Task RegisterRefreshEventHandler()
        {
            string serviceBusConnectionString = Environment.GetEnvironmentVariable(ServiceBusConnectionStringEnvVarName);
            string serviceBusTopic = Environment.GetEnvironmentVariable(ServiceBusTopicEnvVarName);
            string serviceBusSubscription = Environment.GetEnvironmentVariable(ServiceBusSubscriptionEnvVarName); 
            ServiceBusClient serviceBusClient = new ServiceBusClient(serviceBusConnectionString);
            ServiceBusProcessor serviceBusProcessor = serviceBusClient.CreateProcessor(serviceBusTopic, serviceBusSubscription);

            serviceBusProcessor.ProcessMessageAsync += (processMessageEventArgs) =>
            {
                // Build EventGridEvent from notification message
                EventGridEvent eventGridEvent = EventGridEvent.Parse(BinaryData.FromBytes(processMessageEventArgs.Message.Body));

                // Create PushNotification from eventGridEvent
                eventGridEvent.TryCreatePushNotification(out PushNotification pushNotification);

                // Prompt Configuration Refresh based on the PushNotification
                _refresher.ProcessPushNotification(pushNotification);

                return Task.CompletedTask;
            };

            serviceBusProcessor.ProcessErrorAsync += (exceptionargs) =>
            {
                Console.WriteLine($"{exceptionargs.Exception}");
                return Task.CompletedTask;
            };

            await serviceBusProcessor.StartProcessingAsync();
        }
    }
}

ProcessPushNotification yöntemi önbellek süre sonunu kısa bir rastgele gecikmeye sıfırlar. Bu, önbelleğe RefreshAsync TryRefreshAsync alınan değerlerin Uygulama Yapılandırması karşı yeniden doğrulanması ve gerektiğinde güncelleştirilmesi için gelecekteki çağrıların yapılmasına neden olur. Bu örnekte anahtardaki değişiklikleri izlemek için kaydolacaksınız: TestApp:Ayarlar:Önbellek süresi bir gün olan ileti. Bu, son denetimden sonraki bir gün geçmeden Uygulama Yapılandırması isteğinde bulunulmayacağı anlamına gelir. Uygulamanızı çağırarak ProcessPushNotification sonraki birkaç saniye içinde Uygulama Yapılandırması istekleri gönderir. Uygulamanız, güncelleştirmeleri sürekli yoklamanıza gerek kalmadan depoda App Configuration değişiklikler gerçekleştikten kısa süre sonra yeni yapılandırma değerlerini yükler. Uygulamanızın herhangi bir nedenle değişiklik bildirimini kaçırması durumunda, yapılandırma değişikliklerini günde bir kez denetlemeye devam eder.

Uygulamanızın veya mikro hizmetlerin gönderme modeliyle aynı Uygulama Yapılandırması deposuna bağlanan birçok örneğiniz varsa önbellek süre sonu için kısa rastgele gecikme yararlı olur. Bu gecikme olmadan, uygulamanızın tüm örnekleri değişiklik bildirimi alır almaz aynı anda Uygulama Yapılandırması deponuza istek gönderebilir. Bu, Uygulama Yapılandırması Hizmeti'nin mağazanızı kısıtlamasına neden olabilir. Önbellek süre sonu gecikmesi varsayılan olarak 0 ile en fazla 30 saniye arasında rastgele bir sayıya ayarlanır, ancak isteğe bağlı parametresi maxDelay aracılığıyla en yüksek değeri yöntemiyle ProcessPushNotification değiştirebilirsiniz.

yöntemi, ProcessPushNotification Uygulama Yapılandırması anında iletme bildirimini tetikleyen değişiklik hakkında bilgi içeren bir PushNotification nesne alır. Bu, aşağıdaki yapılandırma yenilemesinde tetikleyici olayına kadar olan tüm yapılandırma değişikliklerinin yüklendiğinden emin olunmasını sağlar. yöntemi anında SetDirty yapılandırma yenilemesinde anında iletme bildiriminin yüklenmesini tetikleyen değişikliği garanti etmez. Gönderme modeli için yöntemini kullanıyorsanız SetDirty , bunun yerine yöntemini kullanmanızı ProcessPushNotification öneririz.

Uygulamayı yerel olarak derleme ve çalıştırma

  1. AppConfiguration Bağlan ionString adlı bir ortam değişkeni ayarlayın ve bunu Uygulama Yapılandırması deponuzun erişim anahtarına ayarlayın.

    Windows komut istemini kullanarak uygulamayı yerel olarak derlemek ve çalıştırmak için aşağıdaki komutu çalıştırın ve değişikliğin etkili olması için komut istemini yeniden başlatın:

    setx AppConfigurationConnectionString "connection-string-of-your-app-configuration-store"
    
  2. Konsol uygulamasını oluşturmak için aşağıdaki komutu çalıştırın:

    dotnet build
    
  3. Derleme başarıyla tamamlandıktan sonra aşağıdaki komutu çalıştırarak uygulamayı yerel olarak çalıştırın:

    dotnet run
    

    Güncelleştirmeden önce anında yenileme çalıştırması

  4. Azure Portal’ında oturum açın. Tüm kaynaklar'ı seçin ve hızlı başlangıçta oluşturduğunuz Uygulama Yapılandırması mağaza örneğini seçin.

  5. Yapılandırma Gezgini'ni seçin ve aşağıdaki anahtarların değerlerini güncelleştirin:

    Anahtar Değer
    TestApp:Ayarlar:Message Azure Uygulaması Yapılandırmasından Veriler - Güncelleştirildi
  6. Olayın işlenmesine izin vermek için birkaç dakika bekleyin. Güncelleştirilmiş yapılandırmayı görürsünüz.

    Güncelleştirmeden sonra anında yenileme çalıştırması

Kaynakları temizleme

Bu makalede oluşturulan kaynakları kullanmaya devam etmek istemiyorsanız ücretlerden kaçınmak için burada oluşturduğunuz kaynak grubunu silin.

Önemli

Silinen kaynak grupları geri alınamaz. Kaynak grubu ve içindeki tüm kaynaklar kalıcı olarak silinir. Yanlış kaynak grubunu veya kaynakları yanlışlıkla silmediğinizden emin olun. Bu makalenin kaynaklarını, saklamak istediğiniz diğer kaynakları içeren bir kaynak grubu içinde oluşturduysanız, kaynak grubunu silmek yerine her kaynağı ilgili bölmeden tek tek silin.

  1. Azure portalında oturum açın ve Kaynak grupları'nı seçin.
  2. Ada göre filtrele kutusuna kaynak grubunuzun adını girin.
  3. Genel bir bakış görmek için sonuç listesinde kaynak grubu adını seçin.
  4. Kaynak grubunu sil'i seçin.
  5. Kaynak grubunun silinmesini onaylamanız istenir. Onaylamak için kaynak grubunuzun adını girin ve Sil'i seçin.

Birkaç dakika sonra kaynak grubu ve tüm kaynakları silinir.

Sonraki adımlar

Bu öğreticide yapılandırma ayarlarını Uygulama Yapılandırması dinamik olarak yenilemek için .NET uygulamanızı etkinleştirmişsiniz. Azure yönetilen kimliğini kullanarak Uygulama Yapılandırması erişimini kolaylaştırmayı öğrenmek için sonraki öğreticiye geçin.