apollo是携程开源的一个配置中心,功能强大,但是部署起来比较复杂, 所以这里记录一下。
先简单介绍一下各个组件
-
Config Service 提供配置的读取、推送等功能,服务对象是Apollo客户端
-
Admin Service 提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
-
通过Apollo的发布界面可以多环境、集群管理配置
-
Portal是web服务,可以在web上修改配置,发布等功能
-
Config Service 和 Admin Service 都是多实例、无状态部署,所以需要将自己注册到
-
Eureka 中并保持心跳,在 Eureka 之上架了一层 Meta Server 用于封装 Eureka 的服务发现接口。Apollo提供了MetaServiceProvider SPI,用户可以注入自己的MetaServiceProvider来自定义Meta Server定位逻辑
-
Client 通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port 访问服务,同时在 Client 侧会做 load balance、错误重试
为了简化部署,把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中。
所以实际上我们需要部署3个服务,其中config service和admin service为了保证高可用,需要部署在多台机器上。portal可以部署单台就行。另外apollo官方还建议一个环境部署一套,这里为了简单,我们只部署一套了,通过不同的项目来区分环境。(初创公司没必要搞这么复杂)
1.环境准备见如下链接
这里我没改任何和网络有关的设置,因为都是阿里云的内网,也是在阿里云的机器上,只做了有关mysql的一些修改
把config service的库里的注册eureka的url修改成了我部署config service的ip,apollo官方建议别用固定ip的方式,为了后续扩容方便,强烈建议使用slb,这里考虑我们业务都是初创阶段,几年内估计都不会扩容。
UPDATE ApolloConfigDB.ServerConfig SET Value='http://x.x.x.110:8090/eureka/,http://x.x.x.237:8090/eureka/' WHERE Id=1
这个里面ip+端口,修改成你的config service的ip和端口
另一个就是修改环境,因为我们只部署一套pro环境的,所以这里我修改成了一个pro
UPDATE ApolloPortalDB.ServerConfig SET Value='pro' WHERE Id=1
2.先启动config service
修改/data/apollo/apollo-configservice/config里的数据库配置
# DataSource
spring.datasource.url = jdbc:mysql://x.x.x.110:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
改成你前面倒入的ApolloConfigDB所在的mysql url
修改/data/apollo/apollo-configservice/scripts/startup.sh
export JAVA_OPTS="-Xms3072m -Xmx3072m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=2048m -XX:MaxNewSize=2048m -XX:SurvivorRatio=8"
这里我修改了jvm的参数,修改端口为:SERVER_PORT=${SERVER_PORT:=8090}
然后启动
sudo ./scripts/startup.sh
3.启动admin service
修改/data/apollo/apollo-adminservice/config里的数据库配置
# DataSource
spring.datasource.url = jdbc:mysql://x.x.x.110:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
改成你前面倒入的ApolloConfigDB所在的mysql url修改/data/apollo/apollo-adminservice/scripts/startup.sh
export JAVA_OPTS="-Xms1280m -Xmx1280m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=768m -XX:MaxNewSize=768m -XX:SurvivorRatio=8"
这里我修改了jvm的参数,修改端口为:SERVER_PORT=${SERVER_PORT:=8091}
因为我的admin和config部署在一台机器上,所以有端口冲突,这里换了下端口。
然后启动
sudo ./scripts/startup.sh
4.启动portal
修改/data1/apollo/config/application-github.properties,注意db为ApolloPortalDB
# DataSource
spring.datasource.url = jdbc:mysql://172.26.183.110:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
修改同目录下的apollo-env.properties
# See the License for the specific language governing permissions and
# limitations under the License.
#
#local.meta=http://localhost:8080
#dev.meta=http://fill-in-dev-meta-server:8080
#fat.meta=http://fill-in-fat-meta-server:8080
#uat.meta=http://fill-in-uat-meta-server:8080
#lpt.meta=${lpt_meta}
pro.meta=http://172.26.183.110:8090,http://172.26.17.237:8090
这里我只留了pro, 然后url连Eureka (config service)的ip 和端口
然后启动
sudo ./scripts/startup.sh
到这里就部署完了,在这个过程中我想换掉Eureka用我们自己的注册组件consul,后来发现不光是单纯改配置的问题,还得重新编译源码,java的环境过于复杂了,我不太懂,不会弄,比较浪费时间,就用它自带的Eureka了。
todo:apollo的使用,以及go调用。