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客戶端使用指南》