『Consul』.NET Core快速接入Consul实现统一配置中心

简介: 📣读完这篇文章里你能收获到- .NET Core快速接入Consul代码Demo- 了解配置中心的概念

请添加图片描述
📣读完这篇文章里你能收获到

  • .NET Core快速接入Consul代码Demo
  • 了解配置中心的概念

请添加图片描述

一、概念篇

1 什么是配置中心?

  • 配置是用来动态修改程序执行的一种行为的机制

2 为什么要使用配置中心?

  • 安全性:配置跟随源代码保存在代码库中,容易造成配置泄漏。
  • 时效性:修改配置,需要重启服务才能生效。
  • 局限性:无法支持动态调整:例如日志开关、功能开关。

3 配置中心选择对比

3.1 Apollo

  • Java开发 ----- 运维成本比高
  • Apollo分为MySQL,Config Service,Admin Service,Portal四个模块,MySQL存储Apollo元数据和用户配置数据; Config Service提供配置的读取、推送等功能,客户端请求都是落到Config Service上; Admin Service提供配置的修改、发布等功能,Portal操作的服务就是Admin Service; Portal提供给用户配置管理界面;功能强大,社区活跃,但较为复杂,部署组件较多,运维成本比高

3.2 Consul

  • go开发
  • 依赖:不依赖其他组件
  • 应用内/外:属于外部应用,侵入性小
  • ACP原则:遵循CP原则(一致性+分离容忍) 服务注册稍慢,由于其一致性导致了在Leader挂掉时重新选举期间真个consul不可用。
  • 版本迭代:目前仍然进行版本迭代
  • 集成支持:支持SpringCloud K8S集成
  • 访问协议:HTTP/DNS
  • 雪崩保护:不支持雪崩保护
  • 自动注销实例:不支持

3.3 Nacos

  • 依赖:mysql
  • 应用内/外:属于外部应用,侵入性小
  • ACP原则:通知遵循CP原则(一致性+分离容忍) 和AP原则(可用性+分离容忍)
  • 版本迭代:目前仍然进行版本迭代,最近的提交是几天前
  • 集成支持:支持Dubbo 、SpringCloud、K8S集成
  • 访问协议:HTTP/动态DNS/UDP
  • 雪崩保护:支持雪崩保护
  • Spring cloud config java开发 ----- Net支持比较差
  • 自动注销实例:支持
  • 界面:国产服务,中文界面,符合国人习惯
  • 上手:极易,中文文档,案例,社区活跃

Consul实际上是和Nacos比较相似的产品,虽然Consul目前的主要发展方向放在了Service Mesh,但是Consul最初支持的服务发现和配置管理,也是Nacos的两大功能。虽然Nacos在Consul之后以与之相似的部署架构开源,但这并不意味着Nacos在功能和架构上也模仿Consul,Nacos的架构和功能是由阿里巴巴内部十年的运行演进经验得来,所以二者的比较也一定会让大家更加了解他们的定位和演进方向是完全不一样的。

请添加图片描述

二、.Net项目接入

1 Nuget包引用

  • 在项目中Nuget下载Winton.Extensions.Configuration.Consul

2 配置文件中配置Consul地址

"Consul_Url": "http://127.0.0.1:8500",

3 Program文件修改

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
                    {

                        // 加载默认配置信息到Configuration
                       hostingContext.Configuration = config.Build();
                        // 加载consul配置中心配置
                        string consul_url = hostingContext.Configuration["Consul_Url"];
                        Console.WriteLine($"consul_url:{consul_url}");
                        // 动态加载环境信息,主要在于动态获取服务名称和环境名称
                        var env = hostingContext.HostingEnvironment;
                        config.AddConsul(
                                     $"{env.ApplicationName}/appsettings.{env.EnvironmentName}.json",
                                    options =>
                                    {
                                        options.ConsulConfigurationOptions = cco => { cco.Address = new Uri(consul_url); }; // 1、consul地址
                                        options.Optional = true; // 2、配置选项
                                        options.ReloadOnChange = true; // 3、配置文件更新后重新加载
                                        options.OnLoadException = exceptionContext => { exceptionContext.Ignore = true; }; // 4、忽略异常
                                    }
                                    );
                            config.AddConsul(
                                     $"{env.ApplicationName}/other.json",
                                    options =>
                                    {
                                        options.ConsulConfigurationOptions = cco => { cco.Address = new Uri(consul_url); }; // 1、consul地址
                                        options.Optional = true; // 2、配置选项
                                        options.ReloadOnChange = true; // 3、配置文件更新后重新加载
                                        options.OnLoadException = exceptionContext => { exceptionContext.Ignore = true; }; // 4、忽略异常
                                    }
                                    );
                        
                            hostingContext.Configuration = config.Build(); // 5、consul中加载的配置信息加载到Configuration对象,然后通过Configuration 对象加载项目中
                    });
                });

4 动态加载配置信息

app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync(Configuration["Name"]);
                });
            });    
相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
96 3
|
1月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
41 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
59 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
48 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
127 0