写在前面

我在前文:

《微软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

可以看到初始值==1;

我们新增一个测试的TestKey4==TestKey4-azure

启动程序后,我们无论怎么修改配置后台,都不会程序拿到值始终:TestKey4 ==TestKey4-azure

我们把监控Key:TestApp:Settings:Sentinel设置为2

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

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命名空间

信息自己填

创建Topic

我创建的topic名:config-topic

创建topic订阅

订阅名:config-s1

ok,到这步位置,Service Bus这边基本配置完;

2、创建配置中心的事件订阅到topic订阅

App Configuration下创建事件订阅

填写Topic订阅信息

注意右侧红框,要选择你上步创建的Service Bus 的Topic订阅 config-topic

创建成功

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) =>
{
// 构建一个 EventGridEvent
EventGridEvent eventGridEvent = EventGridEvent.Parse(BinaryData.FromBytes(message.Body)); // 创建PushNotification
eventGridEvent.TryCreatePushNotification(out PushNotification pushNotification); // 刷新IConfiguration
refresher.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来测试,先运行程序,

本来:TestKey4TestKey4-azure,我们改成:TestKey4TestKey4-azure 2022年8月6日

但怎么刷新程序获取的值都不会更新。

我们打个断点到函数:UseAzureConfigChangeEventHandler(),再更新Key TestApp:Settings:Sentinel

看到,收到配置更新消息命中断点了:

同时,通过Service Bus的后台,我们也已看到配置更新事件消息正确发送:

我们再次获取配置看到确已更新:

OK,服务端基于订阅消息队列获取配置的主动更新方式验证成功;

总结

1、我觉得动态更新配置用主动轮询的方式基本能满足大部分需求(但是每次轮询消耗次数,请设置好轮询间隔时间),基于消息队列的主动推送方式稍微有点麻烦,看需求选用;

2、当配置中心的Key和本地配置文件的Key冲突时,以配置中心为准;

3、总体来说Azure配置中心还是挺香的,除了贵(毕竟Azure 土豪云),价格

Azure配置中心的基本学习到这里告一段落,后面挖掘到更实用的功能/技巧将再次水文补充;

源码

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

[参考]

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

微软Azure配置中心 App Configuration (三):配置的动态更新的更多相关文章

  1. 微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core

    写在前面 在日常开发中,我这边比较熟悉的配置中心有,携程Apollo,阿里Nacos(配置中心,服务治理一体) 之前文章: Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触 总体来 ...

  2. 微软Azure配置中心 App Configuration (二):Feature Flag 功能开关特性

    写在前面 Web服务开发过程中我们经常有这样的需求: 某些功能我必须我修改了配置才启用,比如新用户注册送券等: 某个功能需到特定的时间才启用,过后就失效,比如春节活动等: 某些功能,我想先对10%的用 ...

  3. 【Nacos】Springboot整合Nacos配置中心(二) 多环境配置

    本篇随笔接上一篇文章:Springboot整合Nacos配置中心(一),主要记录Nacos多环境的配置的方法 Nacos多环境的配置 方法一: 1.在项目中的bootstrap.yaml文件中配置激活 ...

  4. zookeeper配置中心实战--solrcloud zookeeper配置中心原理及源码分析

    程序的发展,需要引入集中配置: 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址…… 并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境.分集群管理配 ...

  5. 使用Alibaba的Nacos做为SpringCloud的注册和配置中心,并结合Sentinel+Nocos动态进行限流熔断

    最近在学习阿里的Nacos组件以及Sentinel组件,折腾出了一个小demo. Git地址:https://github.com/yangzhilong/nacos-client 有兴趣的小伙伴可以 ...

  6. 微软Azure通知中心 (Azure Notification Hubs)

    Azure Notification Hubs 提供简单的方法从后台(azure或者on-promise)去发送通知在不同的平台上面(iOS, Android, Windows, Kindle, Ba ...

  7. 【Azure 应用服务】App Service 通过配置web.config来添加请求返回的响应头(Response Header)

    问题描述 在Azure App Service上部署了站点,想要在网站的响应头中加一个字段(Cache-Control),并设置为固定值(Cache-Control:no-store) 效果类似于本地 ...

  8. Spring Cloud 系列之 Config 配置中心(三)

    本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) 本篇文章讲解 Conf ...

  9. kubernetes实战-配置中心(三)配置服务使用apollo配置中心

    使用配置中心,需要开发对代码进行调整,将一些配置,通过变量的形式配置到apollo中,服务通过配置中心来获取具体的配置 在配置中心修改新增如下配置: 项目信息: 配置: 重新打包镜像,使用apollo ...

随机推荐

  1. python生产exe文件yi以及解释器配置等

    原文链接:https://blog.csdn.net/weixin_42691768/article/details/81044666 https://www.cnblogs.com/paulwhw/ ...

  2. Xmind演讲主题大纲

    参考:https://www.bilibili.com/video/BV1Rb411s7VG?p=9

  3. 2021.06.19【NOIP提高B组】模拟 总结

    T1 题意:有 \(n\) 个点,有 \(m\) 条边,每次加入一条到图中 问每个点的度数大于零且都是偶数的子图的个数 考试直接判断两点是否出现,出现则更新 其实只要改成并查集判断即可 原理:其实就是 ...

  4. Ubuntu安装python固定版本

    一. 安装python3.7 本篇文章使用python3.7安装步骤为例 1.直接使用apt-get安装python3.7 apt-get install python3.7 该方法经常会出现unab ...

  5. mac mini 装UBUNTU后没有WIFI解决办法

    1.在终端中运行如下命令,重新安装b43相关的全部驱动和firmware: 复制代码 代码如下: sudo apt-get install bcmwl-kernel-source #Broadcom ...

  6. powershell命令总结

    2021-07-21 初稿 ps命令采用动词-名词的方式命名,不区分大小写.默认当前文件夹为当前路径./.除去-match使用正则表达式匹配外,其他都使用*和?通配符. 速查 管道命令 前一个的输出作 ...

  7. 3行python代码翻译70种语言,这个OCR神奇太赞了

    写在前面的一些P话: 今天给大家介绍一个超级简单且强大的OCR文本识别工具:easyocr. 这个模块支持70多种语言的即用型OCR,包括中文,日文,韩文和泰文等.完全满足了大家对于语言的要求,不管你 ...

  8. python之多进程and多线程

    图文来自互联网 一.什么是进程和线程 (https://jq.qq.com/?_wv=1027&k=rX9CWKg4) 进程是分配资源的最小单位,线程是系统调度的最小单位. 当应用程序运行时最 ...

  9. 开发人员要学的Docker从入门到日常命令使用(通俗易懂),专业运维人员请勿点!

    一.介绍Docker  1.引言 问题1:开发人员告诉测试说自己的项目已经做好了,给你一个发布包,你去测试吧. ## 测试人员,为什么我运行会报错? ## 开发人员说,我本地运行没有问题呀!   解答 ...

  10. 一文搞懂 Netty 发送数据全流程 | 你想知道的细节全在这里

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 在<Netty如何高效接收网络数据 ...