布署配置管理中心apollo

Posted eryuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了布署配置管理中心apollo相关的知识,希望对你有一定的参考价值。

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

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

它具有以下特点

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

Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。
同一份代码部署在不同的集群,可以有不同的配置,比如zk的地址等
通过命名空间(namespace)可以很方便的支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖
配置修改实时生效(热发布)

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

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

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

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

可以方便的看到配置在被哪些实例使用
提供Java和.Net原生客户端

提供了Java和.Net的原生客户端,方便应用集成
支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+)
同时提供了Http接口,非Java和.Net应用也可以方便的使用
提供开放平台API

Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。
不过Apollo出于通用性考虑,对配置的修改不会做过多限制,只要符合基本的格式就能够保存。
在我们的调研中发现,对于有些使用方,它们的配置可能会有比较复杂的格式,如xml, json,需要对格式做校验。
还有一些使用方如DAL,不仅有特定的格式,而且对输入的值也需要进行校验后方可保存,如检查数据库、用户名和密码是否匹配。
对于这类应用,Apollo支持应用方通过开放接口在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制
部署简单

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

 

一 快速部署 (单机,单环境)

详情可参考官方文档https://github.com/ctripcorp/apollo/wiki/Quick-Start

这里做简单记录:

1.下载安装包

2.安装mysql数据库。版本要求为5.6+

3.创建数据库。包括两个。一个是元数据库,ApolloPortalDB。一个是环境数据库,ApolloConfigDB。相应的sql存放在安装包的sql目录下。库名可自定义。

4.修改配置。主要是启动脚本。demo.sh.

#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=密码(如果没有密码,留空即可)

 

5.启动。

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

执行demo.sh start命令。启动会很慢。

如果遇到以下错误是正常的。

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

 

6.如果一切正常的话。通过8080端口可以看到注册中心界面如下。

技术分享图片

 

 通过8090端口可以看到哪下界面:

技术分享图片

通过8070端口可以看到如下界面:

 技术分享图片

 

 用户可以通过此界面创建一个项目。新增修改删除配置。并发布。如有错误可回滚上一版本。可创建灰度版本。可创建不同环境的配置。可查看配置发布历史,并选择版本回滚。

 

 

 7.创建

   创建一个项目,并发布一个配置:test->apollo

技术分享图片

 

 8使用

官方提供了java,.net客户端。也有网友提供了go,php,python等语言的http接口。这里使用java客户端。

8.1 新建一个项目,加入pom.xml

<dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.0.0</version>
    </dependency>

8.2创建appid,即哪一个项目,比如刚才我们创建了一个test项目的时候,会填写一个app.id,假如为test.

官方实际上提供了3种配置方式 ,这里只选择在项目中配置文件的方式 。

在resource目录下新建目录META-INF,然后创建文件app.properties.内容为app.id=test

技术分享图片

 

 8.3创建Apollo Meta Server。即每一个环境的服务地址。

官方同样提供了很多种创建方式。这里在本地的话,使用在项目中通过配置文件的方式指定。

在resource目录下创建apollo-env.properties,内容为

dev.meta=http://localhost:8080
fat.meta=http://localhost:8180
uat.meta=http://apollo.uat.xxx.com
pro.meta=http://apollo.xxx.com

目前只是单环境,实际上只需要修改dev.meta的内容。其它环境在多环境部署时介绍。

8.4 指定环境 。哪怕是在单环境下,要使用配置,也是需要指定一个环境的。

官方提供的指定方式也蛮多。在开发环境下,可直接在eclipse里设定。

windon->preferences->java->Installed JREs

技术分享图片

 

 8.5 java的api

 

Config config = ConfigService.getAppConfig(); 
        String value = config.getProperty("test", "default");
        System.out.println("value = " + value);

输出

value = hello apollo

应用非常简单。

 

9 一些疑问。

9.1 在服务器修改了配置后,它真的能做到官方所言1秒钟实时推送到客户端吗?

可以。

Config config = ConfigService.getAppConfig(); 
        while (true) {
            String value = config.getProperty("test", "default");
            System.out.println("time = " + System.currentTimeMillis() + " value = " + value);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

输出

技术分享图片

 

 9.2 配置实际上是保存在mysql里面的,频繁读取会有额外的性能压力吗?

没有去调试去源码,但本地保存有一个缓存文件。在/opt/data/test/config-cache目录下,会有一个文件,保存有最新的配置数据。每次读取都是到这里获取。

 

 

 二多环境部署。

1.直观上的区别 。首先我们来看快速单环境部署的目录。

技术分享图片

直接从官网下载安装包,解压,得到这样的目录,修改配置,直接启动demo.sh就可以启动了。非常简单。

但是多环境布署的目录是这样的,假设部署DEV和FAT两个环境。

技术分享图片

dev下

技术分享图片

 

2.同样需要安装数据库。跟快速部署一样。一个是元数据库,ApolloPortalDB。环境数据库则需创建多个,ApolloConfigDB_DEV,ApolloConfigDB_FAT。相应的sql存放在安装包的sql目录下。库名可自定义。

3.打开ApolloPortalDB库serverconfig表,修改apollo.portal.envs值,默认为dev,加入需要配置的其它环境。如fat,如自定义。不区分大小写。

技术分享图片

 

4.打开ApolloConfigDB_DEV或者 ApolloConfigDB_FAT库,打开serverconfig表,修改eureka.service.url注册服务中心地址。

具体怎么修改呢?

假设我们现在是要部署dev和fat两个环境,由单环境部署可知,服务启动会有三个端口,分别是配置中心8070,注册服务8080,admin服务8090,

假设我们规划,由于8070端口只有一个

dev环境中三个端口分别为 8070,8080,8090

fat环境中三个端口分别为  8070,8180,8090

那么ApolloConfigDB_DEV中由于默认关系可以不用修改,而ApolloConfigDB_FAT中则需要把eureka.service.url修改为http://localhost:8180/eureka/

技术分享图片

 

 5准备工作完成,开始下载或者编译安装包。

我选择的是下载源码,编译。在script目录下有个build.bat和build.sh文件,点击联网自动完成编译。

获取三个目录apollo-adminservice apollo-configservice apollo-portal 下的target文件下的zip文件。放入创建好的dev/adminservice dev/configservice 目录下并解压。portal 只需放在一个目录 下。

6首先启动portal

首先在config目录下修改application-github.properties文件相关mysql配置

# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = 123456

然后修改apollo-env.properties中各个环境注册中心的服务地址

dev.meta=http://localhost:8080
fat.meta=http://localhost:8180

然后点击script目录下startup.sh启动。

 

7启动dev环境

7.1首先启动adminservcie,首先修改config目录下application-github.properties文件中mysql配置

# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB_DEV?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = 123456

修改script目录下start.sh中关于端口SERVER_PORT=8090。

点击script目录下start.sh启动。

7.2然后启动configservice,首先修改config目录下application-github.properties文件中mysql配置

修改script目录下start.sh中关于端口SERVER_PORT=8080。

点击script目录下start.sh启动。

 

8启动fat环境

8.1首先启动adminservice,首先修改config目录下application-github.properties文件中mysql配置

# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB_FAT?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = 123456

修改script目录下start.sh中关于端口SERVER_PORT=8190。

点击script目录下start.sh启动。

8.2然后启动configservice,首先修改config目录下application-github.properties文件中mysql配置

修改script目录下start.sh中关于端口SERVER_PORT=8180。

点击script目录下start.sh启动。

 

9.启动成功后,通过8070端口可以看到如下画面,环境列表中出现了两个。

技术分享图片

 

 在dev环境中加入配置test->apollodev,fat环境中加入test->apollofat,通过切换不同的环境可以得到不同的值。

 

 

 

 参考自apollo官方文档

https://github.com/ctripcorp/apollo

 

 

以上是关于布署配置管理中心apollo的主要内容,如果未能解决你的问题,请参考以下文章

Apollo配置中心源码分析

Spring Cloud 系列之 Apollo 配置中心

Spring Cloud 系列之 Apollo 配置中心

Apollo(阿波罗)携程开源配置管理中心

携程Apollo(阿波罗)配置中心用户管理和部门管理

Apollo架构篇 - 分布式配置中心Apollo