配置中心 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.mzph.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基于区块链等底层技术&#…

普通中年人的真实出路

阅读本文大概需要6分钟。互联网人甚至中国整体的用工市场的确有中年淘汰的问题&#xff0c;我们可以当它不存在&#xff0c;甚至当有人给出解法的时候&#xff0c;我们也可以认为他们在传播焦虑&#xff0c;但事实就是事实&#xff0c;它的存在不随个人意愿而转移。最近抖音上有…

项目管理常见的问题

综合管理 缺乏企业级的项目管理平台;项目目标不清楚;项目经理不了解项目管理流程和工具;项目模板不统一;计划意识薄弱&#xff0c;缺乏规范的分解。难以过程监控&#xff0c;实时地了解项目进度,靠手工统计和汇报项目进度&#xff0c;难以真实反映进度。项目控制不力&#xff0…

【温故知新】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.…

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菜单里选…

HTML5程序开发范例宝典 完整版 (韩旭等著) 中文pdf扫描版

HTML5程序开发范例宝典紧密围绕编程者在编程中遇到的实际问题和开发中应该掌握的技术&#xff0c;全面介绍了利用HTML进行程序开发的各方面技术和技巧。全书共16章&#xff0c;内容包括HTML网页布局、HTML基本元素、HTML高级元素、表单的使用、列表的使用、超链接、表格应用、图…

ASP.NET Core 6框架揭秘实例演示[11]:诊断跟踪的几种基本编程方式

在整个软件开发维护生命周期内&#xff0c;最难的不是如何将软件系统开发出来&#xff0c;而是在系统上线之后及时解决遇到的问题。一个好的程序员能够在系统出现问题之后马上定位错误的根源并找到正确的解决方案&#xff0c;一个更好的程序员能够根据当前的运行状态预知未来可…

Autofac详解

Autofac详解 零、文章目录 一、Autofac详解 1、概述 Autofac是第三方IOC容器&#xff0c;是当前最流行的IOC容器。功能强大&#xff0c;比asp.netcore内置容器强大得多&#xff0c;支持属性注入和方法注入&#xff0c;支持AOP。官网地址&#xff1a;http://autofac.org/源码下载…

与ObjectDataSource共舞

4&#xff0c;ORM组件XCode&#xff08;与ObjectDataSource共舞&#xff09; XCode为了能更方便的解决大部分问题&#xff0c;不得不“屈身”于ObjectDataSource。 先上一个经典例子&#xff08;ObjectDataSourceGridView&#xff09;&#xff08;ObjectDataSource&#xff0…

ASP.NET Core 3.1中使用JWT身份认证

文章目录 0、引言1、关于Authentication与Authorization2、整个认证流程是怎样的&#xff1f;3、开始JWT身份认证 3.1 安装JwtBearer包3.2 安装Swashbuckle.AspNetCore包3.3 添加身份认证相关服务到容器中3.4 添加Swagger服务到容器中3.5 将身份认证加入到管道中3.6 将swagger加…

《ASP.NET Core 6框架揭秘》实例演示[10]:Options基本编程模式

依赖注入使我们可以将依赖的功能定义成服务&#xff0c;最终以一种松耦合的形式注入消费该功能的组件或者服务中。除了可以采用依赖注入的形式消费承载某种功能的服务&#xff0c;还可以采用相同的方式消费承载配置数据的Options对象&#xff0c;这篇文章演示几种典型的编程模式…

实现仿简书选取内容生成分享图片效果

前几天脑子里忽然闪过简书的图片分享效果&#xff0c;感觉很简洁也很漂亮&#xff0c;想着能不能用自己方式实现一下呢&#xff0c;于是今天就有了这篇文章。好了&#xff0c;先看下效果图吧&#xff1a; 项目地址: https://github.com/zhangke301... 欢迎star、issues~ 实现这…

千万级可观测数据采集器--iLogtail代码完整开源

2022年6月29日&#xff0c;阿里云iLogtail开源后迎来首次重大更新&#xff0c;正式发布完整功能的iLogtail社区版。本次更新开源全部C核心代码&#xff0c;该版本在内核能力上首次对齐企业版&#xff0c;开发者可以构建出与企业版性能相当的iLogtail云原生可观测性数据采集器。…