阿波罗是希腊神话中的光明之神、文艺之神,同时也是罗马神话中的太阳神;他是光明之神,从不说谎,光明磊落,在其身上找不到黑暗,也被称做真理之神。他很是聪明,通晓世事,是预言之神。javascript
后世各类各样的项目都喜欢以阿波罗
命名,好比著名的美国登月计划:阿波罗计划;html
既然携程以阿波罗(Apollo)命名项目,那咱们咱们接下来看看,携程阿波罗能给咱们程序员带来怎样的光明(我但愿这个光明是能够天天下午6点钟的太阳 哈哈);java
下面看看.net core和Apollo会碰撞出什么样的火花吧mysql
在这以前,咱们先看官方是怎么介绍的:git
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,可以集中化管理应用不一样环境、不一样集群的配置,配置修改后可以实时推送到应用端,而且具有规范的权限、流程治理等特性,适用于微服务配置管理场景。程序员
讲的很清楚,携程阿波罗(后面简称Apollo)是一个分布式的配置中心,就是管理配置程序配置地方;Apollo服务端基于Spring Boot和Spring Cloud开发(对的,就是微服务框架),打包后能够直接运行,不须要额外安装Tomcat等应用容器。github
Apollo有如下特色:web
具体每一项展开是什么意思,我就很少说了,更多介绍请看Apollo配置中心介绍sql
再多说一句,截止到这篇博客编写时间为止,Apollo在github已经有9300+个star了;docker
并拥有众多的生产使用案例;
咱们设想一下,咱们微服务架构中,咱们一个每个服务均可能部署到5~10机器上,咱们有很几十个各类各样的服务;好比某一天,咱们机房由于网络问题,必须更换数据库服务器ip,业务接口ip等;若是人工去一台机一台机地改,哇,那就就头痛了。。。
不止是微服务,作开发这么多年,常常因配置的问题引起生产环境的bug。有些年久的项目,几百个密密麻麻的配置项,常常容易搞混,有时好几个项目有好多一样的配置项,常常被配置问题,或者配置衍生的问题搞得奄奄一息;这时候或者选用一个配置管理中心,也是个不错的选择;
有人说,我作了用了Jenkins或者什么作了自动化部署的,不是提交一下代码就能够了吗;确实,自动化部署环境确实也能够作到配置的“一处更改,全部引用起效”的效果;可是,镜像的打包失败,打包时间过长等问题,也须要考虑进来的;
因此,综合来讲,在配置人工管理困难的时候或者说成本较高的时候;使用配置中心是一个合理的选择;
windows10 64bit 专业版
8G内存
此次是个人本地环境,不是腾讯云了
我也在学习中,演示的是本地测试环境的安装与配置,生产环境请参考分布式部署指南;
我这里是普通方式的安装,docker方式请参考Apollo Quick Start Docker部署
一、依次安装如下程序
Java 1.8+
Mysql 5.6.5+ (Apollo的表结构对timestamp
使用了多个default声明,因此须要5.6.5以上版本。)
GitBash (安装参考)
二、建立数据库
分别执行下面两个初始化的数据库sql:
执行完成咱们获得:
三、修改配置文件
修改刚刚下载项目apollo-build-scripts根目录下面的demo.sh
#!/bin/bash # apollo config db info apollo_config_db_url=jdbc:mysql://139.199.196.67:3306/ApolloConfigDB?characterEncoding=utf8 apollo_config_db_username=root apollo_config_db_password=password # apollo portal db info apollo_portal_db_url=jdbc:mysql://139.199.196.67:3306/ApolloPortalDB?characterEncoding=utf8 apollo_portal_db_username=root apollo_portal_db_password=password
四、启动
gitbash执行:
./demo.sh start
静候片刻,看到如下表示启动成功(不必定如出一辙):
注意检查数据库配置,确认无误后执行demo.sh,若是有报错多执行两次看看,由于我也有
“Config service failed to start in 120 seconds! Please check ./service/apollo-service.log for more information.”
这个报错,而后再次执行才启动成功的;
接着如提示访问 http://127.0.0.1:8070
ok,咱们登陆看看,默认帐号密码是:apollo/admin
咱们看到已经有一个SampleApp,做为配置参考了
根据提示,咱们再访问一下 8080 端口:
我知道 Eureka 是java那边比较喜欢用的服务注册中心,是一个跟consul差很少同样的东西,我也不太熟,先放着;
到这一步,Apollo咱们已经安装成功了;接下来咱们先参照SampleApp添加一个咱们本身的app,为.net core程序的与她的亲密接触作准备;
建立一个叫myDotnet
的项目
部门数据在ApolloPortalDB库ServerConfig表里配置
提交后咱们看到以下提示,什么是Namespace??擦 须要补课;
官方Apollo核心概念之Namespace已经讲得很清楚了。这里是个人理解,看看能不能归纳一下:
Namespace有三种类型(归类,给不一样的归类设置不一样的权限属性):
timeout=60;
,而后我本地能够配置的一个timeout=90;
覆盖公共配置这种情景;以下图所示,有三个应用:应用A、应用B、应用C。
//application Config appConfig = ConfigService.getAppConfig(); appConfig.getProperty("k1", null); // k1 = v11 appConfig.getProperty("k2", null); // k2 = v21 //NS-Private Config privateConfig = ConfigService.getConfig("NS-Private"); privateConfig.getProperty("k1", null); // k1 = v3 privateConfig.getProperty("k3", null); // k3 = v4 //NS-Public,覆盖公共类型配置的状况,k4被覆盖 Config publicConfig = ConfigService.getConfig("NS-Public"); publicConfig.getProperty("k4", null); // k4 = v6 cover publicConfig.getProperty("k6", null); // k6 = v6 publicConfig.getProperty("k7", null); // k7 = v7
//application Config appConfig = ConfigService.getAppConfig(); appConfig.getProperty("k1", null); // k1 = v12 appConfig.getProperty("k2", null); // k2 = null appConfig.getProperty("k3", null); // k3 = v32 //NS-Private,因为没有NS-Private Namespace 因此获取到default value Config privateConfig = ConfigService.getConfig("NS-Private"); privateConfig.getProperty("k1", "default value"); //NS-Public Config publicConfig = ConfigService.getConfig("NS-Public"); publicConfig.getProperty("k4", null); // k4 = v5 publicConfig.getProperty("k6", null); // k6 = v6 publicConfig.getProperty("k7", null); // k7 = v7
//application Config appConfig = ConfigService.getAppConfig(); appConfig.getProperty("k1", null); // k1 = v12 appConfig.getProperty("k2", null); // k2 = null appConfig.getProperty("k3", null); // k3 = v33 //NS-Private,因为没有NS-Private Namespace 因此获取到default value Config privateConfig = ConfigService.getConfig("NS-Private"); privateConfig.getProperty("k1", "default value"); //NS-Public,公共类型的Namespace,任何项目均可以获取到 Config publicConfig = ConfigService.getConfig("NS-Public"); publicConfig.getProperty("k4", null); // k4 = v5 publicConfig.getProperty("k6", null); // k6 = v6 publicConfig.getProperty("k7", null); // k7 = v7
仔细看完示例应该理解了,若是实在不了解,咱们后面用示例本身去体会;
咱们在上面的myDotnet
项目下面,分别添加一个Public类型的Namespace和一个Private类型的Namespace;
其中:
Hei.Public
:Public类型,存放Mongodb链接,Redis链接等几乎每一个程序都须要用到的公共配置;
Hei.Private
:Private类型,存放当前web应用程序须要使用的链接,好比title,keyword,description;
添加配置
红圈的地方,有提示Public类型的Namespace能被任何应用读取
添加完配置记得必定要点击发布,别问我怎么知道的。。。。
小tips:这些配置能够以文本形式,快速 批量添加的:
一、引用nuget包:Com.Ctrip.Framework.Apollo.Configuration
二、添加配置
修改appsetting.json,添加Apollo节点配置:
"apollo": { "AppId": "myDotnet", //这是咱们上面添加的Apollo里面的Appid "MetaServer": "http://127.0.0.1:8080" //Apollo配置服务器地址,注意这里是8080,不是admin的8070 }
三、修改Program.cs,修改成:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, builder) => { builder .AddApollo(builder.Build().GetSection("apollo")) .AddDefault() //默认的application Namespace .AddNamespace("TEST1.Hei.Public ") //public 类型的Namespace .AddNamespace("Hei.Private");//private 类型的Namespace }) .UseStartup<Startup>();
很是简单,咱们总共就修改了这3个地方,用起来也跟获取本地配置几乎无差;
来,咱们看看运行结果:
Public类型的:
Private类型的:
测试的时候能够随时在Apollo后台修改配置 发布后,刷新连接;能够看到,配置即时起效的。
其实也不是什么高级用法。。。
像什么回滚功能很容易理解;灰度发布,你们也能够试着用一下;
一、关联类型的Namespace
你们注意,咱们以前一直使用的应用都是:myDotnet
如今咱们再添加一个netcore
的应用,而且这个应用有一个Public的Namespace TEST2.Hei.Globa
注意这里的MongoDB 跟上面的
myDotnet
的配置的值不同了
而后,咱们给myDotnet
关联上这个 netcore
的TEST2.Hei.Globa
,就等于myDotnet
下面多了一个Namespace:
看到myDotnet
下面多了一个Namespace:
修改下Program.cs
而后咱们看看配置:
MongoDB:仍是以myDotnet
的为准。
MysqlVersion:
二、监听配置的变化
偷懒直接上代码:
private static void OnChanged(object sender, ConfigChangeEventArgs changeEvent) { Console.WriteLine("Changes for namespace {0}", changeEvent.Namespace); foreach (string key in changeEvent.ChangedKeys) { ConfigChange change = changeEvent.GetChange(key); Console.WriteLine("Change - key: {0}, oldValue: {1}, newValue: {2}, changeType: {3}", change.PropertyName, change.OldValue, change.NewValue, change.ChangeType); } } static void Main(string[] args) { Config config = ConfigService.GetAppConfig(); //config instance is singleton for each namespace and is never null config.ConfigChanged += OnChanged; while (true) { Thread.Sleep(500); var timeout = config.GetProperty("timeout", ""); Console.WriteLine(timeout); } }
这篇文章的目的,是但愿能给你们提供两点参考:Apollo是什么?Apollo能够作什么?
达到这两点也就差很少了;至于Apollo提供的更多功能你们能够慢慢体会,我也在学习当中。至于Apollo的性能、稳定性这些,Apollo目前已经有很多公司落地使用了,是社区里面很是热的产品,说这些问题,应该都已解决。最后,我也是学习当中,有写的不对的地方,你们指正,欢迎交流。