.NET Core with 微服务 - Consul 配置中心

上一次我们介绍了Elastic APM组件。这一次我们继续介绍微服务相关组件配置中心的使用方法。本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来。因为前面我们已经介绍了使用Consul 做为服务注册发现的组件,那么干脆继续使用 Consul 来作为配置中心吧。Consul 除了服务注册发现功能,还有个 Key/Value 存储的功能,我们把本地的 appsettings.json 文件的内容搬到 Key/Value 上就可以实现配置中心了。

把服务的配置迁移至 Consul

让我们来改造一下前面系列文章里的 membercenter 项目,把配置文件都迁移到 consul 上面去。


在 consul 控制台点击 “Key/Value” 菜单,点击 “create” 按钮新建一个 Key/Value 对象。

Key/Value 支持按文件夹分类,当我们的 Key 以 / 结尾的时候,consul 会认为这是一个文件夹。
我们在这里输入 “membercenter/” 在创建文件夹。

在创建的文件夹目录下继续点击 “create” 按钮。

在 key 文本框里输入 “confing.json” 。在 Value 文本框内把原来 appsettings.json 文件的全部内容复制粘贴进去。

{"consul_server": "http://192.168.18.164:8500"
}

把原来 appsettings.json 文件的内容全部删除,只输入一行 consul_server 的配置,用来指示 consul 服务的地址。

Install-Package Winton.Extensions.Configuration.Consul 

在 member_center 项目上通过nuget安装 Winton.Extensions.Configuration.Consul 这个组件。

    public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.ConfigureAppConfiguration((ctx,cfg)=> {var localconfig = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").AddEnvironmentVariables().Build();var consul_server = localconfig["consul_server"];cfg.AddConsul("member_center/config.json",op=> {op.ConsulConfigurationOptions = cco =>{cco.Address = new Uri(consul_server);};op.ReloadOnChange = true;});});webBuilder.ConfigureKestrel(options =>{options.ListenAnyIP(6002);});webBuilder.UseStartup<Startup>();});

在 program 文件的 CreateHostBuilder 方法内配置使用 Consul 做为配置的提供源。首先从本地读取 consul_server 的地址。通过 AddConsul 方法指示需要从 consul 读取的配置文件的路径。完成以上操作后我们的服务已经可以读取到 Consul 存储的配置了。

   [ApiController][Route("[controller]")]public class ConsulController : ControllerBase{IConfiguration _configuration;public ConsulController(IConfiguration configuration){_configuration = configuration;}[HttpGet("getConfig")]public string GetConfig(string key){return _configuration[key];}}

我们新建一个GetConfig方法来演示下能否读取到配置。
直接在 Controller 构造函数注入 IConfiguration 来读取配置,这跟我们普通本地配置的读取方式完全一致。

http://localhost:6002/consul/getconfig?key=hotreload_test

在浏览器上访问一下这个action对应的url,并且指定一个key=hotreload_test,可以看到输出的结果跟我们在 consul 上配置的值是一致的。

修改一下 consul 上面的配置值,重新读取一下这个配置,可以看到新的值已经被读取到了,证明我们的热更新也可以运行了。

把 Ocelot 网关的配置迁移至 Consul

上面我们演示了如何把普通服务的配置迁移至 consul,下面演示下如何把 Ocelot 的配置迁移到 Consul 上。
Ocelot 网站其实也就是一个 webapi 项目,本质上跟上面的服务没啥区别。我们根据上面的演示,其实可以很容易的把 Ocelot 项目的配置迁移到 Consul 上。那么为什么需要单独说一下 Ocelot 网关的迁移呢?
本来 Ocelot 的路由配置需要把下游服务的地址跟端口在配置文件里写死,那样的话,我们的 Consul 服务注册发现就没有意义了,我们的下游服务都是可能动态变化的。所以我们需要让 Ocelot 结合 Consul 的服务注册发现功能来把下游服务器的配置动态化。这就导致 Ocelot 项目跟 Consul 的融合会比一般的服务复杂一点。

Install-Package Ocelot.Provider.Consul

首先我们在项目上使用 nuget 安装 Ocelot.Provider.Consul 这个组件。

{"consul_server": "http://192.168.18.164:8500"
}

同样我们需要在本地的 appsettings.json 文件内指定 consul_server 的地址。再把 routes.json 文件的内容全部迁移至 consul 的 key/value 上去,这个不在赘述。

注意,这里不是简单的复制粘贴 routes.json 文件的内容。
我们需要把原来的 DownstreamHostAndPorts 配置全部删掉,替换成服务名,并且指定负载均衡的算法。

"ServierName" : "hotel_base",
"LoadBalanceOptions": {"Type": "LeastConnection"
}

在 "GlobalConfiguration" 节点指定 "ServiceDiscoveryProvider":

"ServiceDiscoveryProvider": {"Scheme": "http","Host": "192.168.18.164","Prot": 8500,"Type": "Consul"
}

ServiceDiscoveryProvider 节点指示了使用 Consul 做为服务发现的组件及Consul服务的基本信息。

        public static void Main(string[] args){new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).ConfigureAppConfiguration((hostingContext, config) =>{var localconfig = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").AddEnvironmentVariables().Build();var consul_server = localconfig["consul_server"];config.AddConsul("gateway/routes.json", op => {op.ConsulConfigurationOptions = cco =>{cco.Address = new Uri(consul_server);};op.ReloadOnChange = true;});config.AddEnvironmentVariables();}).ConfigureServices(s => {s.AddOcelot().AddConsul().AddTransientDefinedAggregator<HotelDetailInfoForMobileAggregator>();}).ConfigureLogging((hostingContext, logging) =>{logging.AddConsole();}).UseIISIntegration().Configure(app =>{app.UseOcelot().Wait();}).Build().Run();}

我们改造一下 program 文件的 main 方法,在ConfigureAppConfiguration的配置方法内首先获取 consul_server 的地址。通过AddConsul方法指示获取配置文件的地址。
以上跟服务的配置迁移都是一致的,除了以上操作使用 Consul 作为 ServiceDiscoveryProvider 还需要在 ConfigureServices 方法的配置函数内指定 consul 相关的依赖注入。

   s.AddOcelot().AddConsul()

我们运行起来所有的服务跟网关项目,访问一下 /api/hotel 这个路由,可以看到请求被正确的转发到了对应的服务上了。

总结

以上我们演示了如何把服务的配置迁移到 Consul 的 Key/Value 对象上并且实现了配置的读取及热更新。演示了 Ocelot 网关的路由配置如何迁移到 Consul 的 Key/Value 对象上并且不再写死下游服务的配置信息,而是使用 Consul 的服务发现能力动态获取下游服务的配置信息。通过以上演示我们可以发现整个过程还是非常简单易用的,虽然 Consul 做为配置中心功能相对于 apollo 等功能还不够强大,比如没有版本管理,用户权限,审计等功能,但是对于一些小的微服务项目也已经足够了。如果你的微服务体系中使用了 Consul 做为服务注册发现的组件,那么可以直接使用 Consul 来做为配置中心,这样在能够获得基本的配置中心能力同时也省去了再部署一套单独的配置中心的繁琐操作。

广告时间

如果你觉得 Consul 的配置中心功能过于简单,那么还可以试试由本人开源的 AgileConfig 轻量级配置中心项目。它部署简单,使用简单,支持配置管理,热更新,版本管理,基本的用户权限管理等功能,欢迎试用。项目地址:https://github.com/kklldog/AgileConfig 。

演示项目地址

https://github.com/kklldog/myhotel_microservice

相关文章

NET Core with 微服务 - 什么是微服务
.Net Core with 微服务 - 架构图
.Net Core with 微服务 - Ocelot 网关
.Net Core with 微服务 - Consul 注册中心
.Net Core with 微服务 - Seq 日志聚合
.Net Core with 微服务 - Elastic APM

关注我的公众号一起玩转技术

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

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

相关文章

程序员最爱说的十句口头禅。。 | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅1、别更新了学不动了。2、我不会修电脑&#xff0c;谢谢。3、听说今晚不用加班。4、是你的网络有问题。5、清一下缓存再试试6、扫码提需求&#xff0c;谢谢。7、换一台设备试试看。8、保证今晚十点上线。9、键盘给你&#xff0c;你来写…

.NET 6 新特性 System.Text.Json 中的 Writeable DOM

.NET 6 新特性 System.Text.Json 中的 Writeable DOM 特性Intro在 .NET 6 Preview 4 中&#xff0c;微软加入了 JSON Node 的支持&#xff0c;我们可以动态的编辑一个 JSON 文档&#xff0c;一个可以修改的 JSON 文档&#xff0c;就像 Newtonsoft.Json 里的 JToken&#xff0c;…

ArcGISServer10安装与地图发布

1.安装ArcGISServer10前先启动IIS&#xff0c;并打开IIS管理器界面&#xff0c;检查是否已经安装好。2.新建一个自己的站点打开Internet信息服务&#xff08;IIS&#xff09;管理器&#xff0c;右击左侧的网站列表&#xff0c;选择——添加网站&#xff0c;如下图所示&#xff…

电影特效用到什么计算机知识,后期影视特效处理知识普及

电影特效作为电影产业中不可或缺的元素之一&#xff0c;为电影的发展做出了巨大的贡献。今天小编主要给大家分享后期影视特效处理知识普及&#xff0c;希望对你们有帮助!影视特效改变电影制作的方式在目前的电影制作过程中&#xff0c;从分镜头剧本开始&#xff0c;特效的理念已…

通达信版弘历软件指标_通达信软件指标编写基础教程,10个指标源码祝你股市一帆风顺...

一、基本函数HHV&#xff08;X,N&#xff09; N日内X的最高价LLV&#xff08;X,N&#xff09; N日内X的最低价VOL 成交量AND 和&#xff0c;表示同时满足MA&#xff08;X,N&#xff09; 移动平均线&#xff0c;5日均线可以写作MA&#xff08;CLOSE&#xff0c;5&#xff09;&am…

魔方内部长啥样?三维动画展示其结构,谁发明的真是个天才

全世界只有3.14 % 的人关注了青少年数学之旅魔方&#xff0c;英文名为Rubiks Cube&#xff0c;又叫鲁比克方块&#xff0c;最早是由匈牙利布达佩斯建筑学院厄尔诺鲁比克&#xff08;又称作厄尔诺卢比克&#xff09;教授于1974年发明的。魔方竞速是一项手部极限运动。咱们平时看…

Hello Blazor:(2)集成Tailwind CSS续——nuget包方式

前段时间&#xff0c;写了一篇“Blazor如何集成Tailwind CSS”的文章。但是操作起来比较麻烦&#xff0c;又是命令行&#xff0c;又是要修改一大堆配置。后来&#xff0c;我又找到一个更简单的方法。实现方式新建Blazor项目&#xff0c;然后引用nuget包BamButz.MSBuild.Tailwin…

30屏幕参数_顶级屏幕加持,一加8系列核心配置、屏幕参数官方公布

昨天&#xff0c;一加8系列官宣将于4月16日进行线上发布。届时&#xff0c;全新的一加8系列将正式到来。随着官宣的开启&#xff0c;一加手机也开始了新机的预热。参数配置上&#xff0c;一加官方剧透称&#xff0c;一加8系列全系标配骁龙865 5G旗舰级移动平台&#xff0c;全系…

陕西科技大学18计算机调剂,2018年陕西科技大学考研调剂信息公布

2018考研复试交流群(进群领内部资料) 5764338402018年陕西科技大学考研调剂信息公布2018年考研成绩查询接近尾声&#xff0c;部分成绩不太理想的考生可能会考虑考研调剂&#xff0c;为了方便考生&#xff0c;中公考研小编为大家整理了2018年陕西科技大学考研调剂信息公布&#…

垃圾软件!动不动就扣费!| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅一、二、三、四、五、&#xff08;图源网络&#xff0c;侵权删&#xff09;我怀疑有人偷窥我生活↓ ↓ ↓

WPF实现统计图(饼图仿LiveCharts)

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;一、PieControl.cs 代码如下 using System.Collections.Obje…

计算机实践教程采莲趣事,计算机基础作业采莲趣事

精品文档 . 忽然想起采莲的事情来了。采莲是江南的旧俗&#xff0c;似乎很早就有&#xff0c;而六朝时为盛&#xff1b;从诗歌里可以约略知道。采莲的是少年的女子&#xff0c;她们是荡着小船&#xff0c;唱着艳歌去的。采莲人不用说很多&#xff0c;还有看采莲的人。那是一个热…

那些曾经拥有的最大快乐,都是好奇心的结果

▲ 点击查看对于孩子们来说&#xff0c;强烈的好奇心和求知欲&#xff0c;是一种本能。在他们懵懵懂懂长大的过程中&#xff0c;总是对周围的世界充满着各种各样的疑问&#xff1a;“叶子为什么是绿色的&#xff1f;”“为什么花朵有那么多种颜色&#xff1f;”“蚂蚁为什么能…

[原]让链接点击过后无虚线

我以前还以为有难呢,在网上查资料,才知道这么简单, <a href"http://www.ktbbs.com"onfocus"this.blur()">转载于:https://www.cnblogs.com/Kennytian/archive/2007/03/31/695463.html

UML简易实践

2019独角兽企业重金招聘Python工程师标准>>> 面向对象的问题的处理的关键是建模问题。建模可以把在复杂世界的许多重要的细节给抽象出。许多建模工具封装了UML&#xff08;也就是Unified Modeling Language™&#xff09;&#xff0c;这篇课程的目的是展示出UML的精…

战斗机各种世界之最,涨知识了。。。

全世界只有3.14 % 的人关注了青少年数学之旅世界上最大的战斗机苏联的图-128是目前世界上起飞重量最大&#xff0c;体积最大的一款截击机&#xff0c;它由前苏联图波列夫设计局于1955研制成功并进行首飞&#xff0c;1963年装备部队&#xff0c;该机全长30.03米&#xff0c;翼展…

Bye Bye Embed-再见了Embed,符合web标准的媒体播放器代码

由于Embed标签是Netscape的私有财产&#xff0c;故一直未被W3C认可&#xff0c;对于各种媒体文件使用Embed标签是非标准的&#xff0c;如何改变&#xff1f;Elizabeth Castro的 Bye Bye Embed 一文对于各种媒体播放器给出了很好的符合web标准的代码。 在线媒体播放--Google Vid…

.NET Core授权失败如何自定义响应信息?

【导读】在.NET 5之前&#xff0c;当授权失败即403时无法很友好的自定义错误信息&#xff0c;以致于比如利用Vue获取到的是空响应&#xff0c;不能很好的处理实际业务&#xff0c;同时涉及到权限粒度控制到控制器、Action&#xff0c;也不能很好的获取对应路由信息本文我们来看…

计算机电缆2x2x1.5,计算机电缆djypvp1x2x1.5

计算机电缆djypvp1x2x1.5硅橡胶计算机电缆适用于各种仪器仪表的连结&#xff0c; 以及信号传输。它具有耐高温、低温、耐腐蚀、舒缓老化等优点&#xff0c;对特殊场所或恶劣环境中的使用是目前理想的产品&#xff0c;正常使用温度为—60℃一250℃。产品特点:1.执行标准Q/ILXD-1…

虚线 实现_redis跳跃表实现

跳跃表是一种有序的数据结构&#xff0c;它通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。redis 使用跳跃表作为有序集合键的底层实现之一&#xff0c;如果一个有序集合包含的元素数量比较多&#xff0c;又或者有序集合中元素的成员是比…