.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,一经查实,立即删除!

相关文章

计算机应用技术编译原理考试题,《编译原理》练习题库含答案(大学期末复习资料).doc...

《编译原理》练习测试题库一、填空1.若源程序是用高级语言编写的&#xff0c;目标程序是______&#xff0c;则其翻译程序称为编译程序。2.词法分析和语法分析本质上都是对源程序的______进行分析。3.如果源语言(编写源程序的语言)是高级语言&#xff0c;而目标语言是某计算机的…

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

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

将Reporting Service 2005 SP2集成部署到WSS3或MOSS2007服务器场心得

关于WSS3和MOSS2007安装部署方面的资料已经很多&#xff0c;我这里就不说了&#xff0c;我这里说的是怎样快速、顺利地以继承方式部署Reporting Service Server 2005 SP2到WSS3和MOSS2007服务器场的一点心得&#xff08;个人观点&#xff09;&#xff0c;其实在单服务器部署&am…

.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年发明的。魔方竞速是一项手部极限运动。咱们平时看…

[导入]ASP.NET中上传并读取Excel文件数据

首先&#xff0c;创建一个Web应用程序项目&#xff0c;在Web页中添加一个DataGrid控件、一个文件控件和一个按钮控件。<INPUT id"File1" type"file" name"File1" runat"server"><asp:Button id"Button1" runat&quo…

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

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

TCP连接——三次握手和四次断开

1.面向连接TCP是一个面向连接的协议&#xff0c;面向连接是指任何一方向对方发送数据前必须先建立通道&#xff0c;比如像打电话一样&#xff1a;必须要等到对方的手机响铃&#xff0c;并且对方接听电话时&#xff0c;才能与对方通信。而UDP则不是面向连接的协议&#xff0c;基…

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;我怀疑有人偷窥我生活↓ ↓ ↓

Effective C# 原则35:选择重写函数而不是使用事件句柄(译)

Effective C# 原则35&#xff1a;选择重写函数而不是使用事件句柄Item 35: Prefer Overrides to Event Handlers 很多.Net类提供了两种不同的方法来控制一些系统的事件。那就是&#xff0c;要么添加一个事件句柄&#xff1b;要么重写基类的虚函数。为什么要提供两个方法来完成同…

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

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

酷桌面:随身携带你的企业

需求背景&#xff1a;1.当前&#xff0c;很多企业把建设一个宣传型网站作为互联网宣传的第一步&#xff0c;在互联网上展示企业形象和主营业务&#xff0c;吸引浏览者关注其网站&#xff0c;从而达到促进销售、提升企业价值的作用。然而在移动端&#xff0c;不仅是将原有的PC网…

dataframe 修改某列_python dataframe操作大全数据预处理过程(dataframe、md5)

hive表的特征选择,不同表之间的join训练数据、测试数据的分开保存使用pandas进行数据处理显示所有列:pd.set_option(display.max_columns, None)显示所有行:pd.set_option(display.max_rows, None)单列运算:df[col2] = df[col1].map(lambda x: x**2)多列运算:df[col3] = d…

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

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

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

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