SpringCloud-配置中心 Config Apollo

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

本篇将搭建一套 Apollo 配置中心环境,并通过一个 demo 案例来演示如何在 SpringCloud 体系中使用 Apollo。

环境准备

类别
JDK 1.8.0_162
SOFABoot/SpringBoot 3.0.0/2.0.x.RELEASE
SpringCloud Finchley.RC1
IDE IDEA
Mysql 5.7.24
CentOS 7

Apollo 自身需要依赖 Mysql,在部署 Apollo 时需要提前安装 Mysql 数据库。关于 Mysql 的安装可以参考:Linux 下安装Mysql数据库

根据官方文档,Apollo 服务端需运行在 jdk 1.8 以上,客户端需运行在1.7 以上,Mysql 版本需在 5.6.5 版本以上。具体信息可参考:分布式部署指南

部署 Apollo

部署步骤共三步:

  • 创建数据库

    • Apollo 服务端依赖于 MySQL 数据库,所以需要事先创建并完成初始化
  • 获取安装包

    • Apollo 服务端安装包共有3个:apollo-configservice, apollo-adminservice, apollo-portal
    • 可以直接下载事先打好的安装包,也可以自己通过源码构建
  • 部署 Apollo 服务端

    • 获取安装包后就可以部署到公司的测试和生产环境了

创建数据库

Apollo 服务端共需要两个数据库:ApolloPortalDBApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了 sql 文件,只需要导入数据库即可。

需要注意的是 ApolloPortalDB 只需要在生产环境部署一个即可,而 ApolloConfigDB 需要在每个环境部署一套,如 fat、uat 和 pro 分别部署 3 套 ApolloConfigDB。

注意:如果本地已经创建过 Apollo 数据库,请注意备份数据;sql 文件会清空 Apollo 相关的表。

两份 SQL 文件:

下载下来之后可通过 Mysql 图形界面工具(如 Navicat )等进行导入。导入完成之后,可以进行如下验证。

portalDB 验证

执行 SQL:

1
select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;

查询结果:

Id Key Value Comment
1 apollo.portal.envs dev 可支持的环境列表

configDB 验证

执行 SQL:

1
select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;

执行结果:

Id Key Value Comment
1 eureka.service.url http://127.0.0.1:8080/eureka/ Eureka服务Url

本过程只针对新建工程,如果涉及到数据迁移,请参考 Apollo 官方文档

数据库部分完成之后,接下来就是部署 Apollo 的三个工程。

工程配置修改

Apollo 配置中心 使用需要启动三个工程:apollo-configservice、apollo-adminservice、apollo-portal。

在自己的服务器上新建一个目录 /thirdserver/apollo/ 将官方提供的安装包直接下载到这个目录下,然后解压得到如下列表:

image-20190107114836135

apollo-configservice 部署

Apollo 服务端需要知道如何连接到你前面创建的数据库,数据库连接串信息位于上一步下载的压缩包中的apollo-configservice-1.2.0-github/config/application-github.properties 中,这里把里面默认的数据库连接地址和账密信息替换成我们自己的就可以。这里使用的是 ApolloConfigDB 库。

1
2
3
4
# DataSource
spring.datasource.url = jdbc:mysql://${serverhost}:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = ${yourusername}
spring.datasource.password = ${yourpassword}

apollo-adminservice 配置文件修改

这里同样是修改 config/application-github.properties 下面的数据库连接信息。这里也使用的是 ApolloConfigDB 库。配置信息和上面一样。

apollo-portal 配置文件修改

  • portal 使用的是 ApolloPortalDB,修改数据库配置信息:

    1
    2
    3
    4
    # DataSource
    spring.datasource.url = jdbc:mysql://${serverhost}:3306/ApolloPortalDB?characterEncoding=utf8
    spring.datasource.username = ${yourusername}
    spring.datasource.password = ${yourpassword}
  • 修改 meta service 信息,Apollo Portal 需要在不同的环境访问不同的 meta service(apollo-configservice) 地址,所以我们需要在配置中提供这些信息。默认情况下,meta service 和 config service 是部署在同一个 JVM进程,所以 meta service 的地址就是 config service 的地址。配置文件 /config/apollo-env.properties

    1
    2
    3
    4
    5
    6
    7
    # ${serverhost} 是你当前机器的主机地址
    local.meta=http://localhost:8080
    dev.meta=http://${serverhost}:8080
    fat.meta=http://${serverhost}:8080
    uat.meta=http://${serverhost}:8080
    lpt.meta=http://${serverhost}:8080
    pro.meta=http://${serverhost}:8080

    这里是把所有环境配置成一样的了,如果没有不需要这些环境,可以删除掉。

工程部署

在每一个工程的解压包中,都有一个 scripts 文件夹,这里面是 Apollo 工程的启动脚本。三个工程分别先后启动:apollo-configservice、apollo-adminservice、apollo-portal,就是分别执行这三个工程下面的 /scripts/startup.sh 脚本即可,关闭执行的是 /scripts/shutdown.sh 脚本。

访问:http://${serverhost}:8070/

image-20190107133404554

可以看到配置中心管控端的界面。

新建工程

  • 点击 创建项目,填写一些基本信息,然后提交

image-20190107133541629

  • 新增一个配置项,填写基本信息,然后提交
    image-20190107133835832

  • 当前工程界面

image-20190107133936932

  • 发布配置

image-20190107134958570

SpringCloud 工程案例

新建 sofa-config-apollo 工程。

依赖

引入 apollo 客户端依赖及其他相关依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

配置文件

1
2
3
4
5
6
# 需要与前面 Apollo 中创建项目的appId保持一致
app.id=sofa-config-apollo
# 设置 apollo meta service 的地址,因为前面meta和config是部署在一起的,所以就是configService的地址
apollo.meta=http://${serverhost}:8080
# 配置项
sofa.alipay.glmapper.name=glmapper

资源类&启动类

启动类

启动类上需要开启对 apollo 的支持,使用 @EnableApolloConfig 注解标注

1
2
3
4
5
6
7
@SpringBootApplication
@EnableApolloConfig
public class SofaConfigApolloApplication {
public static void main(String[] args) {
SpringApplication.run(SofaConfigApolloApplication.class, args);
}
}

资源类

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class ApolloConfigController {
@ApolloConfig
private Config config;

@Value("${sofa.alipay.glmapper.name}")
private String name;

@RequestMapping("/apollo")
public String getConfig(){
return name;
}
}

注意,我在配置文件中指定的是 sofa.alipay.glmapper.name 值是 glmapper,而在配置中心配置的值是glmapper@leishu。同时这里也把 apollo 自己的这个 Config 配置类也注入进来,稍后看下这的对象的信息。

运行程序&验证

启动当前工程之前需要确保 Apollo 的相关服务已经起来了,然后运行当前应用。在浏览器中输入:

http://localhost:8080/config ,结果如下:

1
glmapper@leishu

可以看到这里拿到的是配置中心的配置值,覆盖了我们本地配置文件中的配置。断点看到 config 的信息:

image-20190107140226085

Config 对象就是当前集群环境下,指定 appId 的所有配置信息的集合。

更改配置&及时刷新

  • 更改配置

image-20190107142508567

  • 发布配置

image-20190107142537478

1
glmapper@leishu-update

这里没有重启服务,配置动态更新了

@ApolloConfigChangeListener 来监听配置变更

资源类 ApolloConfigController 中增加一个监听方法

1
2
3
4
@ApolloConfigChangeListener
private void onChange(ConfigChangeEvent changeEvent) {
System.out.println("发生变更了...");
}

然后重新在配置中心的界面上修改配置值:glmapper@leishu-update -> glmapper@leishu-update-event,然后发布。然后可以在控制台看到日志:

1
2
发生变更了...
2019-01-07 14:36:08.939 INFO 39072 --- [Apollo-Config-1] c.f.a.s.p.AutoUpdateConfigChangeListener : Auto update apollo changed value successfully, new value: glmapper@leishu-update-event, key: sofa.alipay.glmapper.name, beanName: apolloConfigController, field: com.alipay.sofa.cloud.controller.ApolloConfigController.name
作者

卫恒

发布于

2018-12-31

更新于

2022-04-23

许可协议

评论