Apollo基本概念

一、简介

Apollo - A reliable configuration management system
Apollo的Github地址

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

Apollo包括服务端和客户端两部分:
1、服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
2、Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

二、特性

基于配置的特殊性,所以Apollo从设计之初就立志于成为一个有治理能力的配置发布平台,目前提供了以下的特性:

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

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

2、配置修改实时生效(热发布)

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

3、版本发布管理

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

4、灰度发布

支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例

5、权限管理、发布审核、操作审计

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

6、客户端配置信息监控**

可以在界面上方便地看到配置在被哪些实例使用

7、提供Java和.Net原生客户端

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

8、提供开放平台API

Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过Apollo出于通用性考虑,不会对配置的修改做过多限制,只要符合基本的格式就能保存,不会针对不同的配置值进行针对性的校验,如数据库用户名、密码,Redis服务地址等。
对于这类应用配置,Apollo支持应用方通过开放平台API在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制。

三、基础模型


1、用户在配置中心对配置进行修改并发发布
2、配置中心通知Apollo客户端有配置更新
3、Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用

四、Apollo的四个维度

Apollo基于四个维度去管理key-value格式的配置:

1、application(项目/应用) - 一级维度

②Apollo 客户端在运行时需要知道当前项目是谁,从而可以根据不同的应用来获取对应的项目的配置。
②这个项目在SpringBoot代码里用app.id来标识,在VM options中用-Dapp.id来标识。

2、environment(环境) - 二级维度

实际开发中,不可能只有一个环境。常见的如:
①DEV - 开发环境
②FAT - 功能验收测试环境
③UAT - 用户验收测试环境
④PRO - 生产环境
⑤其他环境(test-测试环境、sit-系统集成测试环境、pre-灰度环境)

3、cluster(集群) - 三级维度

一个应用下不同实例的分组,比如上海、北京两个机房为两个集群,它们中某些参数配置可能不一致。

4、namespace(命名空间) - 四级维度

可以简单地把 namespace 类比为不同的配置文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC 配置文件,应用自身的配置文件等。

4.1、Namespace的两种权限

①public(公共的):public权限的Namespace可以被任何应用获取
②private(私有的):只能被所属的应用获取到。一个应用尝试获取其他应用private的Namespace,Apollo会报404错误。

4.2、Namespace的三种类型

①公有类型:具有public权限,游离与应用之外的配置,名称全局唯一。
②私有类型:具有private权限。
③关联类型(继承类型):具有private权限,可以将继承关联的Namespace的配置,并且可以覆盖配置。

五、本地缓存

Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限。

Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data{appId}\config-cache

本地配置文件会以下面的文件名格式放置于本地缓存路径下:

{appId}+{cluster}+{namespace}.properties

六、客户端设计


1、客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。
2、客户端还会定时从 Apollo 配置中心服务端拉取应用的最新配置。
3、这是一个 fallback 机制,为了防止推送机制失效导致配置不更新
4、客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回 304 - Not Modified
5、定时频率默认为每 5 分钟拉取一次,客户端也可以通过在运行时指定 apollo.refreshInterval来覆盖,单位为分钟。
6、客户端从 Apollo 配置中心服务端获取到应用的最新配置后,会保存在内存中。
7、客户端会把从服务端获取到的配置在本地文件系统缓存一份,在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置。
8、应用程序从 Apollo 客户端获取最新的配置、订阅配置更新通知。
长连接是通过 Http Long Polling 实现的,具体而言:
1、客户端发起一个 Http 请求到服务端
2、服务端会保持住这个连接 60 秒
3、如果在 60 秒内有客户端关心的配置变化,被保持住的客户端请求会立即返回,并告知客户端有配置变化的 namespace 信息,客户端会据此拉取对应 namespace 的最新配置
3、如果在 60 秒内没有客户端关心的配置变化,那么会返回 Http 状态码 304 给客户端
客户端在收到服务端请求后会立即重新发起连接,回到第一步
4、考虑到会有数万客户端向服务端发起长连,在服务端使用了 async servlet(Spring DeferredResult) 来服务 Http Long Polling 请求。

七、总体设计


从上往下看:
1、Config Service 提供配置的读取、推送等功能,服务对象是 Apollo 客户端
2、Admin Service 提供配置的修改、发布等功能,服务对象是 Apollo Portal(管理界面)
3、Config Service 和 Admin Service 都是多实例、无状态部署,所以需要将自己注册到 Eureka 中并保持心跳
4、在 Eureka 之上我们架了一层 Meta Server 用于封装Eureka的服务发现接口
5、Client 通过域名访问 Meta Server 获取Config Service服务列表(IP+Port),而后直接通过 IP+Port 访问服务,同时在 Client 侧会做 load balance 错误重试
6、Portal 通过域名访问 Meta Server 获取 Admin Service 服务列表(IP+Port),而后直接通过 IP+Port 访问服务,同时在 Portal 侧会做 load balance、错误重试
7、为了简化部署,我们实际上会把 Config Service、Eureka 和 Meta Server 三个逻辑角色部署在同一个 JVM 进程中

八、可用性考虑

配置中心作为基础服务,可用性要求非常高,下面的表格描述了不同场景下Apollo的可用性:

某台 config service 下线 无影响 Config service无状态,客户端重连其它config service
所有 config service 下线 客户端无法读取最新配置,Portal无影响 客户端重启时,可以读取本地缓存配置文件
某台 admin service 下线 无影响 Admin service无状态,Portal重连其它 admin service
所有 admin service 下线 客户端无影响,portal无法更新配置
某台 portal 下线 无影响 Portal域名通过slb绑定多台服务器,重试后指向可用的服务器
全部 portal 下线 客户端无影响,portal无法更新配置
某个数据中心下线 无影响 多数据中心部署,数据完全同步,Meta Server/Portal 域名通过 slb 自动切换到其它存活的数据中心

场景 影响 降级 原因
某台 config service 下线 无影响 Config service无状态,客户端重连其它config service
所有 config service 下线 客户端无法读取最新配置,Portal无影响 客户端重启时,可以读取本地缓存配置文件
某台 admin service 下线 无影响 Admin service无状态,Portal重连其它 admin service
所有 admin service 下线 客户端无影响,portal无法更新配置
某台 portal 下线 无影响
全部 portal 下线 客户端无影响,portal无法更新配置 Portal域名通过slb绑定多台服务器,重试后指向可用的服务器
某个数据中心下线 无影响 多数据中心部署,数据完全同步,Meta Server/Portal 域名通过 slb 自动切换到其它存活的数据中心

Apollo部署

一、使用三个Jar包部署

1、下载Apollo的三个Jar包

Apollo三个Jar包Github下载地址

2、将这三个Jar包放到同一目录下
3、下载SQL脚本

Apollo依赖MySQL5.6.5+,需要两个数据库

SQL数据库脚本地址

4、启动Apollo

Apollo默认会启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用(可通过-Dserver.port=端口号 修改默认端口)。
通过cmd启动,以下启动命令基于MySql8.0

java -Xms256m -Xmx256m -Dspring.datasource.url=jdbc:mysql://localhost:3306/apolloconfigdb?serverTimezone=GMT -Dspring.datasource.username=root -Dspring.datasource.password=123456 -jar apollo-configservice-1.8.1.jarjava -Xms256m -Xmx256m -Dspring.datasource.url=jdbc:mysql://localhost:3306/apolloconfigdb?serverTimezone=GMT -Dspring.datasource.username=root -Dspring.datasource.password=123456 -jar apollo-adminservice-1.8.1.jarjava -Xms256m -Xmx256m -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://localhost:3306/apolloportaldb?serverTimezone=GMT -Dspring.datasource.username=root -Dspring.datasource.password=123456 -jar apollo-portal-1.8.1.jar
5、启动完毕,进入Apollo页面

三个启动完毕,通过localhost:8070进入管理页,初始账号:apollo,初始密码:admin

二、通过Quick Start安装包

参考方式 - Apollo Quick Start Build Scripts

使用Apollo

由于界面操作简单,仅仅使用文字进行简单描述,不贴图了。

一、管理员工具

右上角的管理员工具

用户管理:可以新增用户
系统权限管理:可以赋予用户某些权限
开放平台授权管理:创建三方应用及赋权
系统参数:维护ApolloPortalDB.ServerConfig表数据,比如部门的修改(修改value值来新增\修改\删除部门)
删除应用、集群、AppNamespace:见名知意
系统信息:见名知意
配置导出:见名知意

二、项目管理 - 创建项目

部门:选择应用所在的部门
应用AppId:用来标识应用身份的唯一id,格式为string,需要和项目配置文件applications.properties中配置的app.id对应
应用名称:应用名,仅用于界面展示
应用负责人:选择的人默认会成为该项目的管理员,具备项目权限管理、集群创建、Namespace创建等权限

创建一个如下图所示的项目:

三、配置管理

1、发布配置

发布配置可以通过表格模式文本模式进行添加。
表格模式:单个key-value配置添加、修改

文本模式:批量添加、修改,对于从已有的properties文件迁移尤其有用。

2、新增Namespace

创建一个项目,默认会有一个application的Namespace。
Namespace作为配置的分类,可当成一个配置文件
以添加rocketmq配置为例,添加spring-rocketmq的 Namespace配置rocketmq相关信息。
进入项目首页,点击左下角的“添加Namespace”,共包括两项:关联公共Namespace和创建Namespace,选择“创建Namespace”。

rocketmq.name-server = 127.0.0.1:9876
rocketmq.producer.group = PID_ACCOUNT

3、公共的Namespace

在项目开发中,有一些配置可能是通用的,我们可以通过把这些通用的配置放到公共的Namespace中,这样其他项目要使用时可以直接添加需要的Namespace。

这里新建一个公共应用comment-template,并基于部门lcy_service创建springboot-http的Namespace,公共Namespace一定要是public的。

发布的配置内容如下:

spring.http.encoding.enabled = true
spring.http.encoding.charset = UTF-8
spring.http.encoding.force = true
server.tomcat.remote_ip_header = x-forwarded-for
server.tomcat.protocol_header = x-forwarded-proto
server.use-forward-headers = true
server.servlet.context-path = /

选择之前创建好的项目(account-service),添加Namespace,选择关联公共Namespace,同时可以覆盖公共配置里的配置项,然后发布即可。

四、集群配置

在有些情况下,应用有需求对不同的集群做不同的配置,比如部署在A机房的应用连接的RocketMQ服务器地址和部署在B机房的应用连接的RocketMQ服务器地址不一样。另外在项目开发过程中,也可为不同的开发人员创建不同的集群来满足开发人员的自定义配置。

1、创建集群

进入到account-service项目里,左边点击“添加集群”。

2、同步集群配置

同步集群的配置是指在同一个应用中拷贝某个环境下的集群的配置到目标环境下的目标集群。

从其他集群同步已有配置到新集群,切换到原有集群(default),展开要同步的Namespace,点击同步配置。

同步完之后,需要发布配置才生效。

SpringBoot集成Apollo

一、引入依赖

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

二、配置文件application.properties

server.port=8088
# 应用ID
app.id=account-service
# 是否开启Apollo
apollo.bootstrap.enabled=true
# 设置Namespace,默认application
apollo.bootstrap.namespaces=application,spring-rocketmq,lcy_service.spring-boot-http
# 指定使用哪个集群的配置
apollo.cluster=default
# Apollo服务器
apollo.meta=http://localhost:8080
# 为了防止配置中心无法连接等问题,Apollo可以通过该配置在本地缓存一份配置
# apllo.cacheDir=/opt/data/some-cache-dir
# Spring应用通常会使用 Placeholder 来注入配置,如${someKey:someDefaultValue},冒号前面的是 key,冒号后面的是默认值。
# 如果想关闭 placeholder 在运行时自动更新功能,可以设置为 false。
apollo.bootstrap.eagerLoad.enabled=false

三、代码获取配置

在SpringBoot启动类上加上@EnableApolloConfig注解。
获取配置,通过@Value(${key})的方式注入,或者通过Config获取。

@RestController
public class ApolloController {@Value("${sms.enable}")private Boolean value;@GetMapping("/getApollo")public String getApollo(){String key = "rocket.producer.group";String namespace = "spring-rocketmq";Config config = ConfigService.getConfig(namespace);String rocketMq = config.getProperty(key,null);return rocketMq + "<----->" + value;}
}

其他环境部署

Apollo默认部署的是dev环境,这里再部署一个pro环境。

在企业中常用的部署方案为:Apollo-adminservice和Apollo-configservice两个服务分别在线上环境(pro),仿真环境(uat)和开发环境(dev)各部署一套,Apollo-portal做为管理端只部署一套,统一管理上述三套环境。

一、创建数据库

只需要创建apolloconfigdb,为了区分需要修改apolloconfigdb.sql里的数据库名字为apolloconfigdb_pro,然后执行sql文件。(建议:三个库都重新重建,即数据全部初始化。本人在操作时出现失误,导致数据混乱出现BUG,重建数据库重新建项目、集群、Namespace后无问题)。

二、启动configService和AdminService - PRO环境

将pro环境的configservice端口设置为8081,adminservice设置为8091,启动命令:

java -Xms256m -Xmx256m -Dserver.port=8081 -Dspring.datasource.url=jdbc:mysql://localhost:3306/apolloconfigdb_pro?serverTimezone=GMT -Dspring.datasource.username=root -Dspring.datasource.password=123456 -jar apollo-configservice-1.8.1.jarjava -Xms256m -Xmx256m -Dserver.port=8091 -Dspring.datasource.url=jdbc:mysql://localhost:3306/apolloconfigdb_pro?serverTimezone=GMT -Dspring.datasource.username=root -Dspring.datasource.password=123456 -jar apollo-adminservice-1.8.1.jar

三、修改Eureka地址

更新pro环境apolloconfigdb_pro数据库serverconfig表里key为eureka.service.url的数据的value为http://localhost:8081/eureka/

四、调整ApolloPortal服务配置

服务配置项统一存储在apolloportaldb.serverconfig表中,可以通过管理员工具 - 系统参数页面进行配置:apollo.portal.envs - 可支持的环境列表(dev,pro)。

五、重新启动ApolloPortal

Apollo Portal需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。

-Ddev_meta=http://localhost:8080/ -Dpro_meta=http://localhost:8081/

启动命令:

java -Xms256m -Xmx256m -Ddev_meta=http://localhost:8080/ -Dpro_meta=http://localhost:8081 -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://localhost:3306/apolloportaldb?serverTimezone=GMT -Dspring.datasource.username=root -Dspring.datasource.password=123456 -jar apollo-portal-1.8.1.jar

六、SpringBoot启动

1、配置文件
server.port=8088
# 应用ID
app.id=account-service
# 是否开启Apollo
apollo.bootstrap.enabled=true
# 设置Namespace,默认application
apollo.bootstrap.namespaces=application,lcy.spring-rocketmq
# 指定使用哪个集群的配置
apollo.cluster=default
# 如果想关闭 placeholder 在运行时自动更新功能,可以设置为 false。
apollo.bootstrap.eagerLoad.enabled=false
# 为了防止配置中心无法连接等问题,Apollo可以通过该配置在本地缓存一份配置
apllo.cacheDir=/opt/data/some-cache-dir
# Spring应用通常会使用 Placeholder 来注入配置,如${someKey:someDefaultValue},冒号前面的是 key,冒号后面的是默认值。
2、添加配置文件

resource文件下创建apollo-env.properties指定不同环境的apollo地址。

dev.meta=http://localhost:8080
pro.meta=http://localhost:8081
3、JVM启动参数

JVM启动参数里需要配置环境。

4、启动项目即可

关于SpringBoot启动的说明

一般来说,Apollo的一些配置都写在application.properties配置文件里。
当然,也可以通过JVM参数来指定,详情如下:

# 项目名
-Dapp.id=account-service
# 指定环境,前提需要在resource下的apollo-env.properties指定了对应环境Apollo的地址。
-Denv=pro
# 指定Apollo的地址,与-Denv不要同时出现,即二者选其一
-Dapollo.meta=http://localhost:8080
# 指定缓存地址
-Dapollo.cacheDir=/opt/data/apollo-config
# 指定集群
-Dapollo.cluster=default

一般,我喜欢配置文件来配置这些,JVM参数仅使用-Denv指定环境。

更多详细信息见官方文档

上文内容仅仅作为快速学习Apollo,更多内容见:Apollo官方文档

Apollo - 阿波罗配置中心使用,一文搞定!相关推荐

  1. Apollo阿波罗配置中心基本概述

    1.什么是Apollo: Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流 ...

  2. linux阿波罗配置文件放在哪,Apollo阿波罗配置中心

    一.准备工作 1.2.1 AppId classpath:/META-INF/app.properties  内容app.id=YOUR-APP-ID 1.2.2 Environment 对于Mac/ ...

  3. Apollo阿波罗配置中心

    一.准备工作 1.2.1 AppId classpath:/META-INF/app.properties  内容app.id=YOUR-APP-ID 1.2.2 Environment 对于Mac/ ...

  4. Tomcat卸载重装及为eclipse配置tomcat,一文搞定。

    近来写一个Web的实验报告,但是我的Tomcat又不行了,原本我的eclipse上有两个Tomcat,一个Tomcat8.5,一个是Tomcat9.0.两个突然都不能正常使用,我卸载了又安装,前前后后 ...

  5. SpringCloud - Spring Cloud 之 Apollo Config携程阿波罗配置中心(二十一)

    由于Spring Cloud自带的Config 需要配合 Bus 使用,且不能实时刷新,因此市面上出现了很多开元的配置中心 市面上开源的配置中心 Apollo(阿波罗):携程框架部门研发的分布式配置中 ...

  6. 一文搞定:SpringBoot 集成 Apollo 配置中心

    公众号后台回复"面试",获取精品学习资料 扫描下方海报了解专栏详情 本文来源: http://www.mydlq.club/article/42/ <Java工程师面试突击( ...

  7. 一文搞定,SpringBoot 集成 Apollo 配置中心

    原文: http://www.mydlq.club/article/42/  1.背景 随着程序功能的日益复杂,程序的配置日益增多,各种功能的开关.参数的配置.服务器的地址--对程序配置的期望值也越来 ...

  8. Apollo(阿波罗配置中心学习)- 实用详细

    Apollo系列学习(阿波罗配置中心学习) 一.Apollo配置中心简单介绍 二.Windows 系统搭建基于携程Apollo配置中心单机模式 三.自定义Spring Boot项目通过配置中心启动项目 ...

  9. Apollo-阿波罗配置中心详细使用教程

    Apollo基本概念 一.简介 Apollo - A reliable configuration management system Apollo的Github地址 Apollo(阿波罗)是携程框架 ...

最新文章

  1. 我,斯坦福AI读博,李飞飞是师娘,5年5篇顶会论文,依然一度抑郁怀疑人生
  2. R语言读写二进制文件:WriteBin()、readBin()
  3. 安装Ubuntu16.04并安装sogoupiyin for linux
  4. 你和高级开发的距离,可能还缺这个技术框架……
  5. Spark案例:Scala版统计单词个数
  6. b+树时间复杂度_几分钟学会Java实现图的最小生成树:Kruskal算法
  7. 华为NP课程笔记1-OSPF1
  8. 《Redis视频教程》(p2)
  9. 转载:技术大停滞——范式春梦中的地球工业文明8 反思与总结
  10. java模拟登陆京东_使用httpclient模拟登录京东帐户并抓取帐户信息
  11. 计算机网络安装,计算机网络系统安装操作指南.pdf
  12. Vue-router:二级路由跳转另一条路由下的子级
  13. 51单片机PS2键盘解码实验--C51源代码
  14. 爬虫之理财网站招标产品(Python篇)
  15. JavaScript编程技术基础
  16. CAM350光绘文件检查说明
  17. rgb空间转换为luv
  18. 菜鸡学习笔记:单调栈的应用——瞭望塔
  19. 翻译《CSS权威指南》第3版第1章有感
  20. STM32的8种IO口的模式

热门文章

  1. mysql 1062_mysql #1062 报错
  2. Python A*算法的简单实现
  3. Nginx失败重试中的HTTP协议幂等问题: non_idempotent
  4. 使用FCEUX调试器寻找并修改游戏初始物品
  5. BTE1650 FBL1N/FBL2N/FBL3N/FBL5N-增加客制化字段 客商及科目描述
  6. PicGo+Gitee(码云)搭建个人博客的免费图床
  7. 使用腾讯云服务器搭建个人网盘
  8. 扎拉赞恩 服务器 微信群,魔兽8.0剧透 回归的扎拉赞恩与沃金的骨灰
  9. html表格列宽度 比例,HTML表格的整体宽度,以及各列的宽度均可以由( )属性来控制。...
  10. 项目启动后sqlSessionFactory获取不到创建数据库连接失败