Dotnet微服务:使用Apollo实现统一配置管理
随着项目中的服务数据越来越多,如何管理各个服务的配置数据成为需要解决的问题,如果每个服务的配置数据都放在自身的配置文件下,无疑会带来很大的管理开销,搭建统一的配置中心成为主流。目前流行的配置中心有Springcloud config、apollo、consul等,由于springcloud config在dotnet上的支持不太好,尤其是在实时更新上比较麻烦,需要自已用rabbit做事件总线来实现热更新,所以我倾向于由携程开发出的apollo项目,开源地址
一,安装并启用apollo。
1,Centeros ,安装 jdk1.8
yum install java-1.8.0-openjdk.x86_64
安装Mysql
wget -i -c https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
下载到指定位置后,就可以执行安装了
yum -y install mysql80-community-release-el7-3.noarch.rpm
yum -y install mysql-community-server
查看mysql root账户的初始密码:grep "password" /var/log/mysqld.log
登录mysql:mysql -uroot -p
修改root密码:登录后执行alter user 'root'@'localhost' identified by 'Xxxxx@xx.com'
2,下载Apollo quick start包:下载地址
创建数据库:下载好apollo-quick-start后解压,目录内有个sql的文件夹,里面有sql模板,直接导入即可:
登录数据库后执行:
source /apollo/apollo-quick-start-1.5.0/sql/apolloconfigdb.sql。
source /apollo/apollo-quick-start-1.5.0/sql/apolloportaldb.sql。
/apollo/apollo-quick-start-1.5.0为sql模板文件所在目录
3,启动项目
vi demo.sh,修改数据库连接信息
启动项目:./demo.sh start
开放端口:8080 ,8070。firewall-cmd --zone=public --add-port=8090/tcp --permanent。 其中8080为eureka服务监听地址,8070为apollo管理系统地址。
重新加载防火墙:firewall-cmd --reload
打开管理地址:http://<当前主机ip>:8070并使用用户apollo和密码admin登录
4,创建项目
创建项目后添加键值对并发布。这里我添加了一个key为mysql.connectString的数据。
二,DotnetCore集成apollo
1,配置:
appsetting.json添加apollo配置信息,Appid为上面创建的项目appid,MetaServer地址为apollo项目注册到的eureka服务器地址。
"apollo": { "AppId": "IdentitySerivce", "MetaServer": "http://192.168.137.2:8080" }
Program.CS中启用apollo。
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingcontext, builder) => { builder.AddApollo(builder.Build().GetSection("apollo")).AddDefault(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
2,读取配置中心的数据。
新建一个接口getConfig
[Route("api/[controller]")] [ApiController] public class ConfigController : ControllerBase { IConfiguration Configuration; public ConfigController(IConfiguration Configuration) { this.Configuration = Configuration; } [HttpGet("GetConfig")] public string GetConfig(string data) { return this.Configuration[data]; } }
访问该接口
在apollo上修改数据后重新发布再次访问该接口。
集成apollo后,修改配置文件后是即时生效的,不需要做任何操作。
3,apollo的namespace
apollo配置中心的namespace分有私有和公有,私有的namespace的数据只能相对应的appid才能访问到其数据,而公有的namespace下的数据可以被任意应用访问。
下面用实例讲讲apollo的namespace的用法
比如,多个应用要注册到eureka服务注册中心需要对这些应用做配置,其中一些内容是相同的,比如服务注册地址等。有些内容是独有的,比如注册到eureka的端口等。这时就可以用到apollo的namespace特性了,相同的配置停下写在一个共享的namespance下,独有配置信息写在私有的namespace下。
在apollo下建立一个项目,用于存放共享的配置信息。项目创建完成后点击左下角的“添加Namespace”即可创建新的namespace
然后在此公共namespance下建立键值对数据并发布。注意:用于DOTNETCORE项目的配置数据需要用冒号隔开。
在之前创建的“IdentityService”项目中新建独有的配置信息:
最后,将公共命令空间配置添加到DotnetCore项目
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingcontext, builder) => { builder.AddApollo(builder.Build().GetSection("apollo")).AddDefault().AddNamespace("TEST1.common"); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
启动项目,发现Eureka已经收到注册信息: