Apollo是攜程框架部門研發的分佈式配置中心,能夠集中化管理應用不同環境、不同集羣的配置,配置修改後能夠實時推送到應用端,並且具備規範的權限、流程治理等特性,適用於微服務配置管理場景。
安裝
以下yml依賴於同級目錄下的sql文件夾,可在Github下載
version: '2'
services:
apollo-quick-start:
image: nobodyiam/apollo-quick-start
container_name: apollo-quick-start
depends_on:
- apollo-db
ports:
- "8080:8080"
- "8070:8070"
links:
- apollo-db
apollo-db:
image: mysql:5.7
container_name: apollo-db
environment:
TZ: Asia/Shanghai
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
depends_on:
- apollo-dbdata
ports:
- "13306:3306"
volumes:
- ./sql:/docker-entrypoint-initdb.d
volumes_from:
- apollo-dbdata
apollo-dbdata:
image: alpine:latest
container_name: apollo-dbdata
volumes:
- /var/lib/mysql
更多部署方式參考部署文檔Quick Start
部署成功後,我們可以看到類似下圖:
我們可以在此處創建項目
配置
如下,我已經新增兩個主版本配置
還有一個灰度版本配置
更多特性,你可以訪問Apollo-Github查看
.NET中的使用
Apollo客戶端與服務端會有一個長連接以獲得服務端的配置更新推送,另外,爲了提高配置的可用性,客戶端提供了回退機制(定時拉拉取配置),客戶端還會把從服務端獲取到的配置在本地文件系統緩存一份以便在服務不可以時從本地恢復。
配置位置:
- Mac/Linux: /opt/data/{appId}/config-cache
- Windows: C:\opt\data{appId}\config-cache
官方已經爲我們提供了SDK,如果你對源碼感興趣,也可訪問apollo.net
如果你是在ASP.NET Core中使用,首先需要添加nuget包
Install-Package Com.Ctrip.Framework.Apollo.Configuration -Version 2.3.0
配置HostBuilder
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, builder) =>
{
builder.AddApollo(builder.Build().GetSection("apollo"))
.AddDefault();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
如果你希望Apollo輸出日誌(默認不會輸出),你可以進行如下配置
public static void Main(string[] args)
{
LogManager.UseConsoleLogging(Com.Ctrip.Framework.Apollo.Logging.LogLevel.Trace);
CreateHostBuilder(args).Build().Run();
}
添加Apollo配置項
如下,你可以爲開發環境,功能驗收測試環境,用戶驗收測試環境,生產環境配置不同的Apollo地址
{
"apollo": {
"AppId": "netapp1001",
"MetaServer": "http://localhost:8080/",
"ConfigServer": [ "http://106.54.227.205:8080/" ],
"Env": "Dev",
"Meta": {
"DEV": "http://localhost:8080/",
"FAT": "http://localhost:8080/",
"UAT": "http://localhost:8080/",
"PRO": "http://localhost:8080/"
}
}
}
另外,如果你在使用docker安裝時,無法獲取到配置值,你可以參考這個issues:使用倉庫中提供的ASP.NET Core程序,鏈接docker下部署的apollo服務獲取值爲null ,如果你嫌麻煩,可以直接拷貝以下配置到你的配置文件中即可:
{
"apollo": {
"ConfigServer": ["http://localhost:8080/"]
}
}
我們現在添加一個API來測試下配置獲取情況:
[Route("[controller]")]
[ApiController]
public class ApolloController : ControllerBase
{
private readonly IConfiguration Configuration;
public ApolloController(IConfiguration configuration)
{
Configuration = configuration;
}
public IActionResult Get(string key)
{
if (string.IsNullOrWhiteSpace(key))
return Ok("no key.");
var value = Configuration[key];
if (string.IsNullOrWhiteSpace(value))
return Ok("no value.");
return Ok($"{key}:{value}");
}
}
運行程序,如下圖,已成功獲取到request.timeout
的value。