.NET Core微服务之基于Apollo实现统一配置中心
Tip: 此篇已加入.NET Core微服务基础系列文章索引
一、关于统一配置中心与Apollo
在微服务架构环境中,项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的配置中心,能做到自动更新配置文件信息,解决以上问题。

Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。其服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Apollo目前在国内开发者社区比较热,在Github上有超过5k颗星,在国内众多互联网公司有落地案例,可以说Apollo是目前配置中心产品领域No.1的产品,其成熟度和企业级特性要远远强于Spring Cloud体系中的Spring Cloud Config产品。
目前有针对Java和.Net的两个客户端供使用:
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有额外支持。
.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。
更多Apollo介绍请浏览 Apollo配置中心介绍
二、Apollo的快速安装与基本配置
2.1 快速安装
Apollo GitHub中提供了一个让我们快速上手的Quick Start,帮助我们快速在本地环境部署,启动Apollo配置中心。这里主要集中于针对开发环境的本地部署(单机环境),要部署到生产环境,请参考 Apollo分布式部署指南。
这里我使用的是Windows Server的虚拟机在本机搭的,当然你可以在你的Linux虚拟机中搭建,另外你也可以通过Docker更快捷地部署Apollo。
Step1.准备下列软件/环境
Java => JDK 1.8+
MySQL => 5.6.6+
Step2.陆续安装Java JDK, MySQL与Git
Step3.导入脚本(从QuickStart目录中的sql文件夹中拷贝),导入的结果会创建两个数据库:

Step4.修改demo.sh中关于数据库连接的信息,主要是url、username与password
# apollo config db info
apollo_config_db_url=jdbc:mysql://192.168.80.70:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=root
apollo_config_db_password=213224591# apollo portal db info
apollo_portal_db_url=jdbc:mysql://192.168.80.70:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=213224591
Step5.通过以下命令启动(切换到quickstart的目录中),后续可以将其作为Windows服务,不过生产环境一般用Linux。
cmd>cd C:\Apollo\apollo-build-scripts-master
cmd>demo.sh start
启动后会最终显示以下信息:
==== starting service ====
Service logging file is ./service/apollo-service.log
Started [3099]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [4071]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!
看到上述信息显示完毕,证明我们的Apollo已经成功启动起来了,那么我们可以去这两个端口8080和8070去看看:
[8070 => Apollo 配置中心管理界面,默认账号:apollo/admin]

进入之后会看到一个示例项目SampleApp,点进去可以看到其中有一个示例配置applicaiton

[8080 => Eureka服务注册&发现,和Consul类似,因为Apollo采用了Eureka作为服务注册中心,对Apollo架构感兴趣的童鞋可以阅读波波老师的《携程配置中心Apollo架构分析》,这里不是本文的重点]

2.2 基本配置
Step1.创建一个新项目(这里部门可以自己在数据中编辑serverconfig表添加)

Step2.默认情况下,创建新项目后有一个默认的application的Namespace,我们删除它,然后重新创建我们要用到的配置。对于一般共用的数据库、Redis、RabbitMQ等配置,我们一般会将其放到一个Public的配置列表中,而每个项目中私有的配置信息(如Swagger文档的说明信息)我们会单独创建一个Private的配置列表给每个项目。
下图为创建一个共享的配置列表(在Apollo中称为Namespace,详细内容可以参考:Apollo核心概念之Namespace)
Step3.向Shared和ClientService两个Namespace中添加Key/Value配置项(可以通过文本形式添加,速度更快),添加之后记得点击发布,最终结果如下图所示:

[通过文本形式添加如下图所示,当批量添加时建议采用文本形式提高效率]

现在配置都有了,开始和我们的ASP.Net Core集成吧。
三、ASP.NET Core中集成Apollo
3.1 准备工作
导入.Net Core的客户端package,看这个名字Com.Ctrip.Framework.Apollo.Configuration应该是Java程序员写的,特别的Java Style.
PM>Install-Package Com.Ctrip.Framework.Apollo.Configuration
修改appsettings.json,添加apollo节点:指明apollo的AppId和Server地址 => AppId 用来标识应用身份的唯一id,Apollo客户端针对不同的环境会从不同的服务器获取配置 ,MetaServer 就是客户端获取配置的服务器配置
"apollo": {
"AppId": "MSAD",
"MetaServer": "http://192.168.80.70:8080"
}
3.2 更改Program.cs
这里主要会在启动时读取appsettings.json中的AppId和MetaServer来连接Apollo,并且指定要读取哪个Namespace的配置项,这里设置读取两个Namespace的配置项(Shared和ClientService)。
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, builder) =>
{
builder
.AddApollo(builder.Build().GetSection("apollo"))
.AddDefault()
.AddNamespace("TEST3.Shared")
.AddNamespace("ClientService");
})
.UseStartup<Startup>()
.Build();
Tip: Apollo对于Namespace还提供了一个类似于继承的功能-关联Namespace,你可以让私有的ClientService关联一下Shared,这样就只需要读取一个ClientService的Namespace就可以了。

3.3 更改StartUp.cs
对于StartUp.cs,它承担了很多初始化的注入工作,我们会在里边引入很多配置项,但是幸运的是我们不需要做太多更改,只是把配置项的Key换成Apollo中定义的即可。例如:
// IoC - DbContext
services.AddDbContextPool<ClientDbContext>(
options => options.UseSqlServer(Configuration["DB"])); // Swagger
services.AddSwaggerGen(s =>
{
s.SwaggerDoc(Configuration["Swagger.DocName"], new Info
{
Title = Configuration["Swagger.Title"],
Version = Configuration["Swagger.Version"],
Description = Configuration["Swagger.Description"],
Contact = new Contact
{
Name = Configuration["Swagger.Contact.Name"],
Email = Configuration["Swagger.Contact.Email"]
}
});
......
});
这里通过查看Swagger API文档来验证一下是否读出来了配置项Value:

更多内容,请参考Apollo的.Net core客户端分支:https://github.com/ctripcorp/apollo.net/tree/dotnet-core
这时如果我们在Apollo中更改了ClientService的Swagger.Title配置项并发布之后(因为我们的Swagger在启动时注入的,所以无法获取实时更新的值),重启一下ClientService,配置已经更改为下图所示:

对于需要实时获取更新的item,我们也可以做一个测试,比如在一个Controller中获取:
[Route("api/Values")]
public class ValuesController : Controller
{
private IConfiguration _configuration;
public ValuesController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpGet]
public IActionResult Get()
{
string title = _configuration.GetValue<string>("Service_Swagger_Title");
return Json(title);
}
}
第一次获取Title为:

在Apollo中修改Title为:CAS Premium Service API v4,并发布
刷新浏览器,已经实时更新:

四、小结
本篇简单介绍了一下统一配置中心与Apollo的基本概念,然后介绍了Apollo的快速安装(基于QuickStart)与基本配置,最后通过与ASP.NET Core的集成演示了如何在项目中使用Apollo替代原有的配置文件(appsettings.json)。当然,本篇只是一个QuickStart,更多的内容都没有覆盖,需要我们去看官方Wiki了解。Apollo目前在国内开发者社区比较热,在Github上有超过5k颗星,在国内众多互联网公司有落地案例,值得我们学习和了解。
参考资料
(1)min.jiang,《统一配置中心》
(2)张乐,《开源配置中心之Apollo》
(3)陈珙,《基于Windows Server部署Apollo初次体验》
(4)Apollo Quick Start: https://github.com/ctripcorp/apollo/wiki/Quick-Start
(5)Apollo GitHub: https://github.com/ctripcorp/apollo
(6)杨波,《携程配置中心Apollo架构分析》
(7)focus-lei,《.Net core使用Apollo做统一配置中心》
(8)张善友,《携程Apollo(阿波罗)配置中心在.NET Core项目快速集成》
(9)ctrip,《Apollo .Net客户端使用指南》
.NET Core微服务之基于Apollo实现统一配置中心的更多相关文章
- 【NET CORE微服务一条龙应用】第二章 配置中心使用
背景 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 在分布式或者微服务系统里,通过配置文件来管理配置内容,是一件比较令人痛苦的事情,再谨慎也有湿鞋的时候,这就是在项目架构发展的过程中,配 ...
- .NET Core微服务之基于Ocelot实现API网关服务
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...
- .NET Core微服务之基于Ocelot实现API网关服务(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...
- 基于ZK构建统一配置中心的方案和实践
背景: 近期使用Zk实现了一个简单的配置管理的小东西,在此开源出来,有兴趣的希望提出您的宝贵意见.如果恰巧您也使用或者接触过类似的东西, 也希望您可以分享下您觉得现在这个项目可以优化和改进的地方. 项 ...
- .NET Core微服务之基于Exceptionless实现分布式日志记录
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Exceptionless极简介绍 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,AS ...
- .NET Core微服务之基于Steeltoe使用Spring Cloud Config统一管理配置
Tip: 此篇已加入.NET Core微服务基础系列文章索引 => Steeltoe目录快速导航: 1. 基于Steeltoe使用Spring Cloud Eureka 2. 基于Steelt ...
- .NET Core微服务之基于Consul实现服务治理
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...
- .NET Core微服务之基于Consul实现服务治理(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...
- .NET Core微服务之基于IdentityServer建立授权与验证服务
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.IdentityServer的预备知识 要学习IdentityServer,事先得了解一下基于Token的验证体系,这是一个庞大的主题 ...
随机推荐
- 用Java为Hyperledger Fabric(超级账本)开发区块链智能合约链代码之部署与运行示例代码
部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...
- BZOJ_1058_[ZJOI2007]报表统计_STL
BZOJ_1058_[ZJOI2007]报表统计_STL Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼 ...
- Spring IOC(二)容器初始化
本系列目录: Spring IOC(一)概览 Spring IOC(二)容器初始化 Spring IOC(三)依赖注入 Spring IOC(四)总结 目录 一.ApplicationContext接 ...
- Spring事务(一) Markdown 版
事务 事务的特性(ACID) 原子性(Atomicity) 原子性要求事务所包含的全部操作是一个不可分割的整体,这些操作要么全部提交成功,要么只要其中一个操作失败,就全部"成仁" ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第一部分)
由于本章过长,分为两个部分,这是第一部分. 这几年提到RNN,一般指Recurrent Neural Networks,至于翻译成循环神经网络还是递归神经网络都可以.wiki上面把Recurrent ...
- sublime text3简体中文版汉化教程
今天突然想到好像还有一个强大的编译器sublime text 3可是这个是外国的编译器,不过各位不用担心 这个编译器,已经支持中文编译了: 下面就是我关于汉化为中文方面的一些了解以及汉化方式(由于我的 ...
- appium 元素定位find_element_by_android_uiautomator方法使用
若appium中给定的方法无法满足你的需求,刚好uiautomator中的方法可以满足你的需求时,你可使用find_element_by_android_uiautomator来调用uiautomat ...
- Spring Framework学习要点摘抄
以下摘自Spring Framework官方文档,版本Spring 4.3. <context:annotation-config/> implicitly registered post ...
- Discuz3.4-SSRF-从触发点到构造payload
目录 SSRF逆向分析 0x00 前言 0x01 收集情报 0x02 尝试逆向找到触发点 0x03 尝试构造payload 0x04 总结 SSRF逆向分析 0x00 前言 之前有复现过一些漏洞,但是 ...
- wGenerator如何编写模板
编写模板大致分为4个步骤: 确定开发语言与数据库类型 分析表数据类型与语言的类型对应 分析代码中哪些可以规整为模板 编写与测试模板 我们对照流程图看的话会更加清晰: 1.如何分析表数据与开发语言的类型 ...