前言
这篇给大家带来apollo安装以及使用,部署方式是Mac上部署,linux也类似。
一、Apollo介绍
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
- application (应用)
- environment (环境)
- cluster (集群)
- namespace (命名空间)
1、工作流程
2、Apollo的总体设计
二、Apollo的优势
正是基于配置的特殊性,所以Apollo从设计之初就立志于成为一个有治理能力的配置发布平台,目前提供了以下的特性:
- 1、统一管理不同环境、不同集群的配置
- 2、Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。
- 3、同一份代码部署在不同的集群,可以有不同的配置,比如zookeeper的地址等
- 4、通过命名空间(namespace)可以很方便地支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖
- 5、配置修改实时生效(热发布)
- 6、版本发布管理
- 7、所有的配置发布都有版本概念,从而可以方便地支持配置的回滚
- 8、灰度发布(比如点了发布后,只对部分应用实例生效,稍后再推给所有应用实例)
- 9、权限管理、发布审核、操作审计
- 10、客户端配置信息监控
- 11、可以在界面上方便地看到配置在被哪些实例使用
- 12、提供Java和.Net原生客户端
- 13、提供开放平台API
- 14、部署简单
Apollo的优势还可以通过与Spring Cloud Config对比来体现出
三、本地测试搭建及使用
1、准备工作
- Java 1.8+
- Mysql 5.6.5+
Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。 - apollo Quick Start安装包
- 1、 从Github下载
由于Quick Start项目比较大,所以放在了另外的repository,请注意项目地址:https://github.com/nobodyiam/apollo-build-scripts - 2、 从百度网盘下载
https://pan.baidu.com/share/init?surl=Ieelw6y3adECgktO0ea0Gg
密码:9wwe
- 1、 从Github下载
如果想手动打包快速入门安装包,就要参考如下步骤
- 修改apollo-configservice,apollo-adminservice和apollo-portal的pom.xml,注释掉spring-boot-maven-plugin和maven-assembly-plugin
- 在根目录下执行mvn clean package -pl apollo-assembly -am -DskipTests=true
- 复制apollo-assembly / target下的jar包,重命名为apollo-all-in-one.jar
2、安装步骤
2.1 创建数据库
解压下载的包,里面包含两个数据库文件,在你准备的数据库创建文件名一样的两个数据库,分别是ApolloPortalDB和ApolloConfigDB,再导入表即可
2.2 配置数据库连接信息
编辑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=密码(如果没有密码,留空即可)
3、启动Apollo配置中心
Apollo的quick start脚本会在本地启动三个端口分别为8070、8080、8090的服务,需在确保端口未被占用的情况下执行脚本
- http://localhost:8070 Portal客户端的服务
- http://localhost:8080 ConfigService、MetaServer、Eureka服务
- http://localhost:8090 可能是AdminService服务
3.1、异常排查
开启命令
./demo.sh start
关闭命令
./demo.sh stop
当看到如下输出后,就说明启动成功了!
==== starting service ====
Service logging file is ./service/apollo-service.log
Started [10768]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [10846]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!
3.1、异常排查
如果启动遇到了异常,可以分别查看service和portal目录下的log文件排查问题。
Config service failed to start in 120 seconds! Please check ./service/apollo-service.log for more information.
修改demo.sh文件
declare -i max_counter=24 # 245=120s
改为
declare -i max_counter=120 # 1205=600s
4、使用Apollo配置中心
4.1、服务端使用
通过访问http://localhost:8070/可访问web页面的服务端。
初始账号/密码为:admin/apollo
具体使用指南可参考官网.
该服务端只是用来初步体验和测试使用。
5、Apollo的客户端及Spring Boot的集成方式
Apollo支持基于Spring Boot、基于Java、基于XML等等多种方式的配置,具体详情可参考官网
Apollo会在本地存一份缓存配置文件
- Mac/Linux上文件位置为/opt/data//config-cache
- Windows上文件位置为C:\opt\data\config-cache
- 本地配置文件会以++.properties的文件名和格式存储,当获取不到网络配置时会从这个配置中取值
5.1、加入依赖
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
5.2、在服务应用的配置中加入以下配置
app:
id: test-app # 在服务端web页面上创建的项目APP的id
apollo:
meta: http://localhost:8080 # apollo服务端的地址
#cluster: myCluster # 要配置的集群名称,如果没有可不填
#cacheDir: /opt/testDir # 自定义缓存路径(上面的缓存地址)
bootstrap:
enable: true # 是否在工程启动的bootstrap阶段向Spring容器注入被托管的namespaces中的配置
namespaces: application # 要使用的namespaces,可在web页面上看到
env: DEV # DEV、FAT、UAT、PRO
5.3、在启动Spring Boot的java文件中添加注解:@EnableApolloConfig
5.4、使用
- 通过@Value注解即可获取到值
- 使用xml整合Spring
- 可以以类的方式作为bean加载入Spring(推荐)
1). 注入默认namespace的配置到Spring中
//这个是最简单的配置形式,一般应用用这种形式就可以了,用来指示Apollo注入application namespace的配置到Spring环境中
@Configuration
@EnableApolloConfig
public class AppConfig {
@Bean
public TestJavaConfigBean javaConfigBean() {
return new TestJavaConfigBean();
}
}
2). 注入多个namespace的配置到Spring中
@Configuration
@EnableApolloConfig
public class SomeAppConfig {
@Bean
public TestJavaConfigBean javaConfigBean() {
return new TestJavaConfigBean();
}
}
//这个是稍微复杂一些的配置形式,指示Apollo注入FX.apollo和FX.soa namespace的配置到Spring环境中
@Configuration
@EnableApolloConfig({"FX.apollo", "FX.soa"})
public class AnotherAppConfig {}
3). 注入多个namespace,并且指定顺序
//这个是最复杂的配置形式,指示Apollo注入FX.apollo和FX.soa namespace的配置到Spring环境中,并且顺序在application前面
@Configuration
@EnableApolloConfig(order = 2)
public class SomeAppConfig {
@Bean
public TestJavaConfigBean javaConfigBean() {
return new TestJavaConfigBean();
}
}
@Configuration
@EnableApolloConfig(value = {"FX.apollo", "FX.soa"}, order = 1)
public class AnotherAppConfig {}
4). Java Config使用方式
public class TestJavaConfigBean {
@Value("${timeout:100}")
private int timeout;
private int batch;
@Value("${batch:200}")
public void setBatch(int batch) {
this.batch = batch;
}
public int getTimeout() {
return timeout;
}
public int getBatch() {
return batch;
}
}
@Configuration
@EnableApolloConfig
public class AppConfig {
@Bean
public TestJavaConfigBean javaConfigBean() {
return new TestJavaConfigBean();
}
}
- ConfigurationProperties使用方式
@ConfigurationProperties(prefix = "redis.cache")
public class SampleRedisConfig {
private int expireSeconds;
private int commandTimeout;
public void setExpireSeconds(int expireSeconds) {
this.expireSeconds = expireSeconds;
}
public void setCommandTimeout(int commandTimeout) {
this.commandTimeout = commandTimeout;
}
}
@Configuration
@EnableApolloConfig
public class AppConfig {
@Bean
public SampleRedisConfig sampleRedisConfig() {
return new SampleRedisConfig();
}
}
5). Spring Annotation支持
public class TestApolloAnnotationBean {
@ApolloConfig
private Config config; //inject config for namespace application
@ApolloConfig("application")
private Config anotherConfig; //inject config for namespace application
@ApolloConfig("FX.apollo")
private Config yetAnotherConfig; //inject config for namespace FX.apollo
@Value("${batch:100}")
private int batch;
//config change listener for namespace application
@ApolloConfigChangeListener
private void someOnChange(ConfigChangeEvent changeEvent) {
//update injected value of batch if it is changed in Apollo
if (changeEvent.isChanged("batch")) {
batch = config.getIntProperty("batch", 100);
}
}
//config change listener for namespace application
@ApolloConfigChangeListener("application")
private void anotherOnChange(ConfigChangeEvent changeEvent) {
//do something
}
//config change listener for namespaces application and FX.apollo
@ApolloConfigChangeListener({"application", "FX.apollo"})
private void yetAnotherOnChange(ConfigChangeEvent changeEvent) {
//do something
}
//example of getting config from Apollo directly
//this will always return the latest value of timeout
public int getTimeout() {
return config.getIntProperty("timeout", 200);
}
//example of getting config from injected value
//the program needs to update the injected value when batch is changed in Apollo using @ApolloConfigChangeListener shown above
public int getBatch() {
return this.batch;
}
}
爬坑
- 报错1、 http:// localhost:8070/apps/SampleApp/envs/DEV/clusters/default/namespaces/application/items 400
修改配置时候只能是健值对方式