引用nuget包
Install-Package Com.Ctrip.Framework.Apollo.Configuration
appsettings.json
"apollo": {
"AppId": "SampleApp",
"MetaServer": "http://11.0.10.235:8080",
"Env": "DEV"
}
AppId
|
项目ID
|
MetaServer
|
apollo服务发现的IP端口,注:不是后台管理的端口
|
Env
|
Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
//已弃用
//Com.Ctrip.Framework.Apollo.Logging.LogManager.Provider = new ConsoleLoggerProvider(LogLevel.Trace);
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
//注入配置
//把阿波罗的日志级别调整为最低
LogManager.UseConsoleLogging(Com.Ctrip.Framework.Apollo.Logging.LogLevel.Trace);
config.AddApollo(config.Build().GetSection("apollo"))
.AddDefault(Com.Ctrip.Framework.Apollo.Enums.ConfigFileFormat.Properties); //添加默认application Namespace
})
.UseKestrel()
.UseIISIntegration()
.UseUrls("http://*:9001")
.UseStartup<Startup>();
}
ValuesController.cs
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly IConfiguration _configuration;
public ValuesController(IConfiguration configuration)
{
_configuration = configuration;
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
var appName = _configuration["timeout"];
return new string[] { "value1", "value2", appName };
}
}
OK, 集成很简单的,直接运行查看结果
果然没那么顺利。
添加日志
LogManager.UseConsoleLogging(Com.Ctrip.Framework.Apollo.Logging.LogLevel.Trace);
可以看到,客户端是从Docker的内部地址去获取数据,这个IP 应该是从Apollo的服务发现工具Eureka获取的IP。
查看官方文档分布式部署中有解决方案
分布式部署的时候,apollo-configservice和apollo-adminservice需要把自己的IP和端口注册到Meta Server(apollo-configservice本身)。
Apollo客户端和Portal会从Meta Server获取服务的地址(IP+端口),然后通过服务地址直接访问。
所以如果实际部署的机器有多块网卡(如docker),或者存在某些网卡的IP是Apollo客户端和Portal无法访问的(如网络安全限制),那么我们就需要在apollo-configservice和apollo-adminservice中做相关限制以避免Eureka将这些网卡的IP注册到Meta Server。
具体文档可以参考Ignore Network Interfaces章节。具体而言,就是分别编辑apollo-configservice/src/main/resources/application.yml和apollo-adminservice/src/main/resources/application.yml,然后把需要忽略的网卡加进去。
如下面这个例子就是对于apollo-configservice,把docker0和veth.*的网卡在注册到Eureka时忽略掉。
spring:
application:
name: apollo-configservice
profiles:
active: ${apollo_profile}
cloud:
inetutils:
ignoredInterfaces:
- docker0
- veth.*
注意,对于application.yml修改时要小心,千万不要把其它信息改错了,如spring.application.name等。
另外一种方式是直接指定要注册的IP,可以修改startup.sh,通过JVM System Property在运行时传入,如-Deureka.instance.ip-address=${指定的IP},或者也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,加入以下配置
eureka:
instance:
ip-address: ${指定的IP}
最后一种方式是直接指定要注册的IP+PORT,可以修改startup.sh,通过JVM System Property在运行时传入,如-Deureka.instance.homePageUrl=http://${指定的IP}:${指定的Port},或者也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,加入以下配置
eureka:
instance:
homePageUrl: http://${指定的IP}:${指定的Port}
preferIpAddress: false
做完上述修改并重启后,可以查看Eureka页面(http://${config-service-url:port})检查注册上来的IP信息是否正确。
如果Apollo部署在公有云上,本地开发环境无法连接,但又需要做开发测试的话,客户端可以升级到0.11.0版本及以上,然后通过-Dapollo.configService=http://config-service的公网IP:端口来跳过meta service的服务发现
我这里直接选用的第二种方式也就是修改Deureka.instance.ip-address为指定的IP
首先修改Compose文件,将8090端口也暴露出来,然后重新运行compose文件
进入容器
docker exec it ${容器Id} /bin/bash
进入到执行路径,并修改demo.sh,在106行 JAVA_OPTS 后面字符串中加入-Deureka.instance.ip-address=${指定的IP}
cd apollo-quick-start vi demo.sh
退出容器并重启容器。
重启容器后要等上一段时间,后台管理才可以访问,然后进入后台管理查看具体项目会报错,应该是服务没启动完全,再等一会儿就OK了。
OK,重新运行程序,并在浏览器中访问
https://localhost:9001/api/Values,可以看到已经获取到配置值
- application (应用)
- 这个很好理解,就是实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置
- 每个应用都需要有唯一的身份标识 -- appId,我们认为应用身份是跟着代码走的,所以需要在代码中配置,具体信息请参见Java客户端使用指南。
- environment (环境)
- 配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置
- 我们认为环境和代码无关,同一份代码部署在不同的环境就应该能够获取到不同环境的配置
- 所以环境默认是通过读取机器上的配置(server.properties中的env属性)指定的,不过为了开发方便,我们也支持运行时通过System Property等指定,具体信息请参见Java客户端使用指南。
- cluster (集群)
- 一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
- 对不同的cluster,同一个配置可以有不一样的值,如zookeeper地址。
- 集群默认是通过读取机器上的配置(server.properties中的idc属性)指定的,不过也支持运行时通过System Property指定,具体信息请参见Java客户端使用指南。
- namespace (命名空间)
- 一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等
- 应用可以直接读取到公共组件的配置namespace,如DAL,RPC等
- 应用也可以通过继承公共组件的配置namespace来对公共组件的配置做调整,如DAL的初始数据库连接数