Apollo搭建与配置中心竞品分析

简介

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

配置中心同类竞品对比

目前市面上用的比较多的配置中心有:(按开源时间排序)

  1. Disconf

2014年7月百度开源的配置管理中心,专注于各种「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」。目前已经不再维护更新。

  1. Spring Cloud Config

2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。

  1. Apollo

2016年5月,携程开源的配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

  1. Nacos

2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。

功能点 SpCloudConfig Apollo Nacos
配置实时推送 支持(Spring Cloud Bus) 支持(HTTP长轮询1s内) 支持(HTTP长轮询1s内)
版本管理 支持(Git) 支持 支持
配置回滚 支持(Git) 支持 支持
灰度发布 支持 支持 不支持
权限管理 支持(依赖git) 支持 不支持
多集群 支持 支持 支持
多环境 支持 支持 支持
监听查询 支持 支持 支持
多语言 只支持Java 主流语言,提供了Open API 主流语言,提供了Open API
配置校验 不支持 支持 支持
单机读(QPS) 7(限流所致) 9000 15000
单击写(QPS) 5(限流所致) 1100 1800
3节点读(QPS) 21(限流所致) 27000 45000
3节点写(QPS) 5限流所致 3300 5600

竞品总结

总的来看,Apollo和Nacos相对于Spring Cloud Config的生态支持更广,在配置管理流程上做的更好。Apollo相对于Nacos在配置管理做的更加全面,Nacos则使用起来相对比较简洁,在对性能要求比较高的大规模场景更适合。但对于一个开源项目的选型,项目上的人力投入(迭代进度、文档的完整性)、社区的活跃度(issue的数量和解决速度、Contributor数量、社群的交流频次等),这些因素也比较关键,考虑到Nacos开源时间不长和社区活跃度,所以从目前来看Apollo应该是最合适的配置中心选型

一、准备工作

1.1 Java

Apollo服务端:1.8+
Apollo客户端:1.7+
由于Quick Start会在本地同时启动服务端和客户端,所以需要在本地安装Java 1.8+。
方便部署的rpm包云盘链接https://pan.baidu.com/s/1mGPlsptlYtqXmL-htdpRdg
提取码:1qep
在配置好后,可以通过如下命令检查:

[root@apollo ~ ] # java -version
样例输出:
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

Windows用户请确保JAVA_HOME环境变量已经设置。

1.2 MySQL

版本要求:5.6.5+
Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。

连接上MySQL后,可以通过如下命令检查:

SHOW VARIABLES WHERE Variable_name = 'version';
Variable_name Value
version 5.7.11

注:MySQL5728安装文档可以查看本人其他文档

1.3 下载Quick Start安装包

我们准备好了一个Quick Start安装包,大家只需要下载到本地,就可以直接使用,免去了编译、打包过程。

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

从Github下载
checkout或下载apollo-build-scripts项目
由于Quick Start项目比较大,所以放在了另外的repository,请注意项目地址
https://github.com/nobodyiam/apollo-build-scripts

在这里插入图片描述
从百度网盘下载
通过网盘链接下载,提取码: 9wwe
下载到本地后,在本地解压apollo-quick-start.zip

  • 为啥安装包要58M这么大?
    因为这是一个可以自启动的jar包,里面包含了所有依赖jar包以及一个内置的tomcat容器

1.3.1 手动打包Quick Start安装包

Quick Start只针对本地测试使用,所以一般用户不需要自己下载源码打包,只需要下载已经打好的包即可。不过也有部分用户希望在修改代码后重新打包,那么可以参考如下步骤:

修改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包,rename为apollo-all-in-one.jar

二、安装步骤

2.1 创建数据库

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

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

2.1.1 创建ApolloPortalDB

通过各种MySQL客户端导入sql目录下的apolloportaldb.sql即可。

  • 创库语句
grant select,insert,update,delete on ApolloConfigDB .* to gx@'%' identified by '123';
grant select,insert,update,delete on ApolloPortalDB .* to gx@'%' identified by '123';
show databases;

下面以MySQL原生客户端为例:

source /your_local_path/sql/apolloportaldb.sql
导入成功后,可以通过执行以下sql语句来验证:

#进入目录
[root@apollo ~ ] #  cd apollo-build-scripts-master/sql
##打开数据库
mysql> source apolloportaldb.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)....

# 查询语句
mysql> select `Id`, `AppId`, `Name` from ApolloPortalDB.App;
查询 ApolloPortalDB库下App表的Id	AppId	Name
# 结果
+----+-----------+------------+
| Id | AppId     | Name       |
+----+-----------+------------+
|  1 | SampleApp | Sample App |
+----+-----------+------------+

2.1.2 创建ApolloConfigDB

通过各种MySQL客户端导入sql/apolloconfigdb.sql即可。

下面以MySQL原生客户端为例:

source /your_local_path/sql/apolloconfigdb.sql
导入成功后,可以通过执行以下sql语句来验证:

# 进入目录
cd  apollo-build-scripts-master/sql
# 导入表
mysql> source apolloconfigdb.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)....
# 查询语句
mysql>  select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;
NamespaceId	Key	Value	Comment
# 结果
+-------------+---------+-------+----------------------+
| NamespaceId | Key     | Value | Comment              |
+-------------+---------+-------+----------------------+
|           1 | timeout | 100   | sample timeout配置   |
+-------------+---------+-------+----------------------+

2.2 配置数据库连接信息

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

注意:填入的用户需要具备对ApolloPortalDB和ApolloConfigDB数据的读写权限。
可单独创建阿波罗数据库用户 降低数据库风险

grant select,insert,update,delete on ApolloConfigDB .* to Apollo@'%' identified by '123';
# 连接远程数据库稍作修改即可
grant select,insert,update,delete on ApolloPortalDB .* to Apollo@'%' identified 
by '123';
#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=密码(如果没有密码,留空即可)
注意:不要修改demo.sh的其它部分

三、启动Apollo配置中心

3.1 确保端口未被占用

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

例如,在Linux/Mac下,可以通过如下命令检查:

lsof -i:8080
3.2 执行启动脚本
./demo.sh start
当看到如下输出后,就说明启动成功了!

==== 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.3 异常排查

如果启动遇到了异常,可以分别查看service和portal目录下的log文件排查问题。

注:在启动apollo-configservice的过程中会在日志中输出eureka注册失败的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。需要注意的是,这个是预期的情况,因为apollo-configservice需要向Meta Server(它自己)注册服务,但是因为在启动过程中,自己还没起来,所以会报这个错。后面会进行重试的动作,所以等自己服务起来后就会注册正常了。

3.4 注意

Quick Start只是用来帮助大家快速体验Apollo项目,具体实际使用时请参考:分布式部署指南

另外需要注意的是Quick Start不支持增加环境,只有通过分布式部署才可以新增环境,同样请参考:分布式部署指南

四、使用Apollo配置中心

4.1 使用样例项目

4.1.1 查看样例配置

打开http://localhost:8070
Quick Start集成了Spring Security简单认证,更多信息可以参考Portal 实现用户登录功能

登录

输入用户名apollo,密码admin后登录
首页
在这里插入图片描述
点击SampleApp进入配置界面,可以看到当前有一个配置timeout=100 配置界面
在这里插入图片描述
在这里插入图片描述
如果提示系统出错,请重试或联系系统负责人,请稍后几秒钟重试一下,因为通过Eureka注册的服务有一个刷新的延时。

4.1.2 运行客户端程序

我们准备了一个简单的Demo客户端来演示从Apollo配置中心获取配置。

程序很简单,就是用户输入一个key的名字,程序会输出这个key对应的值。

如果没找到这个key,则输出undefined。

同时,客户端还会监听配置变化事件,一旦有变化就会输出变化的配置信息。

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

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

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

> timeout
> [SimpleApolloConfigDemo] Loading key : timeout with value: 100

如果运行客户端遇到问题,可以通过修改client/log4j2.xml中的level为DEBUG来查看更详细日志信息

<logger name="com.ctrip.framework.apollo" additivity="false" level="trace">
    <AppenderRef ref="Async" level="DEBUG"/>
</logger>

4.1.3 修改配置并发布

在配置界面点击timeout这一项的编辑按钮 编辑配置
在这里插入图片描述
在弹出框中把值改成200并提交 配置修改
在这里插入图片描述
点击发布按钮,并填写发布信息
在这里插入图片描述

4.1.4 客户端查看修改后的值

如果客户端一直在运行的话,在配置发布后就会监听到配置变化,并输出修改的配置信息:

[SimpleApolloConfigDemo] Changes for namespace application
[SimpleApolloConfigDemo] Change - key: timeout, oldValue: 100, newValue: 200, changeType: MODIFIED
再次输入timeout查看对应的值,会看到如下信息:

> timeout
> [SimpleApolloConfigDemo] Loading key : timeout with value: 200

4.2 使用新的项目

4.2.1 应用接入Apollo

这部分可以参考Java应用接入指南

4.2.2 运行客户端程序

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

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

app.id=你的appId
运行./demo.sh client启动Demo客户端即可。

https://codeload.github.com/nobodyiam/apollo-build-scripts/zip/master

posted @ 2020-07-02 14:08  程少亭  阅读(183)  评论(0)    收藏  举报