随着Spring Cloud项目的越来越繁琐,配置文件越来越多,之前的本地存储方式就显得有些不够用了,一方面,本地存储的方式不够灵活,另一方面,如果需要更改配置,会十分繁琐并且需要重启服务,这对于一个系统来说十分不友好。
之前我也使用Docker+Gitlab的方式搭建了一个分布式配置中心,主要有三个问题:
之后,根据老师的建议,决定使用携程研发的开源配置管理中心—Apollo。
Apollo开发者提供了详尽的部署部署文档,但是对于小白显得不那么友好,所以我想从一个初学者的角度讲述我的Apollo部署过程。
正是基于配置的特殊性,所以Apollo从设计之初就立志于成为一个有治理能力的配置发布平台,目前提供了以下的特性:
根据部署文档所述,Quick Start部署方式虽然简单快捷,但是不建议使用于生产环境中。
为了让大家更快的上手了解Apollo配置中心,我们这里准备了一个Quick Start,能够在几分钟内在本地环境部署、启动Apollo配置中心。
考虑到Docker的便捷性,我们还提供了Quick Start的Docker版本,如果你对Docker比较熟悉的话,可以参考Apollo Quick Start Docker部署通过Docker快速部署Apollo。
不过这里需要注意的是,Quick Start只针对本地测试使用,如果要部署到生产环境,还请另行参考分布式部署指南。
所以综合考量,我选择使用分布式部署方式。
服务端基于Spring Boot,启动脚本理论上支持所有Linux发行版,建议CentOS 7。
操作系统我选用的是Ubuntu 16.04版本。
- Apollo服务端:1.8+
- Apollo客户端:1.7+
由于需要同时运行服务端和客户端,所以建议安装Java 1.8+。
对于Apollo客户端,运行时环境只需要1.7+即可。
注:对于Apollo客户端,如果有需要的话,可以做少量代码修改来降级到Java 1.6,详细信息可以参考Issue 483
Java的安装与环境变量配置在CSDN、百度上都有很多,只要按照步骤跟着做,不会有问题。安装完成后可以通过以下命令验证:
cgteam@cgteam:~/lizhe$ java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-1ubuntu0.16.04.1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
这里我使用的是JDK1.8。
- 版本要求:5.6.5+
Apollo的表结构对
timestamp
使用了多个default声明,所以需要5.6.5以上版本。
MySQL同样根据CSDN教程安装即可,连接上MySQL后,可以通过如下命令检查:
SHOW VARIABLES WHERE Variable_name = 'version';
Variable_name | Value |
---|---|
version | 5.7.11 |
Apollo目前支持以下环境:
具体可以查看开发文档。
根据开发者发布的文档来看,当我们在服务器部署Apollo时,需要将安装包在服务器端解压执行。开发者提供了两种获取安装包的方式:
这里我建议使用第二种,因为这样比较简单,不需要解压后挨个改配置,只要在打包前修改一次脚本文件即可。
通过Git或者下载Zip的方式获取源码,源码如下。
部署Apollo需要使用到两个数据库:ApolloConfigDB
和ApolloPortalDB
。这一步十分简单,打开你的MySQL客户端,创建两个新的数据库,然后运行官方提供的sql文件即可。sql文件分别在:\apollo-master\scripts\db\migration\configdb
以及\apollo-master\scripts\db\migration\portaldb
目录下。
创建数据库:
运行sql文件:
导入成功后,可以通过执行以下sql语句来验证:
ApolloPortalDB:
select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
Id | Key | Value | Comment |
---|---|---|---|
1 | apollo.portal.envs | dev | 可支持的环境列表 |
ApolloConfigDB:
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 |
注意:ApolloPortalDB只需要在生产环境部署一个即可,而ApolloConfigDB需要在每个环境部署一套,如fat、uat和pro分别部署3套ApolloConfigDB。
Apollo自身的一些配置存储在数据库里,所以我们需要对数据库进行一些简单的配置。
eureka.service.url :Apollo需要将Apollo-adminservice
以及Apollo-portal
注册到Eureka上,由于Apollo-configservice
本身就是一台Eureka服务器,所以这里只需填写配置Apollo-configservice
所在服务的IP地址以及端口即可,如http://192.168.13.13:8080/eureka/
。
这里不建议使用localhost
写法,后期运行apollo-portal
有可能会报错。
其他选项请根据自己需要自行配置。
1. eureka.service.url - Eureka服务Url
不管是apollo-configservice还是apollo-adminservice都需要向eureka服务注册,所以需要配置eureka服务地址。 按照目前的实现,apollo-configservice本身就是一个eureka服务,所以只需要填入apollo-configservice的地址即可,如有多个,用逗号分隔(注意不要忘了/eureka/后缀)。
需要注意的是每个环境只填入自己环境的eureka服务地址,比如FAT的apollo-configservice是1.1.1.1:8080和2.2.2.2:8080,UAT的apollo-configservice是3.3.3.3:8080和4.4.4.4:8080,PRO的apollo-configservice是5.5.5.5:8080和6.6.6.6:8080,那么:
- 在FAT环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
http://1.1.1.1:8080/eureka/,http://2.2.2.2:8080/eureka/
- 在UAT环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
http://3.3.3.3:8080/eureka/,http://4.4.4.4:8080/eureka/
- 在PRO环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
http://5.5.5.5:8080/eureka/,http://6.6.6.6:8080/eureka/
注1:这里需要填写本环境中全部的eureka服务地址,因为eureka需要互相复制注册信息
注2:如果希望将Config Service和Admin Service注册到公司统一的Eureka上,可以参考部署&开发遇到的常见问题 - 将Config Service和Admin Service注册到单独的Eureka Server上章节
注3:在多机房部署时,往往希望config service和admin service只向同机房的eureka注册,要实现这个效果,需要利用
ServerConfig
表中的cluster字段,config service和admin service会读取所在机器的/opt/settings/server.properties
(Mac/Linux)或C:\opt\settings\server.properties
(Windows)中的idc属性,如果该idc有对应的eureka.service.url配置,那么就只会向该机房的eureka注册。比如config service和admin service会部署到SHAOY
和SHAJQ
两个IDC,那么为了实现这两个机房中的服务只向该机房注册,那么可以在ServerConfig
表中新增两条记录,分别填入SHAOY
和SHAJQ
两个机房的eureka地址即可,default
cluster的记录可以保留,如果有config service和admin service不是部署在SHAOY
和SHAJQ
这两个机房的,就会使用这条默认配置。
Key Cluster Value Comment eureka.service.url default http://1.1.1.1:8080/eureka/ 默认的Eureka服务Url eureka.service.url SHAOY http://2.2.2.2:8080/eureka/ SHAOY的Eureka服务Url eureka.service.url SHAJQ http://3.3.3.3:8080/eureka/ SHAJQ的Eureka服务Url 2. namespace.lock.switch - 一次发布只能有一个人修改开关,用于发布审核
这是一个功能开关,如果配置为true的话,那么一次配置发布只能是一个人修改,另一个发布。
生产环境建议开启此选项
3. config-service.cache.enabled - 是否开启配置缓存
这是一个功能开关,如果配置为true的话,config service会缓存加载过的配置信息,从而加快后续配置获取性能。
默认为false,开启前请先评估总配置大小并调整config service内存配置。
4. item.key.length.limit - 配置项 key 最大长度限制
默认配置是128。
5. item.value.length.limit - 配置项 value 最大长度限制
默认配置是20000。
同样在ApolloPortalDb
中也存在一个配置表,这里superAdmin
就是你一开始登陆Apollo的用户名,根据需要更改,我在这里未做更改。
1.apollo.portal.envs - 可支持的环境列表
默认值是dev,如果portal需要管理多个环境的话,以逗号分隔即可(大小写不敏感),如:
DEV,FAT,UAT,PRO
2.organizations - 部门列表
Portal中新建的App都需要选择部门,所以需要在这里配置可选的部门信息,样例如下:
[{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"}]
3.superAdmin - Portal超级管理员
超级管理员拥有所有权限,需要谨慎设置。
如果没有接入自己公司的SSO系统的话,可以先暂时使用默认值apollo(默认用户)。等接入后,修改为实际使用的账号,多个账号以英文逗号分隔(,)。
4.consumer.token.salt - consumer token salt
如果会使用开放平台API的话,可以设置一个token salt。如果不使用,可以忽略。
5.wiki.address
portal上“帮助”链接的地址,默认是Apollo github的wiki首页,可自行设置。
6.admin.createPrivateNamespace.switch
是否允许项目管理员创建private namespace。设置为
true
允许创建,设置为false
则项目管理员在页面上看不到创建private namespace的选项。了解更多Namespace7. configView.memberOnly.envs
只对项目成员显示配置信息的环境列表,多个env以英文逗号分隔。
对设定了只对项目成员显示配置信息的环境,只有该项目的管理员或拥有该namespace的编辑或发布权限的用户才能看到该私有namespace的配置信息和发布历史。公共namespace始终对所有用户可见。
可以通过两种方式获取安装包:
- 直接下载安装包
- 从GitHub Release页面下载预先打好的安装包
- 如果对Apollo的代码没有定制需求,建议使用这种方式,可以省去本地打包的过程
- 通过源码构建
- 从GitHub Release页面下载Source code包或直接clone源码后在本地构建
- 如果需要对Apollo的做定制开发,需要使用这种方式
建议使用源码构建,编辑源码\apollo-master\scripts\build.sh
:
红色部分:需要修改的部分
Ⅰ:配置数据库地址以及用户名、密码;
注意:填入的用户需要具备对ApolloPortalDB和ApolloConfigDB数据的读写权限。
Ⅱ:配置环境地址,由于Apollo支持分布式多环境配置,可以将不同的环境配置在不同的服务器,也就拥有了不同的地址,可以在这里进行配置,若用不到可以直接注释掉,这里填的是Eureka地址,即apolloi-configservice
的地址。如:在数据库配置中我们给eureka.service.url
配置了http://192.168.13.13:8080/eureka/
,那么这里红线部分就应该是192.168.13.13:8080
。
完成脚本的修改后,就可以执行脚本进行编译、打包了,建议在Linux下进行编译打包,Windows下可以通过Git Bash打包。
三个安装包分别:
位于apollo-configservice/target/
目录下的apollo-configservice-x.x.x-github.zip
;
位于apollo-adminservice/target/
目录下的apollo-adminservice-x.x.x-github.zip
;
位于apollo-portal/target/
目录下的apollo-portal-x.x.x-github.zip
。
将对应环境的apollo-configservice-x.x.x-github.zip
上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh。
将对应环境的apollo-adminservice-x.x.x-github.zip
上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh。
将apollo-portal-x.x.x-github.zip
上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh。
访问http://xxx,xxx,xxx,xxx:8070
打开Apollo页面,默认超级管理员用户名为apollo
,密码为admin
。