配置中心 App Configuration (三):配置的動態更新

760a3e42abbbfa0583c561edb7649771.png

Get Azure key-value pairs from App configuration | Serverless360

寫在前面

我在前文:

《微軟Azure配置中心 App Configuration (一):輕松集成到Asp.Net Core》已經介紹了Asp.net Core怎么輕易的接入azure 配置中心App Configuration(下稱azure 配置中心);

《微軟Azure配置中心 App Configuration (二):Feature Flag 功能開關特性》 講Asp.net Core功能開關的兩種方式的簡單使用;

本文重點來講講Azure配置中心是怎么配置的動態更新的。

概念定義

一般對配置中心來說都有動態更新的概念,我這里給個定義:

配置中心的動態更新是指,當用戶在配置中心管理后臺更新配置后,集成的客戶端能以某種形式到配置的更新;

一般有兩種模式

  • 1、客戶端輪詢;

  • 2、服務端主動推送更新;包括但不限于Grpc(Nacos),Websocket等方式;

客戶端輪詢模式

本文在前文基礎上開始的,有些略過的地方請看前文;

1、修改集成方式

var?builder?=?WebApplication.CreateBuilder(args);
var?connectionString?=?builder.Configuration.GetConnectionString("AppConfig");builder.Host.ConfigureAppConfiguration((hostingContext,?config)?=>
{//配置不同功能config.AddAzureAppConfiguration(options?=>{啟用Label(多環境)支持//options.Connect(connectionString)//????.Select(KeyFilter.Any,?LabelFilter.Null)//配置過濾器,讀取空Lable的配置//????.Select(KeyFilter.Any,?hostingContext.HostingEnvironment.EnvironmentName);?//配置過濾器,只讀取某個環境的配置//啟用Poll模式的主動更新options.Connect(connectionString).Select(KeyFilter.Any,?LabelFilter.Null)//配置過濾器,讀取空Lable的配置.Select(KeyFilter.Any,?hostingContext.HostingEnvironment.EnvironmentName)?//配置過濾器,只讀取某個環境的配置.ConfigureRefresh(refresh?=>{refresh.Register("TestApp:Settings:Sentinel",?refreshAll:?true).SetCacheExpiration(new?TimeSpan(0,?0,?30));});});
});

這里方法ConfigureRefresh參數:

TestApp:Settings:Sentinel:這就是程序輪詢的配置Key;

refreshAll=true: 表示當輪詢的配置Key更新時,更新所有配置;

SetCacheExpiration:設置多久時間輪詢一次,這里設置了30秒,這也是默認值;

2、注入服務

builder.Services.AddAzureAppConfiguration();

3、驗證

我們現在Azure配置管理后臺設置好key:TestApp:Settings:Sentinel

06a1902c52c1afb262c300ca9c0578c4.png
1659710138480

可以看到初始值==1;

我們新增一個測試的TestKey4==TestKey4-azure9a90822b476bace9bee247c2bdaf5408.png

啟動程序后,我們無論怎么修改配置后臺,都不會程序拿到值始終:TestKey4 ==TestKey4-azure

我們把監控Key:TestApp:Settings:Sentinel設置為2

再次獲取可以看到,TestKey4 的值更新了:

591909dee5528f55a99722d1954b53af.png
1659710583034

OK,輪詢模式就是這么樸實無華,卻又足以滿足大部分需求;

服務端主動推送更新

流程簡介

除了輪詢的方式動態更新配置外,Azure配置中心也提供了push的方式主動推送配置更新到客戶端,不過它的實現流程不太像我們經常遇到的Grpc或者Websocket等那樣直連的方式,而是借助Azure消息隊列Service Bus實現的。

大體流程:

  1. 先創建一個Service Bus的Topic訂閱(類似于RabbitMQ的Topic);

  2. Azure配置中心注冊一個事件訂閱到Service Bus的Topic訂閱,當配置修改時觸發事件發送一個配置更新消息到Service Bus;

  3. 客戶端程序訂閱了Service Bus的Topic,實時接收配置更新消息并更新本地程序的IConfiguration;

下面我們看看流程怎么實現;

1、先創建Service Bus的Topic訂閱

創建Service Bus命名空間

e2a7ec0550034d27b715d07258ef9411.png
1659796317423

信息自己填

c1d9888158fc880553c2dd6864604dd6.png
1659796361277

創建Topic

我創建的topic名:config-topic

bdd8f9dee352b829e9a5cb0fc106c263.png
1659759474037

創建topic訂閱

訂閱名:config-s1

3698a19eb1ee8e46fe6dfa6deed5f815.png
1659759526382
de18fc74017008702cb2cb1879875955.png
1659759571039

ok,到這步位置,Service Bus這邊基本配置完;

2、創建配置中心的事件訂閱到topic訂閱

App Configuration下創建事件訂閱

填寫Topic訂閱信息

注意右側紅框,要選擇你上步創建的Service Bus 的Topic訂閱 config-topic

91c071433161e32cfe02c32e2e99cad1.png
1659760042342

創建成功

3bfe493018e53562fe82e46e04789d69.png
1659760088732

3、Asp.Net Core中集成

安裝包

install-package?Microsoft.Azure.ServiceBus

新增配置信息

//ServiceBus?的配置"AzureServiceBusConfig":?{"ConnectionString":?"<?ConnectionString?>","TopicName":?"<?Your?TopicName?>",?//我的是config-topic"SubscriptionName":?"<?Your?SubscriptionName?>"?//?我的是?config-s1}

修改ConfigureService做集成

var?builder?=?WebApplication.CreateBuilder(args);
var?connectionString?=?builder.Configuration.GetConnectionString("AppConfig");
IConfigurationRefresher?_refresher?=?null;builder.Host.ConfigureAppConfiguration((hostingContext,?config)?=>
{簡單使用只配置connection?string//config.AddAzureAppConfiguration(connectionString);//配置不同功能config.AddAzureAppConfiguration(options?=>{//啟用Push模式的主動推送更新配置options.Connect(connectionString).Select(KeyFilter.Any,?LabelFilter.Null)//配置過濾器,讀取空Lable的配置.Select(KeyFilter.Any,?hostingContext.HostingEnvironment.EnvironmentName)?//配置過濾器,只讀取某個環境的配置.ConfigureRefresh(refresh?=>{refresh.Register("TestApp:Settings:Sentinel",?refreshAll:?true).SetCacheExpiration(TimeSpan.FromDays(10));?//這個刷新頻率要設置特別低了});_refresher?=?options.GetRefresher();});
});

TestApp:Settings:Sentinel:只訂閱這個key的刷新事件;

SetCacheExpiration:這里的刷新頻率設置很低就行;

修改IApplicationBuilder集成

先寫個拓展方法

///?<summary>
///?啟用一個Service?bus事件處理程序在配置更新時刷新?IConfiguration
///?</summary>
///?<param?name="app">The?application.</param>
///?<param?name="refresher">The?refresher.</param>
///?<returns></returns>
///?<exception?cref="System.ArgumentNullException">serviceBusConfig</exception>
public?static?IApplicationBuilder?UseAzureConfigChangeEventHandler(this?IApplicationBuilder?app,?IConfigurationRefresher?refresher)
{var?serviceBusConfig?=?PassportConfig.Get<AzureServiceBusConfig>(nameof(AzureServiceBusConfig));if?(serviceBusConfig?==?null){throw?new?ArgumentNullException(nameof(serviceBusConfig));}SubscriptionClient?serviceBusClient?=?new?SubscriptionClient(serviceBusConfig.ConnectionString,?serviceBusConfig.TopicName,?serviceBusConfig.SubscriptionName);serviceBusClient.RegisterMessageHandler(handler:?(message,?cancellationToken)?=>{//?構建一個?EventGridEventEventGridEvent?eventGridEvent?=?EventGridEvent.Parse(BinaryData.FromBytes(message.Body));//?創建PushNotificationeventGridEvent.TryCreatePushNotification(out?PushNotification?pushNotification);//?刷新IConfigurationrefresher.ProcessPushNotification(pushNotification);refresher.TryRefreshAsync();return?Task.CompletedTask;},exceptionReceivedHandler:?(exceptionargs)?=>{Console.WriteLine($"{exceptionargs.Exception}");return?Task.CompletedTask;});return?app;
}

然后直接在管道中啟用

app.UseAzureConfigChangeEventHandler(_refresher);

這個函數的功能是,訂閱Service Bus的Topic ,當服務端配置修改時,接收配置更新信息,刷新本地配置;

驗證

還是用TestKey4來測試,先運行程序,

本來:TestKey4==TestKey4-azure,我們改成:TestKey4==TestKey4-azure 2022年8月6日

ba6603f706b81725c326b204c04ee51e.png
1659762724065

但怎么刷新程序獲取的值都不會更新。

我們打個斷點到函數:UseAzureConfigChangeEventHandler(),再更新Key ?TestApp:Settings:Sentinel

看到,收到配置更新消息命中斷點了:

1fca6f348398a16616bd1387981414e1.png
1659797999344

同時,通過Service Bus的后臺,我們也已看到配置更新事件消息正確發送:

9e609bfb3f3758b41a2bf3ac3cc5645d.png
1659798843360

我們再次獲取配置看到確已更新:

a7bccca43ad2124485240d702245475a.png
1659762786635

OK,服務端基于訂閱消息隊列獲取配置的主動更新方式驗證成功;

總結

1、我覺得動態更新配置用主動輪詢的方式基本能滿足大部分需求(但是每次輪詢消耗次數,請設置好輪詢間隔時間),基于消息隊列的主動推送方式稍微有點麻煩,看需求選用;

2、當配置中心的Key和本地配置文件的Key沖突時,以配置中心為準;

3、總體來說Azure配置中心還是挺香的,除了貴(畢竟Azure 土豪云),價格:https://azure.microsoft.com/en-us/pricing/details/app-configuration/。

Azure配置中心的基本學習到這里告一段落,后面挖掘到更實用的功能/技巧將再次水文補充;

源碼

https://github.com/gebiWangshushu/Hei.Azure.Test

[參考]

https://docs.microsoft.com/en-us/azure/azure-app-configuration/overview

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283731.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283731.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283731.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

萬字總結 JS 數據結構與常用的算法

前言 首先&#xff0c;為什么我會學習數據結構與算法呢&#xff0c;其實主要是有兩方面 第一&#xff0c;是我在今年的flag里明確說到我會學這個東西第二&#xff0c;學了這些&#xff0c;對自己以后在工作或者面試也會帶來許多好處然后&#xff0c;本文是最近學習的一個總結文…

精通Java設計模式從初見到相愛之工廠+策略模式(3)

為什么80%的碼農都做不了架構師&#xff1f;>>> 1、公司項目需求。 用戶簽到活動&#xff0c;會員簽到怎么處理&#xff0c;超級會員怎么處理&#xff0c;普通用戶簽到怎么處理&#xff0c;針對不同的檔次&#xff0c;有不同的方案&#xff0c;所以在項目中用到了策…

jquery weui 中alert彈出框在ios中跳動問題

問題描述&#xff1a; jquery-weui中的彈出框在ios上會有一個右下角向中間滑動的效果&#xff0c;在Android上沒有這個效果。 解決方法&#xff1a; 修該jquery-weui.js中的openModal方法如下圖: 轉載于:https://www.cnblogs.com/xianZJ/p/6773097.html

WPF效果第一百九十五篇之又玩ListBox

ListBox一直是我的最愛;今天再次基于他玩耍一下不一樣的效果;閑話不多扯直接看效果:1、這次直接用的ItemContainerStyle:2、通過HitTest實現點選邊框&#xff1a;Point point e.GetPosition(LightDarkListBox); VisualTreeHelper.HitTest(LightDarkListBox, new HitTestFilter…

Web3,互聯網新造神“機器”?

本文來自微信公眾號&#xff1a;每經頭條 &#xff08;ID&#xff1a;nbdtoutiao&#xff09;&#xff0c;作者&#xff1a;李蕾&#xff0c;編輯&#xff1a;肖芮冬&#xff0c;頭圖來自&#xff1a;視覺中國 “與目前的互聯網相比&#xff0c;Web3基于區塊鏈等底層技術&#…

Gradle實戰:發布aar包到maven倉庫

查看原文&#xff1a;http://blog.csdn.net/u0108184... Gradle實戰系列文章&#xff1a;《Gradle基本知識點與常用配置》《Gradle實戰&#xff1a;Android多渠道打包方案匯總》《Gradle實戰&#xff1a;不同編譯類型的包同設備共存》《Gradle實戰&#xff1a;執行sql操作hive…

synchronized與Lock的區別

類別synchronizedLock存在層次Java的關鍵字&#xff0c;在jvm層面上是一個類鎖的釋放1、以獲取鎖的線程執行完同步代碼&#xff0c;釋放鎖 2、線程執行發生異常&#xff0c;jvm會讓線程釋放鎖在finally中必須釋放鎖&#xff0c;不然容易造成線程死鎖鎖的獲取假設A線程獲得鎖&am…

even兼容

var eventarguments.callee.caller.arguments[0]||window.event;//消除瀏覽器差異 var ewindow.event||event; //消除瀏覽器差異 轉載于:https://www.cnblogs.com/webqiand/articles/11250768.html

普通中年人的真實出路

閱讀本文大概需要6分鐘。互聯網人甚至中國整體的用工市場的確有中年淘汰的問題&#xff0c;我們可以當它不存在&#xff0c;甚至當有人給出解法的時候&#xff0c;我們也可以認為他們在傳播焦慮&#xff0c;但事實就是事實&#xff0c;它的存在不隨個人意愿而轉移。最近抖音上有…

項目管理常見的問題

綜合管理 缺乏企業級的項目管理平臺;項目目標不清楚;項目經理不了解項目管理流程和工具;項目模板不統一;計劃意識薄弱&#xff0c;缺乏規范的分解。難以過程監控&#xff0c;實時地了解項目進度,靠手工統計和匯報項目進度&#xff0c;難以真實反映進度。項目控制不力&#xff0…

常用小提示

阿里云Linux安裝軟件鏡像源 第一步&#xff1a;備份你的原鏡像文件&#xff0c;以免出錯后可以恢復。 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup第二步&#xff1a;下載新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc…

抽象工廠模式(Absraact Factory)介紹與實現

創建一個IProduct,后面模擬業務時要用到 package com.xiawei.factory; public class IProduct { private String productNo "";} package com.xiawei.factory;/** * 規范工廠接口 </p> *///創建一個所有工廠的規范接口,后面所有的工廠類都要來實現這個接口,并…

【溫故知新】C# Linq中 Select SelectMany 使用技巧

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 后臺回復 源碼 即可;如果覺得對你有幫助&#xff0c;歡迎關注C# Linq中 Select && SelectMany 使用技巧Select 和 SelectMany 是我們開發中對集合常用的兩個擴展方法&#x…

bzoj4870

http://www.lydsy.com/JudgeOnline/problem.php?id4870 矩陣快速冪。。。 人話題意&#xff1a;從nk個物品里選模k余r個物品&#xff0c;問方案數模P 那么我們有方程 f[i][j]f[i-1][j]f[i-1][j-1] 跟組合數一個樣子 j∈(0,k) 這個物品選還是不選加起來 構造矩陣&#xff1a;x.…

15000 字的 SQL 語句大全,值得收藏!

基礎 1、說明&#xff1a;創建數據庫 CREATE DATABASE database-name 2、說明&#xff1a;刪除數據庫 drop database dbname 3、說明&#xff1a;備份sql server --- 創建 備份數據的 device USE master EXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat -…

Codeforces Round #410 (Div. 2) D. Mike and distribution 思維+數學

鏈接&#xff1a; http://codeforces.com/contest/798/problem/D 題意&#xff1a; 給你兩個長度為n的數列a和b&#xff0c;讓你選n/21個下標&#xff0c;使得2*∑ai>suma,2*∑bi>sumb 題解1&#xff1a; 用一個叫random_shuffle的東西&#xff0c;每次都亂選&#xff0c…

PerfView專題 (第三篇):如何尋找 C# 中的 VirtualAlloc 內存泄漏

一&#xff1a;背景 上一篇我們聊到了如何用 PerfView 去偵察 NTHeap 的內存泄漏&#xff0c;這種內存泄漏往往是用 C 的 malloc 或者 C 的 new 分配而不釋放所造成的&#xff0c;這一篇我們來聊一下由 VirtualAlloc 方法造成的泄漏如何去甄別&#xff1f;了解 VirtualAlloc 的…

[APP]- 找回Xcode7的代碼折疊功能

為什么80%的碼農都做不了架構師&#xff1f;>>> 原 找回Xcode7的代碼折疊功能 升級到Xcode7后&#xff0c;會發現代碼折疊功能不見了&#xff0c;這是怎么回事&#xff1f; 其實這個功能還在的&#xff0c;只是蘋果默認把這個功能禁掉了&#xff1a;在Xcode菜單里選…

有哪些值得推薦的.NET ORM框架?

前言&#xff1a; 最近有很多同學問我.NET方面有哪些好用的ORM框架&#xff0c;我覺得這方面的介紹網上應該會介紹的比較全面文章&#xff0c;于是我想搜一篇全面的介紹文章發給他們結果我發現網上說來說去基本上就是那幾個&#xff0c;于是就有了這篇文章。 什么是ORM? ORM 是…

從S3中導入數據到Dynamodb

本節如果你已經從Dynamodb中導出過數據&#xff0c;而且導出的文件以及被存入S3。文件內部結構會在Verify Data Export File 中描寫敘述。我們稱之前導出數據的原始表為source table&#xff0c;數據將要被導入的表為destination table。你能夠將S3中的導出文件導入到dynamodb的…