Tip: 此篇已加入.NET Core微服務基礎系列文章索引html
在微服務架構環境中,項目中配置文件比較繁雜,並且不一樣環境的不一樣配置修改相對頻繁,每次發佈都須要對應修改配置,若是配置出現錯誤,須要從新打包發佈,時間成本較高,所以須要作統一的配置中心,能作到自動更新配置文件信息,解決以上問題。java
Apollo(阿波羅)是攜程框架部門研發的配置管理平臺,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性。其服務端基於Spring Boot和Spring Cloud開發,打包後能夠直接運行,不須要額外安裝Tomcat等應用容器。mysql
Apollo目前在國內開發者社區比較熱,在Github上有超過5k顆星,在國內衆多互聯網公司有落地案例,能夠說Apollo是目前配置中心產品領域No.1的產品,其成熟度和企業級特性要遠遠強於Spring Cloud體系中的Spring Cloud Config產品。git
目前有針對Java和.Net的兩個客戶端供使用:程序員
Java客戶端不依賴任何框架,可以運行於全部Java運行時環境,同時對Spring/Spring Boot環境也有額外支持。github
.Net客戶端不依賴任何框架,可以運行於全部.Net運行時環境。sql
更多Apollo介紹請瀏覽 Apollo配置中心介紹數據庫
Apollo GitHub中提供了一個讓咱們快速上手的Quick Start,幫助咱們快速在本地環境部署,啓動Apollo配置中心。這裏主要集中於針對開發環境的本地部署(單機環境),要部署到生產環境,請參考 Apollo分佈式部署指南。json
這裏我使用的是Windows Server的虛擬機在本機搭的,固然你能夠在你的Linux虛擬機中搭建,另外你也能夠經過Docker更快捷地部署Apollo。windows
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架構分析》,這裏不是本文的重點]
Step1.建立一個新項目(這裏部門能夠本身在數據中編輯serverconfig表添加)
Step2.默認狀況下,建立新項目後有一個默認的application的Namespace,咱們刪除它,而後從新建立咱們要用到的配置。對於通常共用的數據庫、Redis、RabbitMQ等配置,咱們通常會將其放到一個Public的配置列表中,而每一個項目中私有的配置信息(如Swagger文檔的說明信息)咱們會單首創建一個Private的配置列表給每一個項目。
下圖爲建立一個共享的配置列表(在Apollo中稱爲Namespace,詳細內容能夠參考:Apollo核心概念之Namespace)
Step3.向Shared和ClientService兩個Namespace中添加Key/Value配置項(能夠經過文本形式添加,速度更快),添加以後記得點擊發布,最終結果以下圖所示:
[經過文本形式添加以下圖所示,當批量添加時建議採用文本形式提升效率]
如今配置都有了,開始和咱們的ASP.Net Core集成吧。
導入.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" }
這裏主要會在啓動時讀取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就能夠了。
對於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客戶端使用指南》