本文是依据apollo的官方部署文档实践后总结得出的经验,本文着重记录部署过程和容易遇到的问题,详细信息在官方文档有阐述
官方文档地址:https://github.com/ctripcorp/apollo/wiki/
首先要明白的问题是:apollo是什么?apollo能干什么?
每当我们学习使用一种应用之前最重要的就是要明白这个应用能做什么,能解决什么问题,这样的话在学习这个应用如何使用的时候才不会觉得抽象。
apollo是一个配置中心,顾名思义,所谓配置中心就是将各种配置项集中在一起并且能够提供服务的应用。那么什么情况下需要用到apollo呢?当你感觉你的业务配置文件过于繁杂,臃肿,每次上线需要重新部署代码显得配置更改不灵活,许多开关无法快速更改。这个时候就是需要apollo的时候了。
apollo的服务端打包是需要1.8版本的java,客户端需要1.7以上的java,因为第一次打包(运行build.sh)是会把客户端和服务端一起打包的,所以这里直接用1.8就行了
在此文档编写的时候apollo要求的版本是5.6.5以上,但是官方文档也提供了使用较低版本mysql的办法,我这里用的是mariadb-10.3.7
maven的版本这里会有一个坑,即使用centos7的默认yum源安装的maven版本也过低,用过低的maven版本在执行从github上克隆下来的apollo项目目录中的构建脚本build.sh的时候就会报错,所以这里必须使用较新版maven或者最新版。
apollo是一个配置文件储存在数据库里的项目,所以数据库改动会比较多一些。
Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,这两个库有现成的sql文件可以直接导入
登陆数据库后执行:
source /your_local_path/scripts/sql/apolloportaldb.sql
执行完了之后可以用一下语句验证:
select Id, Key, Value, Comment from ApolloPortalDB.ServerConfig limit 1;
创建另一个库:
source /your_local_path/scripts/sql/apolloconfigdb.sql
验证语句:
select Id, Key, Value, Comment from ApolloConfigDB.ServerConfig limit 1;
注意:正常情况下一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,也就是说在正常情况下ApolloPortalDB库只需要在portal管理平台的mysql中存在一个,而ApolloConfigDB需要在每个环境都有。重点是我这次是要将所有环境都部署到同一台机器上,那么我就需要在同一个mysql中创建各环境的ApolloConfigDB库,但是我这只是测试阶段的apollo,将所有环境都部署在同一台机器上是不安全的。
这里提供一下复制数据库的方法:
首先在mysql中创建好对应名称的数据库然后执行:
mysqldump ApolloConfigDB -u root -pass --add-drop-table | mysql ApolloConfigDB_pro -u root -pass
ApolloPortalDB
配置项统一存储在ApolloPortalDB.ServerConfig表中,这里就只记录配置多环境:
在该表中只需要把apollo.portal.envs的默认值“dev”改成“DEV,FAT,UAT,PRO”即可,不区分大小写,这里要注意的是如果只是改了这个地方是没有用的,因为没有对应的configservice和adminservice。
ApolloConfigDB
不同的环境需要将ApolloConfigDB.ServerConfig表中的eureka.service.url设置为对应环境的地址。比如:
1.在FAT环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
http://1.1.1.1:8080/eureka/,http://2.2.2.2:8080/eureka/
2.在UAT环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
http://3.3.3.3:8080/eureka/,http://4.4.4.4:8080/eureka/
3.在PRO环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
http://5.5.5.5:8080/eureka/,http://6.6.6.6:8080/eureka/
因为我实践的环境是一台机器,所以域名是用的同一个,只是端口不一样
Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑scripts/build.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息,这里必须用有读写权限的mysql用户。
注意:
1.每个环境都需要独立部署一套config-service、admin-service和ApolloConfigDB(本次实践只是测试所以在一台机)
2.由于ApolloConfigDB在每个环境都有部署,所以对不同的环境config-service和admin-service需要使用不同的数据库参数打不同的包,portal和client只需要打一次包即可,但是如果打包的时候在build.sh中的meta处没有配置完整的url的话也需要重新打包
meta service地址配置
Portal和Apollo客户端需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以需要在打包时提供这些信息。这里要注意填的是configservice的地址
dev_meta=http://1.1.1.1:8080
fat_meta=http://apollo.fat.xxx.com
uat_meta=http://apollo.uat.xxx.com
pro_meta=http://apollo.xxx.com
如果完成了上面内容就直接打包的话会遇到一个坑:如果服务器是阿里云或者其他云服务器,在服务器上一般是没有外网网卡的,所以注册到各自的metaserver上的地址就有可能是服务器的内网地址,这样就不对了。有几种解决办法,我这里就记录其中一种:
打开从git上克隆下来的项目中的apollo-configservice/src/main/resources/bootstrap.yml和apollo-adminservice/src/main/resources/bootstrap.yml在eureka段中的instance下添加一个字段ip-address然后填上希望注册的Ip地址就行了,比如以下:
eureka:
instance:
hostname: ${hostname:localhost}
ip-address: 1.1.1.1
preferIpAddress: true
填上这个坑就可以执行build.sh了,第一次打包需要把全部包都打出来。
完成编译后在各组件目录下的target目录下会生成打出来的包,将portal,configservice,adminservice的target目录下的xxx.github.zip包解压到指定地方后执行scripts下的startup.sh就可以启动服务了,这里要注意端口冲突问题
客户端上传到私库这里也有一个坑,在官方文档中给出了两种方法,通过更改build.sh中客户端的mvn命令参数install为deploy的方式或者手动上传方式把客户端上传到私库中。
容易遇到的问题:
1.因为直接打包的话版本是带snapshots的镜像版本,通过手工是无法上传到Nexus的
2.如果按照官方文档的做法在家目录的.m2中创建一个settings.xml文件的话执行build.sh的时候会报警告无法读取该文件,如下:
[WARNING]
[WARNING] Some problems were encountered while building the effective settings
[WARNING] Expected root element 'settings' but found 'servers' (position: START_TAG seen ... @1:9) @ /root/.m2/settings.xml, line 1, column 9
[WARNING]
如果出现如下警告信息的话在settings.xml中配置的私库账号密码和私库的url都算是白配了,客户端是无法上传到私库中去的
解决办法:
1.在mvn的安装目录下的conf/settings.xml中在server字段添加releases和snapshots字段以及用户名密码,然后在apollo项目目录下的pom.xml中的distributionManagement配置段将私库的地址变量写成固定链接
2.直接把家目录下的.m2/settings.xml的名称前面加上其他的内容,变成XXXsettings.xml之类的名称即可(附上该办法出处:https://groups.google.com/forum/#!topic/closure-compiler-discuss/cjS1mC5iiD0)
通过上面两个任意一个方法便可以处理客户端无法上传到私库的问题
有三种方法:
推荐用第三种
注意:如果一个环境下面有多个集群需要多套配置的话可以在tomcat启动参数中加上:
-Dapollo.cluster=
3.2 注意客户端服务器上的文件路径权限
在apollo客户端服务器上要保证/opt/settings/server.properties和/opt/data配置缓存路径需要给启动apollo客户端的用户读写权限