技术分享|集成开放平台使用Consul Watch机制实现配置热更新


源宝导读:在微服务架构体系中,由于微服务众多,服务之间又有互相调用关系,因此,一个通用的分布式配置管理是必不可少的。本文将介绍如何使用Consul Watch机制实现配置集中管理与热更新。

前言

随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址等等,对程序配置的期望值也越来越高:配置修改后实时生效,分环境、分集群管理配置,代码安全、审核机制。在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。所以,配置中心应运而生。

在微服务架构体系中,由于微服务众多,服务之间又有互相调用关系,因此,一个通用的分布式配置管理是必不可少的。一般来说,配置管理需要解决配置集中管理、在系统运行期间可实现动态配置、配置修改后支持自动刷新等问题。

一、Consul在集成开放平台的使用场景

天际集成开放平台深度集成Consul,实现微服务架构中的以下场景:

1 .服务注册:Consul提供了通过DNS或者HTTP接口的方式将我们的服务信息注册给Consul

2 .服务发现:Consul提供了通过DNS或者HTTP接口的方式查询发现注册的服务。这样外部可以很容易的发现它所依赖的服务

3.服务负载均衡:Consul的服务注册是集群式的。我们可用通过负载均衡算法从Consul注册的服务列表中负载出一个可以被访问的服务

4 .Key/Value配置中心:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能

5 .健康检查:Consul的Client可以提供任意数量的健康检查,可以与给定的服务相关联(HTTP服务是否返回200)。系统可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去

二、Consul K/V查询与Blocking Query

2.1 Consul提供的Watch类型

1. Key – 监视指定K/V键值对

2. Keyprefix – 监视指定的Keyprefix

3. Services – 监视服务列表

4.nodes – 监控节点列表

5. service – 监视服务实例

6. checks- 监视健康检查的值

2.2 Consul K/V 查询

2.2.1 K/V查询

通过Consul提供的K/V HTTP API。我们可以很容易的对Consul的K/V进行写入,修改,查询操作。

通过Consul管理控制台,我们新建一个Key为Config的配置项并设置值为 {"title":"测试标题","MaxTaskCount":3}。

调用Consul K/V查询API http://127.0.0.1:8500/v1/kv/{key}可以查询key下Value的值,此处,我们需要查询是Key是Config。所以,完整的Uri是http://127.0.0.1:8500/v1/kv/Config。

查询结果 

 {"LockIndex": 0,"Key": "Config","Flags": 0,"Value": "ewoidGl0bGUiOiLmtYvor5XmoIfpopgiLAoiTWF4VGFza0NvdW50IjozCn0=","CreateIndex": 7319758,"ModifyIndex": 7319803}

通过查询结果可以获取Config的Value信息,HTTP API查询的Value一般是字节的Base64表现形式。当然,在实际的编码过程中,我们不会直接使用HTTP API调用。而是通过Consul Client SDK进行调用。

C#使用Consul Client SDK查询K/V 

 var uri = new UriBuilder("http", "127.0.0.1", 8500);
IConsulClient client = new ConsulClient(config => config.Address = uri.Uri);
var response =await client.KV.Get("Config");
var value = string.Empty;if (response?.StatusCode == System.Net.HttpStatusCode.OK){value = Encoding.UTF8.GetString(response.Response?.Value);
}

上述查询代码可以获取Config的真实配置值 {"title":"测试标题","MaxTaskCount":3}。

2.2.2 Keyprefix查询

2.2.1章节中介绍了如何进行Consul的K/V查询。而在实际的使用过程中,不仅仅会进行的K/V查询。还会使用Keyprefix方式来查询某个prefix下的所有K/V信息。

在Consul管理控制台,新建Key Students,在Students Key下新建多个K/V,如下图所示:

设置查询的prefix为Students,查询结果应该为Students下配置的所有的K/V数据列表。

C#使用Consu Client Sdk执行Keyprefix查询 

var uri = new UriBuilder("http", "127.0.0.1", 8500);IConsulClient client = new ConsulClient(config => config.Address = uri.Uri);var response =await client.KV.List("Students");var kvList = new List<string>();if (response?.StatusCode == System.Net.HttpStatusCode.OK){foreach (var kVPair in response.Response){if (kVPair.Value != null){var value = Encoding.UTF8.GetString(kVPair.Value);kvList.Add(value);}}}var outPutString = JsonSerializer.Serialize(kvList);

查询结果 

[{"name":"Nick","address":"test address","age":18},{"name":"Tom","address":"test address","age":18}
]

2.3 Consul Blocking Query

上述2.1、2.2章节介绍了Consul的K/V查询的两种方式。要实现配置实时更新通知Consul K/V查询只是第一步,而下面要介绍的就是关键的第二步,Consul的Blocking Query。

Blocking Query官方定义:

Many endpoints in Consul support a feature known as "blocking queries". A blocking query is used to wait for a potential change using long polling. Not all endpoints support blocking, but each endpoint uniquely documents its support for blocking queries in the documentation.

Endpoints that support blocking queries return an HTTP header named X-Consul-Index. This is a unique identifier representing the current state of the requested resource.

On subsequent requests for this resource, the client can set the index query string parameter to the value of X-Consul-Index, indicating that the client wishes to wait for any changes subsequent to that index.

When this is provided, the HTTP request will "hang" until a change in the system occurs, or the maximum timeout is reached. A critical note is that the return of a blocking request is no guarantee of a change. It is possible that the timeout was reached or that there was an idempotent write that does not affect the result of the query.

In addition to index, endpoints that support blocking will also honor a wait parameter specifying a maximum duration for the blocking request. This is limited to 10 minutes. If not set, the wait time defaults to 5 minutes. This value can be specified in the form of "10s" or "5m" (i.e., 10 seconds or 5 minutes, respectively). A small random amount of additional wait time is added to the supplied maximum wait time to spread out the wake up time of any concurrent requests. This adds up to wait / 16 additional time to the maximum duration.

简单来说就是当客户端请求Consul获取K/V时,需要携带一个版本号信息,Consul会比较这个客户端版本号是否和Consul服务端的版本号一致,如果一致,则Consul会阻塞这个请求,直到Consul中的K/V发生变化,或者到达阻塞时间上限;如果版本号不一致,则立即返回。这个阻塞时间默认是5分钟,支持自定义。

利用阻塞查询的机制,我们可以发起一个“挂起”的查询。这个查询直到K/V的值发生变更才会返回,这样,查询发起方既能收到K/V值发生变更的通知,又能接收变更后的最新值。

Consul Blocking Query查询 

Task.Factory.StartNew(async () => {ulong waitIndex = 0;var uri = new UriBuilder("http", "10.20.21.13", 8500);IConsulClient client = new ConsulClient(config => config.Address = uri.Uri);while (true){var response = await client.KV.Get("Config", new QueryOptions { WaitIndex = waitIndex });if (response.StatusCode == System.Net.HttpStatusCode.OK){if (response.Response?.Value != null){var value = Encoding.UTF8.GetString(response.Response?.Value);waitIndex = response.Response.ModifyIndex;}}}});

上述代码的Blocking Query经历下面步骤:

1 .声明客户端查询版本号,默认值0

2 .执行初始查询,获取K/V值

3 .将查询结果中Consul服务端该K/V的最新版本号赋值给客户端查询版本号

4 .使用最新的客户端版本号进行阻塞查询

5 .最新客户端发起的查询将会"挂起",直到Config中Value值发生变更,查询才会返回

上述操作是在一个后台循环线程中运行的,所以,在”挂起“的查询返回时即完成一次K/V更改通知。随后进入下一次查询”挂起操作“,直到又一次发生变更。这样,程序在运行期间便能一直保持对某个Key的Blocking Query达到配置更改通知的目的。

三、集成开放平台使用Consul Blocking Query实现实时生效配置中心

第2节描述了如何使用Consul的Blocking Query实现配置实时更改通知。在集成开放平台中,不同微服务的配置会放置在Consul的不同路径下。现在各服务配置之间的隔离,每个服务在启动时会对需要在运行期间热更新的配置发起Blocking Query,当配置管理模块更改了服务监控的配置时,服务“挂起”的配置查询就会收到更新通知。

四、后续思考

整体来说,集成开放平台利用Consul实现的配置实时通知还属于使用阶段。而配置行为,配置管理,配置Consul更改通知等等并未独立为单独的配置服务与配置管理模块。配置相关的代码还是分散在各服务中。在之后的架构演变中,可以考虑将配置单独出一个配置服务与管理。而各微服务使用的只应该是配置服务对应的SDK。这样整体架构就指责清晰,领域独立了。

----- END ------

作者简介

刘同学: 研发工程师,目前负责集成开放平台相关工作。

也许您还想看:

Jekins持续集成在ERP研发中的应用实践

基于PaaS平台的多应用自集成方案之公共数据集成

更多明源云·天际开放平台场景案例与开发小知识,可以关注明源云天际开发者社区公众号:

【DevOps】获取流水线部署信息,查看部署快人一步

【建模】ERP日志分表,提升海量日志存取性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14个超有料的优质公众号,关注了就舍不得删

全世界有3.14 % 的人已经关注了数据与算法之美关注了那么多公众号&#xff0c;百无聊奈地看文章你是否觉得时间被浪费&#xff0c;生命被辜负了&#xff1f;在号的数量上做减法&#xff0c;质量上做加法接下来给大家推荐最近一直在阅读的几个优质公众号每一篇推文都值得你点开长…

python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目

随着人工智能的兴起&#xff0c;国内掀起了一股Python学习热潮&#xff0c;入门级编程语言&#xff0c;大多选择Python&#xff0c;有经验的程序员&#xff0c;也开始学习Python&#xff0c;正所谓是人生苦短&#xff0c;我用Python有个Python入门练手项目&#xff0c;一直没有…

基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)

大家应该都知道几个很常见的例子&#xff0c;比如在张学友的演唱会&#xff0c;在安检通道检票时&#xff0c;通过人像识别系统成功识别捉了好多在逃人员&#xff0c;被称为逃犯克星&#xff1b;人行横道不遵守交通规则闯红灯的路人被人脸识别系统抓拍放在大屏上以示警告&#…

这些数据获取方式,一般人不知道

全世界只有3.14 % 的人关注了数据与算法之美在这个用数据说话的时代&#xff0c;能够打动人的往往是用数据说话的理性分析&#xff0c;无论是对于混迹职场的小年轻&#xff0c;还是需要数据进行分析和研究的同学&#xff0c;能够找到合适的数据源都是非常重要的。特别是想要对一…

ftp 笔记

Ubuntu自带wget。如果没有密码的ftp&#xff0c;直接wget ftp://111.222.33.4/path/filename&#xff0c;就可以下载ftp://111.222.33.4的文件夹path里的文件filename。如果是有密码的ftp&#xff0c;则wget ftp://username:passwordftp.111.222.33.4/path/filename。如果用的…

java定义构造方法_JAVA基础学习之路(三)类定义及构造方法

类的定义及使用一&#xff0c;类的定义classBook {//定义一个类intprice;//定义一个属性intnum;public static int getMonney(int price, intnum) {//定义一个方法return price*num;}}public classtest2 {public static voidmain(String args[]) {Book monney newBook();//声明…

通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...

上一篇我们讲到了dapr提供的bindings&#xff0c;通过绑定可以让我们的程序轻装上阵&#xff0c;在极端情况下几乎不需要集成任何sdk&#xff0c;仅需要通过httpclienttext.json即可完成对外部组件的调用&#xff0c;这样只需要对外暴露一个轻量级的http服务器提供restapi即可作…

了解IT行业前沿应用,关注数据与算法之美

点击上方蓝色字体&#xff0c;关注我们!

windows php的Memcache安装和使用方法

下载 &#xff1a;memcached.exe解压到 下载&#xff1a;php_memcache.dll 把它放入php文件夹的ext目录中。在php.ini加入一行引用扩展&#xff0c;代码如下&#xff1a;extensionphp_memcache.dll重启Apache服务器然后查看一下phpinfo可以找到memcache信息 说明安装成功测试启…

云原生ASP.NET Core程序的可监测性和可观察性

点击蓝字关注我们分布式应用程序很复杂&#xff0c;给开发人员调试和修复生产问题带来了一系列挑战。尽管微服务架构可帮助维持一支规模较小&#xff0c;可以自主工作并专注于独立业务团队&#xff0c;但由于其分布式性质&#xff0c;它带来了新的挑战。例如&#xff0c;在业务…

OxyPlot.Wpf 图表控件使用备忘

OxyPlot.Wpf 图表控件使用备忘目录OxyPlot.Wpf 图表控件使用备忘一、OxyPlot.Wpf 控件信息二、基本概念(一) PlotView 和 Plot(二) PlotModel(三) Axes(四) Series(五) Tracker三、样式设置(一) 效果对比(二) 图表边框和数据线条样式(三) 坐标轴样式(四) 自定义 Tracker四、装配…

造作吧,Python快速入门!

双十一的刀口还没愈合&#xff0c;双十二的折扣又戳到了胸口。买买买&#xff0c;还是小天最懂你看看小天都准备了什么&#xff01;课程限时优惠&#xff0c;网易云课堂平台优惠券&#xff0c;优惠叠加&#xff0c;课程包更享折上折&#xff01;双十二年终钜惠&#xff0c;还犹…

C# Hashtable和Dictionary区别

Hashtable和Dictionary都是.Net下的表示键值对的集合&#xff0c;那么我们在使用中该选择Hashtable还是Dictionary&#xff1f;下边我们看看他们之间的区别&#xff1a;1、Dictionary<K,V>在使用中是顺序存储的&#xff0c;而Hashtable由于使用的是哈希算法进行数据存储&…

java中如何运行小程序_一起学java(一)——运行第一个小程序

接下来的一段时间内会更新一起学java系列&#xff0c;喜欢的关注一下我吧。微信公众号&#xff1a;什么都不懂的大佬&#xff1b;初学&#xff0c;有错误的地方请大家多多指教。---------------分割线--------------一. 什么是java&#xff1f;java是一门面向对象的计算机编程语…

一分钟教你用Excel从统计局抓数据!

全世界只有3.14 % 的人关注了数据与算法之美现在呢&#xff0c;从网上爬虫数据来做分析越来越火&#xff0c;如果不会这个skillset做数据处理简直没办法装逼。作为一个兴趣广泛的高能物理phd&#xff0c;自然不能被时代落下。首先声明&#xff0c;我并没有学过HTML的语言&#…

记一次 .NET 某HIS系统后端服务 内存泄漏分析

一&#xff1a;背景 1. 讲故事前天那位 his 老哥又来找我了&#xff0c;上次因为CPU爆高的问题我给解决了&#xff0c;看样子对我挺信任的&#xff0c;这次另一个程序又遇到内存泄漏&#xff0c;希望我帮忙诊断下。其实这位老哥技术还是很不错的&#xff0c;他既然能给我dump&a…

freemarker 内置函数

2019独角兽企业重金招聘Python工程师标准>>> 在我们应用Freemarker过程中&#xff0c;经常会操作例如字符串&#xff0c;数字&#xff0c;集合等&#xff0c;却不清楚Freemrker有没有类似于Java一样有相关的类及方法。在本文当中&#xff0c;我将向大家详细的介绍Fr…

专业学习频道,欢迎关注数锐学堂

数锐学堂简介&#xff1a;致力于深耕数学领域的科普学习、竞赛、机器学习等算法技能应用优质课程&#xff0c;精心打造一站式的数学垂直领域教育服务。长按二维码可以关注如果识别二维码有问题请搜索微信号&#xff1a;supermodeling

在非容器(集群)环境下运行dapr

作者&#xff1a;李俱顺原文&#xff1a;https://www.4async.com/2021/03/2021-03-11-running-dapr-without-container/前一段时间一直关注的dapr正式发布了v1.0版本(实际上本文发布时还更新了v1.0.1)&#xff0c;代表dapr在某些程度上进入稳定状态&#xff0c;可以尝试在实际中…

【Silverlight5矢量打印】如何用C#代码检测打印机和驱动是否支持PostScript

Silverlight5支持PostScript矢量打印&#xff0c;矢量打印相比于位图打印速度更快&#xff0c;生成的打印文件更小。SL5默认会采用PS矢量打印&#xff0c;如果打印机不支持&#xff0c;自动切换到位图打印。 虽然微软SL打印组认为PS已经相当普遍&#xff0c;但我想大多数打印机…