如果想将传统的config配置(如web.config)转成json配置,可以使用config2json工具
Apollo客户端依赖于AppId
,Environment
等环境信息来工作,所以请确保阅读下面的说明并且做正确的配置:
默认配置依赖于Microsoft.Extensions.Configuration包,文档和Demo使用Json作为配置源,自定义配置源请参考微软官方文档
1.2.0 指定到网络主机的最大连接数
由于Long Poll会占用连接数量,因此可能需要配置最大连接数
仅.NET Framework需要配置
AppId是应用的身份信息,是从服务端获取配置的一个重要信息。
请确保appsettings.json有AppID的配置,其中内容形如:
{
"apollo": {
"AppId": "SampleApp"
}
}
注:AppId是用来标识应用身份的唯一id,格式为string。
Apollo支持应用在不同的环境有不同的配置,所以Environment是另一个从服务器获取配置的重要信息。
请确保appsettings.json有Env的配置,其中内容形如:
{
"apollo": {
"Env": "PRO"
}
}
目前,env
支持以下几个值(大小写不敏感):
- DEV
- Development environment
- FAT
- Feature Acceptance Test environment
- UAT
- User Acceptance Test environment
- PRO
- Production environment
Apollo客户端针对不同的环境会从不同的服务器获取配置,所以请确保在appsettings.json正确配置了服务器地址(MetaServer,不需要配置Env),其中内容形如:
{
"apollo": {
"MetaServer": "http://生产环境域名:8080"
}
}
为了可以与Asp.net Core的环境配置文件想结合,比如可以在appsettings.Development.json中添加配置
{
"apollo": {
"MetaServer": "http://localhost:8080"
}
}
当然也可以支持将所有的环境对应的meta server地址配置
{
"apollo": {
"Meta": {
"DEV": "http://81.68.181.139:8080/",
"FAT": "http://81.68.181.139:8080/",
"UAT": "http://81.68.181.139:8080/",
"PRO": "http://81.68.181.139:8080/"
}
}
}
Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本地缓存路径位于C:\opt\data\{appId}\config-cache
,所以请确保C:\opt\data\
目录存在,且应用有读写权限。
Cluster(集群)
Apollo支持配置按照集群划分,也就是说对于一个appId和一个环境,对不同的集群可以有不同的配置。
如果需要使用这个功能,你可以通过以下方式来指定运行时的集群:
- 我们可以在appsettings.json文件中设置Cluster来指定运行时集群(注意大小写)
{
"apollo": {
"Cluster": "SomeCluster"
}
}
Cluster Precedence(集群顺序)
-
如果
Cluster
和DataCenter
同时指定:- 我们会首先尝试从
Cluster
指定的集群加载配置 - 如果没找到任何配置,会尝试从
DataCenter
指定的集群加载配置 - 如果还是没找到,会从默认的集群(
default
)加载
- 我们会首先尝试从
-
如果只指定了
Cluster
:- 我们会首先尝试从
Cluster
指定的集群加载配置 - 如果没找到,会从默认的集群(
default
)加载
- 我们会首先尝试从
-
如果只指定了
DataCenter
:- 我们会首先尝试从
DataCenter
指定的集群加载配置 - 如果没找到,会从默认的集群(
default
)加载
- 我们会首先尝试从
-
如果
Cluster
和DataCenter
都没有指定:- 我们会从默认的集群(
default
)加载配置
- 我们会从默认的集群(
内部使用namespace的后缀来判断namespace类型,比如application.json时,会使用json格式来解析数据,内部默认实现了json和xml两种格式,可覆盖,yml和yaml可使用Apollo.ConfigAdapter.Yaml包,其他格式需要自行实现。
- 实现IConfigAdapter或者继承ContentConfigAdapter
- 使用
ConfigAdapterRegister.AddAdapter
注册实现的类的实例(Properties不能被覆盖)
安装包Com.Ctrip.Framework.Apollo.Configuration
参考配置
{
"apollo": {
"AppId": "apollo.net",
"MetaServer": "http://localhost:8080/",
"Namespaces": [ "some namespace", "application.json", "application" ]
}
}
WebHost.CreateDefaultBuilder(args)
+ .ConfigureAppConfiguration(builder => builder
+ .AddApollo(builder.Build().GetSection("apollo")))
.UseStartup<Startup>()
WebHost.CreateDefaultBuilder(args)
+ .ConfigureAppConfiguration((cotnext, builder) => builder
+ .AddApollo(cotnext.Configuration.GetSection("apollo")))
.UseStartup<Startup>()
sdk已经完美支持Microsoft.Extensions.Configuration,请参考IOptionsMonitor或者ChangeToken)
apollo.net项目中有多个样例客户端的项目:
- Apollo.AspNetCore.Demo(使用环境变量配置)
- Apollo.Configuration.Demo(使用appsettings.json配置)
4.1 如何允许类似Sping的PlaceHolder功能
dotnet add package PW.Extensions.Configuration.Placeholder
WebHost.CreateDefaultBuilder(args)
+ .ConfigureAppConfiguration(builder =>
+ {
+ var apollo = builder.Build().GetSection("apollo").Get<ApolloOptions>();
+ apollo.HttpMessageHandler = new HttpClientHandler
+ {
+ UseProxy = true,
+ Proxy = new WebProxy(new Uri("http://代理地址"))
+ };
+
+ builder
+ .AddApollo(apollo)
+ .AddNamespace("RD.SharedConfiguration")
+ .AddDefault();
+ })
.UseStartup<Startup>()
用于解决apollo服务端部署在docker中时,不能在容器外面获取配置的问题。也可以直接指定IP或IP+Port
{
"apollo": {
+ "ConfigServer": ["http://81.68.181.139:8080/"]
}
}
配置对应的环境的Secret即可
{
"apollo": {
+ "Secret": "服务端配置的值"
}
}