Apollo服务端搭建:
单机环境搭建:
注意事项:
- 编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息
#apollo config db info apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8 apollo_config_db_username=用户名 apollo_config_db_password=密码(如果没有密码,留空即可) # apollo portal db info apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8 apollo_portal_db_username=用户名 apollo_portal_db_password=密码(如果没有密码,留空即可)
- Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用
- 如果部署在非本机环境,修改localhost为部署机器的IP或域名
# meta server url config_server_url=http://localhost:8080 admin_server_url=http://localhost:8090 eureka_service_url=$config_server_url/eureka/ portal_url=http://localhost:8070
Quick Start只是用来帮助大家快速体验Apollo项目,具体实际使用时请参考:分布式部署指南。
另外需要注意的是Quick Start不支持增加环境,只有通过分布式部署才可以新增环境,同样请参考:分布式部署指南
分布式环境搭建:
注意事项:
分布式部署需要事先确定部署的环境以及部署方式。
Apollo目前支持以下环境:
- DEV
-
- 开发环境
- FAT
-
- 测试环境,相当于alpha环境(功能测试)
- UAT
-
- 集成环境,相当于beta环境(回归测试)
- PRO
-
- 生产环境
如果希望添加自定义的环境名称,具体步骤可以参考部署&开发遇到的常见问题#42-添加自定义的环境
以ctrip为例,我们的部署策略如下:
- Portal部署在生产环境的机房,通过它来直接管理FAT、UAT、PRO等环境的配置
- Meta Server、Config Service和Admin Service在每个环境都单独部署,使用独立的数据库
- Meta Server、Config Service和Admin Service在生产环境部署在两个机房,实现双活
- Meta Server和Config Service部署在同一个JVM进程内,Admin Service部署在同一台服务器的另一个JVM进程内
Apollo客户端
我们客户端基于Spring Boot 2.0搭建,开发工具是InteIIij IDEA
1.1 环境要求
- Java: 1.7+
- Guava: 15.0+
-
- Apollo客户端默认会引用Guava 19,如果你的项目引用了其它版本,请确保版本号大于等于15.0
注:对于Apollo客户端,如果有需要的话,可以做少量代码修改来降级到Java 1.6,详细信息可以参考Issue 483
1.2 必选设置
Apollo客户端依赖于AppId
,Apollo Meta Server
等环境信息来工作,所以请确保阅读下面的说明并且做正确的配置:
1.2.1 AppId
AppId是应用的身份信息,是从服务端获取配置的一个重要信息。
这里主要介绍常用的 application.properties 和 app.properties方式
- Spring Boot application.properties
Apollo 1.0.0+支持通过Spring Boot的application.properties文件配置,如
app.id=YOUR-APP-ID
该配置方式不适用于多个war包部署在同一个tomcat的使用场景
- app.properties
确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:
app.id=YOUR-APP-ID
文件位置参考如下:
注:app.id是用来标识应用身份的唯一id,格式为string。
1.2.2 Apollo Meta Server
Apollo支持应用在不同的环境有不同的配置,所以需要在运行提供给Apollo客户端当前环境的Apollo Meta Server信息。默认情况下,meta server和config service是部署在同一个JVM进程,所以meta server的地址就是config service的地址。
- 通过
apollo-env.properties
文件
-
- 用户也可以创建一个
apollo-env.properties
,放在程序的classpath下,或者放在spring boot应用的config目录下 - 使用该配置方式,那么就必须要正确配置Environment,详见1.2.2.1 Environment
- 文件内容形如:
- 用户也可以创建一个
dev.meta=http://1.1.1.1:8080 fat.meta=http://apollo.fat.xxx.com uat.meta=http://apollo.uat.xxx.com pro.meta=http://apollo.xxx.com
1.2.2.1 Environment
Environment可以通过以下3种方式的任意一个配置:
- 通过Java System Property(推荐)
-
- 可以通过Java的System Property
env
来指定环境 - 在Java程序启动脚本中,可以指定
-Denv=YOUR-ENVIRONMENT
- 可以通过Java的System Property
-
-
- 如果是运行jar文件,需要注意格式是
java -Denv=YOUR-ENVIRONMENT -jar xxx.jar
- 如果是运行jar文件,需要注意格式是
-
-
- 注意key为全小写
- 例如:–Denv=pro –Dpro_meta=http://api-beta.digitalworkplace.cn/configcenter
- Tomcat启动方式(推荐)
在startup.sh 或者catalina.sh中加入 JAVA_OPTS=”xxxx” 例如: JAVA_OPTS=”–Denv=pro –Dpro_meta=http://api-cloudlink.digitalworkplace.cn/configcenter” 注意:具体的OPTS参数示环境而定
- 通过配置文件
-
- 最后一个推荐的方式是通过配置文件来指定
env=YOUR-ENVIRONMENT
- 对于Mac/Linux,文件位置为
/opt/settings/server.properties
- 对于Windows,文件位置为
C:\opt\settings\server.properties
- 最后一个推荐的方式是通过配置文件来指定
文件内容形如:
env=DEV
目前,env
支持以下几个值(大小写不敏感):
- DEV
- Development environment
- FAT
- Feature Acceptance Test environment
- UAT
- User Acceptance Test environment
- PRO
- Production environment
Apollo 1.0.0版本开始支持以下方式配置apollo meta server信息
- 通过Java System Property
apollo.meta
-
- 可以通过Java的System Property
apollo.meta
来指定 - 在Java程序启动脚本中,可以指定
-Dapollo.meta=http://config-service-url
- 可以通过Java的System Property
-
-
- 如果是运行jar文件,需要注意格式是
java -Dapollo.meta=http://config-service-url -jar xxx.jar
- 如果是运行jar文件,需要注意格式是
-
-
- 也可以通过程序指定,如
System.setProperty("apollo.meta", "http://config-service-url");
- 也可以通过程序指定,如
- 通过Spring Boot的配置文件
-
- 可以在Spring Boot的
application.properties
或bootstrap.properties
中指定apollo.meta=http://config-service-url
- 该配置方式不适用于多个war包部署在同一个tomcat的使用场景
- 可以在Spring Boot的
- 通过
server.properties
配置文件
-
- 可以在
server.properties
配置文件中指定apollo.meta=http://config-service-url
- 对于Mac/Linux,文件位置为
/opt/settings/server.properties
- 对于Windows,文件位置为
C:\opt\settings\server.properties
- 可以在
- 通过
app.properties
配置文件
-
- 可以在
classpath:/META-INF/app.properties
指定apollo.meta=http://config-service-url
- 可以在
如果通过以上各种手段都无法获取到Meta Server地址,Apollo最终会fallback到
http://apollo.meta
作为Meta Server地
1.2.3 本地缓存路径
Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本地缓存路径默认位于以下路径,所以请确保/opt/data
或C:\opt\data\
目录存在,且应用有读写权限。
- Mac/Linux: /opt/data/{ appId}/config-cache
- Windows: C:\opt\data\{ appId}\config-cache
本地配置文件会以下面的文件名格式放置于本地缓存路径下:
{appId}+{cluster}+{namespace}.properties
- appId就是应用自己的appId,如100004458
- cluster就是应用使用的集群,一般在本地模式下没有做过配置的话,就是default
- namespace就是应用使用的配置namespace,一般是application
文件内容以properties格式存储,比如如果有两个key,一个是request.timeout,另一个是batch,那么文件内容就是如下格式:
request.timeout=2000
batch=2000
1.3 引入Maven Dependency
Apollo的客户端jar包,从1.0.0后已经上传到中央仓库,之前版本需要手动install到本地仓库
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>0.10.0</version> </dependency> <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-core</artifactId> <version>0.10.0</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency>
1.4 开启Apollo客户端
SpringBoot 在项目的启动类上添加
@EnableApolloConfig
注解注意:项目启动时需要指定Environment ,参考:1.2.2.1 Environment
Apollo 1.0.0版本开始支持配置apollo meta server信息
我们可以直接将AppId和Apollo Meta Server,配置在application.properties中
# 应用ID(在Apollo服务端新增项目添加的应用ID) app.id=testclient # apollo-configservice地址 apollo.meta=http://127.0.0.1:8080
1.5 应用中获取配置信息的几种方式
1.5.1.通过@value注解获取配置值
例如:
@Value(“${test}”)
private String test;
1.5.2.通过@ConfigurationProperties注入到bean对象中获取配置信息
例如:
@ConfigurationProperties(prefix=”test”)
Public class Myprop{undefined
private Map<String,String> prop = Maps.newLinkedHashMap();
}
在被spring管理的类中使用:
@Autowired
private Myprop myprop;
prop.getProp().get(“name”);
注:使用这种方式获取的属性值不会实时更新。
1.5.3.通过@ApolloConfig获取注入的config对象,再通过config对象获取属性值
例如:
在被spring管理的类中使用:
@ApolloConfig
private Config config;
config.getProperty(“name”,null);
1.5.4.通过java API的方式获取
Config config = ConfigService.getAppConfig();
String someKey = "someKeyFromDefaultNamespace";
String someDefaultValue = "someDefaultValueForTheKey";
String value = config.getProperty(someKey, someDefaultValue);
1.5.5.在配置文件中获取属性值
例如:在application.properties中,
spring.datasource.name=${jdbc.name}
spring.datasource.password=${jdbc.password}