前言

这篇给大家带来apollo安装以及使用,部署方式是Mac上部署,linux也类似。

一、Apollo介绍

Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。

  • application (应用)
  • environment (环境)
  • cluster (集群)
  • namespace (命名空间)

1、工作流程

image.png

2、Apollo的总体设计

image.png

二、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对比来体现出
1853BE30BED6434D9DB61823F7B635B8.png

三、本地测试搭建及使用

1、准备工作

如果想手动打包快速入门安装包,就要参考如下步骤

  • 修改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的服务,需在确保端口未被占用的情况下执行脚本

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
修改配置时候只能是健值对方式