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

Uygulama Yapılandırması .NET Core istemci kitaplığı, bir uygulamanın yeniden başlatılmasına neden olmadan isteğe bağlı yapılandırmayı güncelleştirmeyi destekler. Bir uygulama, aşağıdaki iki yaklaşımdan birini veya ikisini birden kullanarak Uygulama Yapılandırması'nın değişikliklerini algılayan şekilde yalıtabilirsiniz.

  1. Yoklama Modeli: Yapılandırmada yapılan değişiklikleri algılamak için yoklama kullanan varsayılan davranıştır. Bir ayarın önbelleğe alınan değerinin süresi dolsa, sonraki çağrısı yapılandırmanın değişp değişmediğini kontrol etmek için sunucuya bir istek gönderir ve gerekirse güncelleştirilmiş TryRefreshAsync RefreshAsync yapılandırmayı çeker.

  2. Anında Uygulama Modeli: Bu, yapılandırmada yapılan değişiklikleri algılamak için Uygulama Yapılandırması olaylarını kullanır. Uygulama Yapılandırması, anahtar değeri değişiklik olaylarını Azure Event Grid için ayar Azure Event Grid, 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 web kancası, Azure işlevi veya Event Grid gibi desteklenen olay işleyicilerinden birini kullanarak abone Service Bus.

Uygulamalar bu olaylara doğrudan Event Grid veya bir web kancası aracılığıyla ya da olayları Azure Service Bus. Azure Service Bus SDK'sı, HTTP uç noktası olan veya olay kılavuzunda sürekli değişiklik yoklama yapmak isteyen uygulamalar için bu işlemi basitleştiren bir ileti işleyicisi kaydetmek için bir API sağlar.

Bu öğreticide, anında yenileme kullanarak kodunuzda dinamik yapılandırma güncelleştirmelerini nasıl uygulayabilirsiniz? Hızlı başlangıçlarda tanıtan uygulamanın üzerine inşa edildi. Devam etmek için önce Uygulama Yapılandırması ile .NET Core uygulaması oluşturma adımlarını bitirin.

Bu öğreticide yer alan adımları yapmak için herhangi bir kod düzenleyicisini kullanabilirsiniz. Visual Studio Code, macOS ve Linux platformlarında Windows mükemmel bir seçenektir.

Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:

  • Uygulama Yapılandırması'nın yapılandırma değişikliği olaylarını bir konu başlığına göndermek için Service Bus ayarlama
  • Uygulama Yapılandırması'daki değişikliklere yanıt olarak yapılandırmasını güncelleştirmek için .NET Core uygulamanızı ayarlayın.
  • Uygulamanıza en son yapılandırmayı kullanın.

Önkoşullar

Bu öğreticiyi yapmak için .NET Core SDK.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Azure Service Bus ve aboneliği ayarlama

Bu öğreticide, Service Bus yoklama Event Grid sürekli olarak yoklama yapmak isteyen uygulamalar için yapılandırma değişikliklerinin algılanması basitleştirmek üzere Service Bus için Event Grid tümleştirmesi kullanılır. Azure Service Bus SDK'sı, Uygulama Yapılandırmasında değişiklikler algılandığında yapılandırmayı güncelleştirmek için kullanılan bir ileti işleyicisi kaydetmek için bir API sağlar. Hızlı Başlangıç: Service Bus ad alanı, Azure portal ve abonelik oluşturmak üzere Service Bus konu başlığı ve aboneliği oluşturmak için Service Bus adımlarını kullanın.

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şleyicisini kaydetmek için kullanılır.

Anahtar Değer
ServiceBusConnectionString Service Bus ad alanı için bağlantı dizesi
ServiceBusTopic Konu başlığı Service Bus adı
ServiceBusSubscription Service Bus aboneliğinin adı

Olay aboneliğini ayarlama

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

    Uygulama Yapılandırma Olayları

  2. ve için bir Event Subscription ad System Topic girin.

    Olay aboneliği oluşturma

  3. olarak Endpoint Type öğesini Service Bus Topic seçin, Service Bus seçin ve üzerine Confirm Selection tıklayın.

    Olay aboneliği hizmet veri verisi uç noktası

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

  5. Aboneliğin Event Subscriptions Events başarıyla oluşturulanı doğrulamak için bölmede üzerine tıklayın.

    Uygulama Yapılandırması olay abonelikleri

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, abonelik filtrelerini veya Event Grid filtrelerini kullanarak Service Bus ya da yalıtabilirsiniz. Örneğin, abonelik filtresi yalnızca belirli bir dizeyle başlayan anahtar değişiklikleri için olaylara abone olmak için kullanılabilir.

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

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

using Microsoft.Azure.ServiceBus;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureAppConfiguration;
using System;
using System.Diagnostics;
using System.Text;
using System.Text.Json;
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")
                            .SetCacheExpiration(TimeSpan.FromDays(30))  // Important: Reduce poll frequency
                    );

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

            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 void RegisterRefreshEventHandler()
        {
            string serviceBusConnectionString = Environment.GetEnvironmentVariable(ServiceBusConnectionStringEnvVarName);
            string serviceBusTopic = Environment.GetEnvironmentVariable(ServiceBusTopicEnvVarName);
            string serviceBusSubscription = Environment.GetEnvironmentVariable(ServiceBusSubscriptionEnvVarName);
            SubscriptionClient serviceBusClient = new SubscriptionClient(serviceBusConnectionString, serviceBusTopic, serviceBusSubscription);

            serviceBusClient.RegisterMessageHandler(
                handler: (message, cancellationToken) =>
               {
                   string messageText = Encoding.UTF8.GetString(message.Body);
                   JsonElement messageData = JsonDocument.Parse(messageText).RootElement.GetProperty("data");
                   string key = messageData.GetProperty("key").GetString();
                   Console.WriteLine($"Event received for Key = {key}");

                   _refresher.SetDirty();
                   return Task.CompletedTask;
               },
                exceptionReceivedHandler: (exceptionargs) =>
                {
                    Console.WriteLine($"{exceptionargs.Exception}");
                    return Task.CompletedTask;
                });
        }
    }
}

SetDirty yöntemi, yenileme için kaydedilen anahtar-değerler için önbelleğe alınmış değeri kirli olarak ayarlamak için kullanılır. Bu, bir sonraki çağrının Önbelleğe alınmış değerleri Uygulama Yapılandırması ile yeniden doğrulamasını ve gerekirse RefreshAsync TryRefreshAsync bunları güncelleştirmesini sağlar.

Birden çok örneğin aynı anda yenilenmesi durumunda olası azaltmayı azaltmak için önbelleğe alınan değer kirli olarak işaretlenmeden önce rastgele bir gecikme eklenir. Önbelleğe alınan değer kirli olarak işaretlenirken varsayılan maksimum gecikme 30 saniyedir, ancak yöntemine isteğe bağlı bir parametre geçerek TimeSpan geçersiz SetDirty kılınabilir.

Not

Anında yenileme kullanırken Uygulama Yapılandırması'nın istek sayısını azaltmak için uygun bir parametre SetCacheExpiration(TimeSpan cacheExpiration) değeriyle çağrısı yapmak cacheExpiration önemlidir. Bu, çekme yenilemesi için önbellek süre sonu süresini kontrol eder ve Olay aboneliğinde veya olay aboneliğinde sorun olması durumunda güvenlik ağı Service Bus kullanılabilir. Önerilen değer: TimeSpan.FromDays(30) .

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

  1. AppConfigurationConnectionString adlı bir ortam değişkeni ayarlayın ve bunu Uygulama Yapılandırma mağazanıza erişim anahtarı olarak ayarlayın. Windows komut istemini kullanırsanız, değişikliğin etkili olmasına izin vermek için aşağıdaki komutu çalıştırın ve komut istemini yeniden başlatın:

     setx AppConfigurationConnectionString "connection-string-of-your-app-configuration-store"
    

    Aşağıdaki komutu Windows PowerShell aşağıdaki komutu çalıştırın:

     $Env:AppConfigurationConnectionString = "connection-string-of-your-app-configuration-store"
    

    macOS veya Linux kullanıyorsanız aşağıdaki komutu çalıştırın:

     export AppConfigurationConnectionString='connection-string-of-your-app-configuration-store'
    
  2. Konsol uygulamasını derlemek için aşağıdaki komutu çalıştırın:

     dotnet build
    
  3. Derleme başarıyla tamamlandıktan sonra uygulamayı yerel olarak çalıştırmak için aşağıdaki komutu ç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ırma mağazası ö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 Uygulama Yapılandırması Verileri - Güncelleştirildi
  6. Olayın işlenmesine ve yapılandırmanın güncelleştirilsine izin vermek için 30 saniye bekleyin.

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

Kaynakları temizleme

Bu makalede oluşturulan kaynakları kullanmaya devam etmek istemiyorsanız, ücretlendirmemek 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 makaleye ait kaynakları tutmak istediğiniz diğer kaynakları içeren bir kaynak grubu içinde oluşturduysanız, kaynak grubunu silmek yerine her kaynağı ilgili bölmeden ayrı ayrı silin.

  1. Azure Portaloturum açın ve kaynak grupları' nı seçin.
  2. Ada göre filtrele kutusuna kaynak grubunuzun adını girin.
  3. Sonuç listesinde, bir genel bakışı görmek için 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, .NET Core uygulamanıza Uygulama Yapılandırması'nın yapılandırma ayarlarını dinamik olarak yenilemesini sağladınız. Uygulama Yapılandırmasına erişimi basit hale getirmek için Azure yönetilen kimliğini kullanmayı öğrenmek için sonraki öğreticiye devam edin.