Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持
3.1 演示环境(Demo)
3.2 项目配置
1、选择需要配置的环境
2、把项目的application*.properties 属性复制一份放到‘文本’进行发布,步骤如下图
注意:
Apollo客户端依赖于AppId,Apollo Meta Server等环境信息来工作,所以请确保阅读下面的说明并且做正确的配置:
4.1 客户端环境配置
4.1.1 文件server.properties存放路径
4.1.2 server.properties文件内容
apollo.meta: 表示从改apollo 服务端拉取配置的信息
env : 表示从apollo 服务端某个环境环境拉取配置
apollo.cacheDir:表示Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限。
Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data\{appId}\config-cache
4.2 系统配置
4.2.1 Maven依赖
com.ctrip.framework.apollo
apollo-client
1.2.0
需要1.2.0及其以上
4.2.2 启动类标签配置
@EnableApolloConfig
需要在application启动类上加上此注解才会生效。
4.2.3 Apollo读取AppId
AppId:应用的身份信息,每个应用必须唯一,是从服务端获取配置的一个重要信息
AppId配置
项目启动apollo会读取appId,去远端拉最新配置文件。AppId可以通过集中方式配置;
4.2.3.1可以通过Java的System Property 指定appId
例如:
4.2.3.2 Spring Boot application.properties指定appId
app.id=YOUR-APP-ID
该配置方式不适用于多个war包部署在同一个tomcat的使用场景
4.2.3.3 放在resource目录下的META-INF的app.properties
必须放在META-INF目录下,文件名为app.properties
例如:
4.2.4 日志配置
4.2.4.1项目日志配置
由于日志配置的加载顺序大于application.yml的配置,所以在读取apollo配置之前日志加载就完成了,需要把apollo的加载顺序提到日志之前就需要如下配置:
# will inject 'application' namespace in bootstrap phase |
Apollo 1.2.0及其以上的版本才支持该配置。
4.2.4.2 项目日志路径配置
logback.loghome = logPath
日志文件
server.tomcat.uri-encoding = UTF-8 server.tomcat.max-threads = 1000 server.tomcat.max-connections = 1500 server.tomcat.accesslog.enabled = true server.tomcat.accesslog.directory = /volume_logs server.tomcat.accesslog.file-date-format = .yyyyMMdd server.tomcat.accesslog.prefix = api-access.log server.tomcat.accesslog.suffix = server.tomcat.accesslog.pattern = [%{yyyy-MM-dd HH:mm:ss.SSS}t] %h %l %u "%r" %s %b server.tomcat.basedir = /volume_logs |
5.1通过Spring自带的@Value注解获取
5.2通过ConfigService.getAppConfig()
6.1 在项目A选择添加namespace
6.2 创建公用的namespace
6.3 在项目B 使用项目A 创建的公用namespace
需要在application.yml文件下配置
apollo: bootstrap: enabled: true namespaces: application,testApplication eagerLoad: enabled: true |
如果项目B引用了项目A的公用namespace ,若存在相同的key 项目B 则会覆盖项目A key的value。
Apollo Java客户端使用指南:
https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97#3213-spring-boot%E9%9B%86%E6%88%90%E6%96%B9%E5%BC%8F%E6%8E%A8%E8%8D%90