基于Linux搭建开源配置管理中心apollo

# 基于Linux搭建开源配置管理中心apollo

# 什么是apollo

Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

# 应用什么场景

项目在不同环境对应的配置不同

# Apollo优点

# 1.统一管理不同环境、不同集群的配置

Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。

同一份代码部署在不同的集群,可以有不同的配置,比如zk的地址等

通过命名空间(namespace)可以很方便的支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖

# 2.配置修改实时生效(热发布)

用户在 Apollo 修改完配置并发布后,客户端能实时(1 秒)接收到最新的配置,并通知到应用程序。

# 3.版本发布管理

所有的配置发布都有版本概念,从而可以方便地支持配置的回滚。

# 4.灰度发布

支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。

# 5.权限管理、发布审核、操作审计

应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。所有的操作都有审计日志,可以方便地追踪问题。

# 6.客户端配置信息监控

可以在界面上方便地看到配置在被哪些实例使用。

# 7.提供 Java 和.Net 原生客户端,同时提供HTTP接口

提供了 Java 和.Net 的原生客户端,方便应用集成,同时提供了 Http 接口,非 Java 和.Net 应用也可以方便地使用。

go、python、nodejs、PHP等开发语言也提供客户端使用的案例,参考地址 (opens new window)

# 8. 提供开放平台 API

Apollo 自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过 Apollo 出于通用性考虑,不会对配置的修改做过多限制,只要符合基本的格式就能保存,不会针对不同的配置值进行针对性的校验,如数据库用户名、密码,Redis 服务地址等。对于这类应用配置,Apollo 支持应用方通过开放平台 API 在 Apollo 进行配置的修改和发布,并且具备完善的授权和权限控制。

# 9.部署简单

配置中心作为基础服务,可用性要求非常高,这就要求 Apollo 对外部依赖尽可能地少,目前唯一的外部依赖是 MySQL,所以部署非常简单,只要安装好 Java 和 MySQL 就可以让 Apollo 跑起来。Apollo 还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数。

基于Linux搭建开源配置管理中心apollo

# 测试系统介绍

系统 Centos7
java环境 java1.8
数据库 MariaDB-10.2.9
IP 192.168.1.5

Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。

# java -version
openjdk version "1.8.0_302"
OpenJDK Runtime Environment (build 1.8.0_302-b08)
OpenJDK 64-Bit Server VM (build 25.302-b08, mixed mode)
# mysql -V
mysql  Ver 15.1 Distrib 10.2.9-MariaDB, for Linux (x86_64) using readline 5.1
1
2
3
4
5
6

# 安装apollo

# 下载Quick Start安装包

安装包共50M,如果访问github网速不给力的话,可以从百度网盘下载。

  1. 从GitHub下载

  2. 从百度网盘下载

  3. 为啥安装包要58M这么大?

    • 因为这是一个可以自启动的jar包,里面包含了所有依赖jar包以及一个内置的tomcat容器
cd /data/wwwroot/web/
git clone https://github.com/apolloconfig/apollo-build-scripts.git
由于网络原因下载比较慢

wget http://js.funet8.com/centos_software/apollo-build-scripts-master.zip
unzip apollo-build-scripts-master.zip
mv apollo-build-scripts-master apollo.chuanqu.ltd
cd apollo.chuanqu.ltd
1
2
3
4
5
6
7
8

# 创建数据库

# mysql -u root -h192.168.1.5 -P 3306 -p123456
# 导入数据 ApolloPortalDB
> source /data/wwwroot/web/apollo.chuanqu.ltd/sql/apolloportaldb.sql
# 验证
> select `Id`, `AppId`, `Name` from ApolloPortalDB.App;

# 导入 ApolloConfigDB
> source /data/wwwroot/web/apollo.chuanqu.ltd/sql/apolloconfigdb.sql

> select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;

1
2
3
4
5
6
7
8
9
10
11

# 配置数据库连接信息

Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。

注意:填入的用户需要具备对ApolloPortalDB和ApolloConfigDB数据的读写权限。

# vi demo.sh

#apollo config db info
apollo_config_db_url="jdbc:mysql://192.168.1.5:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
apollo_config_db_username=root
apollo_config_db_password=123456

# apollo portal db info
apollo_portal_db_url="jdbc:mysql://192.168.1.5:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
apollo_portal_db_username=root
apollo_portal_db_password=123456

1
2
3
4
5
6
7
8
9
10
11
12

# 执行启动脚本

./demo.sh start
1

显示

# ./demo.sh start
==== starting service ====
Service logging file is ./service/apollo-service.log
Application is running as root (UID 0). This is considered insecure.
Started [32028]
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
Application is running as root (UID 0). This is considered insecure.
Started [32251]
Waiting for portal startup....
Portal started. You can visit http://localhost:8070 now!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

访问8080端口

image-20220329181451424

访问 http://IP+8070

输入用户名apollo,密码admin后登录

image-20220329181552814

image-20220329181603822

# 运行客户端程序

运行./demo.sh client启动Demo客户端,忽略前面的调试信息,可以看到如下提示:

Apollo Config Demo. Please input key to get the value. Input quit to exit.
1

输入timeout,会看到如下信息:

> timeout
> [SimpleApolloConfigDemo] Loading key : timeout with value: 100
修改配置之后
> Changes for namespace application
Change - key: timeout, oldValue: 100, newValue: 250, changeType: MODIFIED
> timeout
Loading key : timeout with value: 250
1
2
3
4
5
6
7

# 配置nginx反向代理

域名:

apollo.chuanqu.ltd (接口)

apollo-houtai.chuanqu.ltd (后台)

server {
        listen       80;
        server_name  apollo-houtai.chuanqu.ltd;
        #root /data/wwwroot/web/;
        access_log /data/wwwroot/log/apollo.chuanqu.ltd-access.log main_aliyun;
        error_log off;

        location / {
                index index.php index.html;
                proxy_pass      http://192.168.1.5:8070;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }
}

server {
        listen       80;
        server_name  apollo.chuanqu.ltd;
        #root /data/wwwroot/web/;
        access_log /data/wwwroot/log/apollo.chuanqu.ltd-access.log main_aliyun;
        error_log off;

        location / {
                index index.php index.html;
                proxy_pass      http://192.168.1.5:8080;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }
}
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

# 使用新的项目

# 应用接入Apollo

这部分可以参考Java应用接入指南 https://www.apolloconfig.com/#/zh/usage/java-sdk-user-guide (opens new window)

# 运行客户端程序

由于使用了新的项目,所以客户端需要修改appId信息。

编辑client/META-INF/app.properties,修改app.id为你新创建的app id。

app.id=你的appId
1

运行./demo.sh client启动Demo客户端即可。

# 创建应用

设置appid为 1001,

image-20220330095536959

新增配置

设置,redis_ip和 value为192.168.1.12

image-20220330095647881

点击发布

image-20220330095756015

vim client/META-INF/app.properties
把app.id改成刚才新增的应用的ID
app.id=1001

运行客户端,输入对应key值,看是否能获取到value值。
./demo.sh client
Apollo Config Demo. Please input key to get the value. Input quit to exit.
> redis_ip
Loading key : redis_ip with value: 192.168.1.12
> redis_passwd
Loading key : redis_passwd with value: 123456

新增一个redis_port的KEY
> Changes for namespace application
Change - key: redis_port, oldValue: null, newValue: 6379, changeType: ADDED
> redis_port
Loading key : redis_port with value: 6379
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

基于Centos7搭建开源配置管理中心apollo,完成。

# 参考地址

官网文档 (opens new window)

分布式部署指南 (opens new window)

GitHub仓库 (opens new window)

Gitee仓库 (opens new window)

知乎:携程开源配置中心Apollo的设计与实现 (opens new window)

携程Apollo的PHP客户端 (opens new window)