Install-Package Com.Ctrip.Framework.Apollo.Configurationappsettings.json
"apollo": { "AppId": "SampleApp", "MetaServer": "http://11.0.10.235:8080", "Env": "DEV" }
AppId | 项目ID |
MetaServer | apollo服务发现的IP端口,注:不是后台管理的端口 |
Env |
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的初始数据库连接数