阿波羅是希臘神話中的光明之神、文藝之神,同時也是羅馬神話中的太陽神;他是光明之神,從不說謊,光明磊落,在其身上找不到黑暗,也被稱做真理之神。他很是聰明,通曉世事,是預言之神。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目前已經有很多公司落地使用了,是社區裏面很是熱的產品,說這些問題,應該都已解決。最後,我也是學習當中,有寫的不對的地方,你們指正,歡迎交流。