布署配置管理中心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的更多相关文章
- Dokuwiki布署小记
最近个人写作风格全面转向Markdown模式,但之前使用的Mediawiki并未原生支持,且本人在布署时为了实现其所见即所得的方案和别的一些个性化需求,添加了太多插件和自定义设置,两年多过去了,很多设 ...
- Hadoop学习笔记1-如何简单布署hadoop
企业机型配置: 选型标准:普通的,廉价的,标准的(容易替换的),工业化大规模生产的 CPU:支持多核CPU,如2个4核CPU 内存:16G以上,内存越大,常用数据都缓存在内存,提高速度 硬盘:不需RA ...
- 配置中心-Apollo
配置中心-Apollo 2019/10/01 Chenxin 配置服务主要有 携程Apollo.百度Disconf.阿里ACM,目前以Apollo用户量最大.适用场景,多用于微服务,与K8S结合好. ...
- Ubuntu 16.04环境布署小记
本系列文章记录了升级Ubuntu 16.04的布署过程 回到目录 10. 安装Mono, Xsp 当前版本16.04.1的系统源的Mono版本为4.2.1,如需使用最新版本(本文书写时稳定版本为4.6 ...
- Ubuntu 16.04系统布署小记
前段时间趁着双11打折,又将阿里云主机续费了3年.之前布署的系统是Ubuntu 12.04,从系统发布到现在也有四年半了,其官方支持的生命周期也将止于明年春,且这在几年里出现了很多新的事物,我也需要跟 ...
- 学习Linux系列--布署常用服务
本系列文章记录了个人学习过程的点点滴滴. 回到目录 10.mediawiki 知名开源维基框架,我用来构建自己的知识库. 在mediawiki中新建一个http.conf文件 sudo vim /op ...
- 简单创建与布署CLR存储过程
今天的博文是学习CLR存储过程,一个简单的例子,学会怎样创建,编译,布署在SQL中.CLR能做一些T-SQL无法做的事情,很多情况之后,它比T-SQL快. 打开VS2013,创建一个新专案,参考下面5 ...
- IIS6.0中布署MVC站点(转)
昨晚我写的API上线,API是vs2010 + MVC4开发的,需要布署到windows 2003 server + IIS6.0的环境中,之前一直是布在IIS7.0,比较熟悉, 换到IIS6.0,添 ...
- solr5.5教程-tomcat布署(2)
tomcat 布署成功后,接下来就是使用了. 首先要创建一个core. 1.选择右侧菜单, Core Admin -> Add Core. 注意:name自己定义,instanceDir要填写上 ...
随机推荐
- awk命令基本使用方法
awk命令 基本用法 awk '{print $1, $4}' netstat.txt 单引号中大括号的部分就是awk语句 $1至$n表示第几列,$0表示整行 格式化输出的方法 $ awk '{pri ...
- 【rabbitmq】RabbitMQ 集群与网络分区
网络分区(network partitions) 官网-网络分区 网络设备故障导致的网络分裂.比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连.若 ...
- 在socket的server端处理client端发来的数据
一.楔子 最近做了一个需求遇到一个坑,归结成一个小问题,其实就是在socket的server端处理client端发来的数据的问题,现将这个问题总结一下,本文将数据在server端以字典的形式存储. 另 ...
- 海伦去约会——kNN算法
下午于屋中闲居,于是翻开<机器学习实战>一书看了看“k-邻近算法”的内容,并学习了一位很厉害的博主Jack Cui的代码,自己照着码了一遍.在此感谢博主Jack Cui的知识分享. 一.k ...
- OkHttp之Interceptor
先看RealCall 发送一个请求,我们会先创建一个request,然后使用okHttpClient.newCall(request),创建一个call进行网络请求,这个call,就是RealCall ...
- jquery datatable测试部分代码(仅自用)
创建一个四列的datatable表,第四列为表格里的按钮设置,respond为JSON对象数组. $('#example').DataTable({ //每页显示十条数据 ...
- html 5 dialog标签:定义特殊术语或短语
html5中<dialog>标签作用是定义特殊术语或短语,这里主机吧详细介绍下<dialog>标签用法.<dialog>标签属性以及<dialog>标签 ...
- Django基础模型层(77-78)
jango框架之模型层(d77-78)一 单表操作: 1 mysql数据库:settings里配置 'default': { # key值必须都是大写 'ENGINE': 'django.d ...
- thingsboard填坑之路
因为thingsboard都是国外的资料,国内基本没有参考资料.所以,记录下来源码安装当中,遇到的问题. thingsboard官网源码安装连接: https://thingsboard.io/doc ...
- Activiti 框架学习
1:工作流的概念 说明: 1) 假设:这两张图就是华谊兄弟的请假流程图 2) 图的组成部分: 人物:范冰冰 冯小刚 王中军 事件(动作):请假.批准.不批准 工作流(Workflo ...