携程Apollo配置中心初探

1. 背景

项目部署最头疼之一就是各种配置:

  • 一个项目往往会包含各式各样的配置信息,且不说数据库、redis、memcache这些常用的配置,还会有很多业务上的配置。
  • 线上、测试和开发环境配置各不一样,每个环境都要保存一份
  • 每次上线的时候,都要挨个check一下,
  • 更改某个配置,需要重新上线代码
  • ….

所以配置中心,在devops的开发中,是必不可少的,配置中心,也可以有效的避免,因为更改配置代码,导致的代码运行出错的风险。

2. Apollo

携程的Apollo配置中心,在业内算是比较有名的,github上面大概有8.5k的star。很多知名的公司也都在使用。至于实现的原理直接看github上面的wiki即可。

3. Do it

3.1 创建项目

3.1.1 克隆项目

3.1.2 按需更改docker-compose.yml
1
2
3
4
5
feilongdeMacBook-Pro:apollo2 feilong$ cd scripts/docker-quick-start/
feilongdeMacBook-Pro:docker-quick-start feilong$ ll
total 8
-rw-r--r-- 1 feilong wheel 663 Oct 27 14:56 docker-compose.yml
drwxr-xr-x 4 feilong wheel 128 Oct 27 14:56 sql

因为我不是java技术栈,所以以docker运行。
本地由于8080端口被占用,所以把端口改为8082

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# docker-compose.yml
version: '2'

services:
apollo-quick-start:
image: nobodyiam/apollo-quick-start
container_name: apollo-quick-start
depends_on:
- apollo-db
ports:
- "8082:8080"
- "8070:8070"
links:
- apollo-db

apollo-db:
image: mysql:5.7
container_name: apollo-db
environment:
TZ: Asia/Shanghai
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
depends_on:
- apollo-dbdata
ports:
- "13306:3306"
volumes:
- ./sql:/docker-entrypoint-initdb.d
volumes_from:
- apollo-dbdata

apollo-dbdata:
image: alpine:latest
container_name: apollo-dbdata
volumes:
- /var/lib/mysql
3.1.3 启动服务

通过docker-compose启动Apollo服务

1
2
3
4
5
6
feilongdeMacBook-Pro:docker-quick-start feilong$ docker-compose up -d
Creating network "docker-quick-start_default" with the default driver
Creating apollo-dbdata ... done
Creating apollo-db ... done
Creating apollo-quick-start ... done
feilongdeMacBook-Pro:docker-quick-start feilong$

访问地址 localhost:8070,如果启动失败的话,请参考 #1473 docker_quick_start 起不来

3.2 创建配置

Apollo内置了账号 apollo/admin,登录之后,可以看到有个默认的应用SampleApp

通过后台创建一个用于演示的redis的配置信息

创建结束后,点击“发布”按钮,发布最新的配置

3.3 运行测试

除了配置的server端,还要有接受配置的client端,我是PHP技术栈,所以就以PHP为主

3.3.1 初始化项目

配置php项目,通过composer引入Apollo的SDK

1
2
3
4
5
6
7
8
9
feilongdeMacBook-Pro:apollo feilong$ composer require multilinguals/apollo-client --ignore-platform-reqs
Using version ^0.1.1 for multilinguals/apollo-client
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing multilinguals/apollo-client (v0.1.1): Downloading (100%)
Writing lock file
Generating autoload files

新建一个pull.php,为了能够实时获取最新的配置,需要长时间运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
require_once 'vendor/autoload.php';

use Org\Multilinguals\Apollo\Client\ApolloClient;

// docker-compose里面配置的API服务的端口
$serverIp = '192.168.1.72:8082';
// 在Apollo的后台可以查到
$appId = 'SampleApp';
$namespaces = array('application');
$apollo = new ApolloClient($serverIp, $appId, $namespaces);
$apollo->save_dir = 'config';

$restart = true; //auto start if failed
do {
$error = $apollo->start();
if ($error) {
echo('error:'.$error."\n");
}
} while ($error && $restart);
3.3.2 运行项目

新建一个config的目录,运行pull.php文件,获取配置信息

新建一个窗口,查看下config文件夹下的文件

发现新建了一个配置文件,里面是相应的配置信息

后台做一些更新操作

发布配置,查看配置文件

4. 总结

通过配置中心,我们就不用在部署的时候,手动一直更改项目的配置文件,可以实现自动化,降低人为风险。

此外,Apollo是版本控制的,支持回滚操作,这样,就算是出现手误,也能及时回滚配置,及时生效。

feilong
2018.10.27