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的更多相关文章

  1. Dokuwiki布署小记

    最近个人写作风格全面转向Markdown模式,但之前使用的Mediawiki并未原生支持,且本人在布署时为了实现其所见即所得的方案和别的一些个性化需求,添加了太多插件和自定义设置,两年多过去了,很多设 ...

  2. Hadoop学习笔记1-如何简单布署hadoop

    企业机型配置: 选型标准:普通的,廉价的,标准的(容易替换的),工业化大规模生产的 CPU:支持多核CPU,如2个4核CPU 内存:16G以上,内存越大,常用数据都缓存在内存,提高速度 硬盘:不需RA ...

  3. 配置中心-Apollo

    配置中心-Apollo 2019/10/01 Chenxin 配置服务主要有 携程Apollo.百度Disconf.阿里ACM,目前以Apollo用户量最大.适用场景,多用于微服务,与K8S结合好. ...

  4. Ubuntu 16.04环境布署小记

    本系列文章记录了升级Ubuntu 16.04的布署过程 回到目录 10. 安装Mono, Xsp 当前版本16.04.1的系统源的Mono版本为4.2.1,如需使用最新版本(本文书写时稳定版本为4.6 ...

  5. Ubuntu 16.04系统布署小记

    前段时间趁着双11打折,又将阿里云主机续费了3年.之前布署的系统是Ubuntu 12.04,从系统发布到现在也有四年半了,其官方支持的生命周期也将止于明年春,且这在几年里出现了很多新的事物,我也需要跟 ...

  6. 学习Linux系列--布署常用服务

    本系列文章记录了个人学习过程的点点滴滴. 回到目录 10.mediawiki 知名开源维基框架,我用来构建自己的知识库. 在mediawiki中新建一个http.conf文件 sudo vim /op ...

  7. 简单创建与布署CLR存储过程

    今天的博文是学习CLR存储过程,一个简单的例子,学会怎样创建,编译,布署在SQL中.CLR能做一些T-SQL无法做的事情,很多情况之后,它比T-SQL快. 打开VS2013,创建一个新专案,参考下面5 ...

  8. IIS6.0中布署MVC站点(转)

    昨晚我写的API上线,API是vs2010 + MVC4开发的,需要布署到windows 2003 server + IIS6.0的环境中,之前一直是布在IIS7.0,比较熟悉, 换到IIS6.0,添 ...

  9. solr5.5教程-tomcat布署(2)

    tomcat 布署成功后,接下来就是使用了. 首先要创建一个core. 1.选择右侧菜单, Core Admin -> Add Core. 注意:name自己定义,instanceDir要填写上 ...

随机推荐

  1. IDEA下调试和运行Hadoop程序例子

    准备 配置好JDK和Hadoop环境, 在IDEA中建立maven项目,建立后的目录结构为: 修改pom..xml引入相关支持: <?xml version="1.0" en ...

  2. 从9x9矩阵中抽取中间菱形区域打印 - perl

    起因: 源自于c的练习题,打印diamond,因为perl不需编译,方便调试,故先用perl实现一下 关键: 没有想到好的思路,只能借助于上一篇打印上下三角矩阵的方法,把菱形拆成上下左右4个三角矩阵区 ...

  3. Python【每日一问】14

    问:请介绍一下Python中的 import 机制 答: import 语句结合了两个操作:1.它先搜索指定名称的模块 2.将搜索结果绑定到当前作用域中的名称. 如果指定名称的模块未找到,则会引发 M ...

  4. docker-compose hello word

    Compose 是 Docker 容器进行编排的工具, 是一个整合发布docker应用的利器,可定义和运行多容器的应用,在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要 ...

  5. c#字符串to/from文本文档IO示例

    写入文本文档 class Program { static void Main(String[] args) { //写入string数组,每个string一行 string[] lines = { ...

  6. Java中的static修饰int值做全局变量与static修饰词初始化顺序

    先看一道题 public class HasStatic{ private static int x=100; public static void main(String args[]){ HasS ...

  7. PHP 实现多网站共享用户SESSION 数据解决方案

    PHP 实现多网站共享用户SESSION 数据解决方案 来源URL:http://blog.csdn.net/dongdongzzcs/article/details/6906613 一.问题起源 稍 ...

  8. Webdriver+Testng实现测试用例失败自动截图功能

    testng执行测试用例的时候,如果用例执行失败会自动截图,方便后续排查问题 1.首先定义一个截图类: package com.rrx.utils; import java.io.File;impor ...

  9. db powerdesign CDM、LDM、PDM、OOM的区别

        导读 在本篇文章中,你将会了解到PowerDesigner工具中的三种模型CDM,OOM,PDM的区别和联系. PowerDesigner 简称PD,是一种数据建模工具,适合于开发大型应用系统 ...

  10. Python Queue(队列)

    Queue模块实现了多生产者.多消费者队列.当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用,实现了所有必需的锁定语义. 一.该模块实现了三种类型的队列,它们的区别仅在于检索条目的顺序: ...