【配置中心----Apollo】Apollo的介绍及使用方式

article/2025/8/26 8:14:36

环境SpringBoot 2

一、Apollo简介

项目组最近的项目都是使用springcloud微服务开发,整个微服务框架中分布式的系统服务、集群等等都非常的多。

每一个服务都有着自己的配置(包括参数配置、服务器地址配置、功能开关等都能),当配置需要修改的时候就显得异常的麻烦,传统的通过配置文件、数据库配置完全不能满足要求。

在这种情况下,诞生了很多的统一配置的服务,虽然springcloud有自己的config配置中心,但是和携程的apollo相比还是太弱了,对比之后我们使用了Apollo。

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

github上携程开发人员对Apollo做了特别细致的介绍,但是对于我们只使用springboot进行开发的项目来说,其实只用到了里面一小部分内容。

因此我主要将Apollo和Springboot相关的内容整理出来,本文首先对Apollo进行QuickStart简单入门介绍以及基于Springboot框架的使用。

1.1 Apollo配置中心基础模型

  1. 开发人员在配置中心对某些应用的配置(就是一些键值对的信息)进行修改
  2. 配置中心通知客户端进行配置更新(需要注册监听事件)
  3. Apollo客户端(应用程序)从配置中心拉取更新最新配置

1.2 Apollo的总体设计

上图是Apollo的总体设计,从下往上看:

  • ConfigService(Apollo集成在一个jar包中)提供配置的读取,推送功能,Apollo客户端(你的应用程序)从这儿读取配置。
  • AdminService(Apollo集成在一个jar包中)提供配置的修改、发布功能,Apollo Portal(开发人员登录的修改配置的系统)调用该服务。
  • ConfigService和AdminService都是多实例服务,需要将它们注册到Eureka中。
  • 在Eureka之上有一层MetaServer用于封装Eureka的服务发现接口。
  • Client和Portal通过域名访问MetaServer获取ConfigService和AdminService的服务列表(IP+Port),然后直接通过套接字访问服务。
  • 为了简化部署,实际上会把Configservice、Eureka和MetaServer部署在同一个JVM进程中。

1.3 Apollo配置分类

因为对于不同的应用,在不同的环境(开发、测试)、不同的集群(华东、华北)、不同的命名空间(例如springboot的application.property文件、你自己自定义的myappconfig.property),配置都有可能不同。

所以Apollo支持了4个维度管理Key-Value格式的配置(这些都是可以配置的):

  • application(应用)
    • 在springboot的application.property定义appid这个key的value,标识该类型的应用。
  • environment(4种环境)
    • DEV(开发环境)
    • FAT(功能测试)
    • UAT(验收测试)
    • PRO(生产环境)
  • cluster(集群)
  • namespace(命名空间,其实就是某个应用的不同配置文件)

同时,Apollo基于开源模式开发,开源地址:https://github.com/ctripcorp/apollo

1.4 Apollo特性

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

  • 统一管理不同环境、不同集群的配置
    • 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出于通用性考虑,对配置的修改不会做过多限制,只要符合基本的格式就能够保存。
    • 在我们的调研中发现,对于有些使用方,它们的配置可能会有比较复杂的格式,而且对输入的值也需要进行校验后方可保存,如检查数据库、用户名和密码是否匹配。
    • 对于这类应用,Apollo支持应用方通过开放接口在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制
  • 部署简单
    • 配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能地少
    • 目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来
    • Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数

 1.5 配置获取规则

【本节仅当应用自定义了集群或namespace才需要,如无相关需求,可以跳过本节】

在有了cluster概念后,配置的规则就显得重要了。

比如应用部署在A机房,但是并没有在Apollo新建cluster,这个时候Apollo的行为是怎样的?

或者在运行时指定了cluster=SomeCluster,但是并没有在Apollo新建cluster,这个时候Apollo的行为是怎样的?

接下来就来介绍一下配置获取的规则。

1.5.1 应用自身配置的获取规则

当应用使用下面的语句获取配置时,我们称之为获取应用自身的配置,也就是应用自身的application namespace的配置。

Config config = ConfigService.getAppConfig();

对这种情况的配置获取规则,简而言之如下:

  1. 首先查找运行时cluster的配置(通过apollo.cluster指定)
  2. 如果没有找到,则查找数据中心cluster的配置
  3. 如果还是没有找到,则返回默认cluster的配置

图示如下:

application-config-precedence

所以如果应用部署在A数据中心,但是用户没有在Apollo创建cluster,那么获取的配置就是默认cluster(default)的。

如果应用部署在A数据中心,同时在运行时指定了SomeCluster,但是没有在Apollo创建cluster,那么获取的配置就是A数据中心cluster的配置,如果A数据中心cluster没有配置的话,那么获取的配置就是默认cluster(default)的。
Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,当去服务器读取配置失败时,会使用本地缓存的。

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

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

确保目录存在,且应用有读写权限。

1.5.2 公共组件配置的获取规则

FX.Hermes.Producer为例,hermes producer是hermes发布的公共组件。当使用下面的语句获取配置时,我们称之为获取公共组件的配置。

Config config = ConfigService.getConfig("FX.Hermes.Producer");

对这种情况的配置获取规则,简而言之如下:

  1. 首先获取当前应用下的FX.Hermes.Producer namespace的配置
  2. 然后获取hermes应用下FX.Hermes.Producer namespace的配置
  3. 上面两部分配置的并集就是最终使用的配置,如有key一样的部分,以当前应用优先

图示如下:

public-namespace-config-precedence

通过这种方式,就实现了对框架类组件的配置管理,框架组件提供方提供配置的默认值,应用如果有特殊需求,可以自行覆盖。

1.6 总体设计

overall-architecture

上图简要描述了Apollo的总体设计,我们可以从下往上看:

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

为什么选择Eureka

为什么我们采用Eureka作为服务注册中心,而不是使用传统的zk、etcd呢?我大致总结了一下,有以下几方面的原因:

  • 它提供了完整的Service Registry和Service Discovery实现
    • 首先是提供了完整的实现,并且也经受住了Netflix自己的生产环境考验,相对使用起来会比较省心。
  • 和Spring Cloud无缝集成
    • 我们的项目本身就使用了Spring Cloud和Spring Boot,同时Spring Cloud还有一套非常完善的开源代码来整合Eureka,所以使用起来非常方便。
    • 另外,Eureka还支持在我们应用自身的容器中启动,也就是说我们的应用启动完之后,既充当了Eureka的角色,同时也是服务的提供者。这样就极大的提高了服务的可用性。
    • 这一点是我们选择Eureka而不是zk、etcd等的主要原因,为了提高配置中心的可用性和降低部署复杂度,我们需要尽可能地减少外部依赖。
  • Open Source
    • 最后一点是开源,由于代码是开源的,所以非常便于我们了解它的实现原理和排查问题。

1.7 客户端设计

client-architecture

上图简要描述了Apollo客户端的实现原理:

  1. 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。
  2. 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。
    • 这是一个fallback机制,为了防止推送机制失效导致配置不更新
    • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
    • 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟。
  3. 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
  4. 客户端会把从服务端获取到的配置在本地文件系统缓存一份
    • 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
  5. 应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知

1.7 配置更新推送实现

前面提到了Apollo客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。

长连接实际上我们是通过Http Long Polling实现的,具体而言:

  • 客户端发起一个Http请求到服务端
  • 服务端会保持住这个连接30秒
  • 如果在30秒内有客户端关心的配置变化,被保持住的客户端请求会立即返回,并告知客户端有配置变化的namespace信息,客户端会据此拉取对应namespace的最新配置
  • 如果在30秒内没有客户端关心的配置变化,那么会返回Http状态码304给客户端
  • 客户端在服务端请求返回后会自动重连

考虑到会有数万客户端向服务端发起长连,在服务端我们使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。

1.8 可用性考虑

配置中心作为基础服务,可用性要求非常高,下面的表格描述了不同场景下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自动切换到其它存活的数据中心

 

 

二、Apollo快速开始

携程的开发人员为了让大家几分钟快速上手Apollo配置中心,已经准备了一套安装包,按照教程马上就能部署好了

注意windows环境要安装能运行bash脚本的软件如gitbash QuickStart github地址。

安装包在不同的端口安装了配置中心的不同服务:

  • http://localhost:8070 Portal客户端的服务
  • http://localhost:8080 ConfigService、MetaServer、Eureka服务
  • http://localhost:8090 可能是AdminService服务

2.1 打开 http://localhost:8070 进入配置中心就可以对各种应用进行配置(修改键值对)

进入配置中心就可以新建项目(对应你的应用)
比如你有一个叫KiddService的接口,可以给它起一个唯一标识的应用Id(这里我叫kiddApp),提交之后在主页就可以看到了。

进入该项目的配置,先发布后配置或先配置后发布都行,这样你的应用就可以从配置中心拉取配置了。

编辑配置,其实就是添加或修改键值对

2.2 Springboot客户端连接Apollo配置中心

使用Springboo客户端连接Apollo特别的简单,只需要几步:

  • 必要的设置

    • AppId,在application.properties文件加入指定appId,app.id=YOUR-APP-ID。
    • Apollo Meta Server,前面说过,这是对Eureka的一个封装服务,主要是用来得到ConfigServer的地址。在application.properties或bootstrap.properties中指定apollo.meta=http://config-service-url。
    • 本地配置缓存路径,确保目录存在
      • Mac/Linux: /opt/data/{appId}/config-cache
      • Windows: C:\opt\data{appId}\config-cache
  • 可选设置

    • Environment(上面说的四种环境)
      • 在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT
      • 还可以通过操作系统的System Environment ENV来指定
      • 通过配置文件来指定env=YOUR-ENVIRONMENT;(windows C:\opt\settings\server.properties)(linux /opt/settings/server.properties)
    • Cluster(集群)
      • 在Java程序启动脚本中,可以指定-Dapollo.cluster=SomeCluster
      • 过Spring Boot的配置文件,apollo.cluster=SomeCluster
      • 可以在server.properties配置文件中指定idc=xxx

例如在我的quickstart测试环境中我在application.properties文件中只要如下配置就行了:

server.port=9017
app.id=apolloapp
apollo.meta=http://127.0.0.1:8080

Maven Dependency(maven的依赖)

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

获取本应用的配置

在springboot下获取配置的方法有很多种,以我开发的KiddService为例:

    Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never nullString someKey = "key1";String someDefaultValue = "none";String value = config.getProperty(someKey, someDefaultValue);
@Configuration
@EnableApolloConfig
public class AppConfig {@Beanpublic TestJavaConfigBean javaConfigBean() {return new TestJavaConfigBean();}
}
public class TestJavaConfigBean {@Value("${timeout:100}")private int timeout;private int batch;@Value("${batch:200}")public void setBatch(int batch) {this.batch = batch;}public int getTimeout() {return timeout;}public int getBatch() {return batch;}
}

一般所有的配置放在一个bean里面就可以了

 

 

 


http://chatgpt.dhexx.cn/article/ZVfKqTYA.shtml

相关文章

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

Apollo基本概念 一、简介 Apollo - A reliable configuration management system Apollo的Github地址 Apollo&#xff08;阿波罗&#xff09;是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理应用的不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送…

Apollo配置中心介绍

一、背景 最近公司订单中心重构&#xff0c;利用spring boot集成apollo配置中心&#xff0c;因此学习一下apollo配置中心 因为如今程序功能越来越复杂&#xff0c;程序的配置日益增多&#xff1a;各种功能的开关、参数配置、服务器地址、数据库链接等 对于配置的期望值越来越…

你们信不信,everyting找不全文件

everything这个软件思路,很好.查名字.找文件. 可是这个软件有两大缺点: 一,内存占用太大,500M,这还只是我1千万文件下面的情况,我还屏蔽了很大部分.要是3,4千万,everything根本启动不了. 二,搜索文件不全,不相信,看证据: 这是我保存在百度下载里面的文件,我没有加入排除列表. …

搜索工具 Everything 的简单设置

文章目录 1、常规2、界面3、结果4、视图&#xff08;重要修改&#xff09;5、字体与颜色&#xff08;重要修改&#xff09;1&#xff09;高亮部分 &#xff0c;对其 前景色 设置 自定义为 红色2&#xff09; 鼠标悬停 &#xff0c;对其 背景色 设置 自定义为 浅蓝色3&#xff0…

通过Everything 快速搭建局域网内文件服务器

文章目录 通过Everything 快速搭建局域网内文件服务器1、软件下载2、通过工具里面的Http 服务器构建局域网文件服务器3、通过局域网IP 或者自己的电脑访问 通过Everything 快速搭建局域网内文件服务器 1、软件下载 传送门 安装软件请自行完成&#xff0c;一路next 2、通过工…

Everything排除某个目录、隐藏文件、系统文件

工具——选项——索引——排除列表

Everything扫描非C盘

Tools>>Options>>Rescan Now

C# 调用Everything查找文件

Everything everything的下载 https://www.voidtools.com/zh-cn/ 在下载页面往下拉&#xff0c;我们还需要 Everything的命令行接口工具 ES.exe ES.exe的使用 在官网中也有介绍这个工具如何使用以及一些案例&#xff0c;https://www.voidtools.com/zh-cn/support/everythi…

everything-everything使用技巧,过滤文件语法

文章目录 前言技巧everything 搜索条件的与或非everything过滤文件语法 前言 everything是个神器无需多言&#xff0c;能在几秒内从几百G的windows系统文件中找到符合你需求的文件和文件夹&#xff0c;赞叹不已 技巧 everything 搜索条件的与或非 everything可以多条件搜索…

【搜索神器——Everything】的下载安装使用教程

1. 软件介绍 Everything是voidtools开发的一款文件搜索工具&#xff0c;是一个运行于Windows系统&#xff0c;基于文件、文件夹名称的快速搜索引擎&#xff0c;它在搜索之前会把所用的文件和文件夹都列出来&#xff0c;与Windows自带的搜索系统不一样&#xff0c;所以我们称之为…

【高效办公】Everything高效应用案例——软件基本信息篇

软件基本信息篇 『20』Everything软件简介"Everything"是Windows上文件名搜索引擎,其基于名称快速定位文件和文件夹。软件小巧轻便,高效易用,具有以下特点: 轻量安装文件;干净简洁的用户界面;快速文件索引;快速搜索;快速启动;最小资源使用;轻量数据库;实时…

Everything 搜索失败问题解决

平时用的好好的 Everything 突然某一天用不了了&#xff0c;什么东西都搜不出来了…… 就搜桌面上摆着的文件都搜不出来…… 下文介绍下我的解决方案 解决方案 任务栏找到 Everything 图标&#xff0c;右键 选项(O) 找到索引&#xff0c;点击强制重建&#xff0c;点应用&…

Windows 搜索神器,Everything、AnyTXT

Everything与AnyTXT&#xff0c;可以称得上是Windows平台两大搜索利器了 它们都着重于改善Windows自身搜索慢的问题&#xff0c;用以提高工作效率 但功能上的侧重点却各不相同 搭配使用效果更佳&#xff0c;下载链接在最后 AnyTXT Searcher AnyTXT是一款非常强大的本地文档…

快速批量给文件重命名

目标检测数据集需要有序&#xff0c;也算是目标检测前置任务的一个小技巧&#xff0c;相关前置任务&#xff1a;目标检测YOLOv5数据集怎么找&#xff1f;_牛大了2022的博客-CSDN博客 目标效果 一、下载Everything 我在联想商店直接下载的&#xff0c;很轻量 二、在文件夹把文件…

Everything快捷打开搜索,电脑everything软件怎么设置快捷键

Everything快捷打开搜索&#xff0c;电脑everything软件怎么设置快捷键 简介 Everything是一款强大的快捷搜索电脑软件&#xff0c;开源并且免费&#xff0c;但有一部分小伙伴不知道如何更快捷的唤醒everything&#xff0c;这个教程简单介绍一下everything快捷方式的设置方法…

安装wsl下的kali linux时出现的包的问题

在apt-get install kali-linux-everything的过程中由于中途我退出几次重新apt-get install kali-linux-everything的缘故&#xff0c;导致了解包时出现了如图所示的失败。 我的做法就是sudo vim /var/lib/dpkg/status 然后进入到status文件中编辑&#xff0c;将它报错的那几个…

SegGPT: Segmenting Everything In Context

目录 摘要本文方法上下文着色Context EnsembleIn-Context Tuning 消融实验 摘要 最近基于大规模数据的模型越来越火了&#xff0c;chat GPT以及seg everything&#xff0c;感觉后面很多像目标检测&#xff0c;图像恢复等等都会出现这种泛化能力强&#xff0c;基于大规模数据的…

Everything下载

1.下载everything&#xff0c;官方下载地址&#xff1a; https://www.voidtools.com/zh-cn/ 根据自己的电脑选择版本。 2.双击下载好的文件&#xff0c;可以更改下载地址到非系统盘。 3.其他配置都默认即可。 4.下载成功。

项目实战——search-everything搜索工具

目录 项目概要 项目大纲 项目准备 项目代码与映射关系 工具包 util 拼音工具 PinyinUtil 创建SQLite数据源 DBUtil 通用工具类 Util 在界面初始化时创建文件信息数据表 DBInit 资源文件 resourse 数据表信息 init.sql 项目界面 app.fxml 软件工作包 app 数据表记…

everything搜索结果 如何不显示已经删除的文件 排除回收站 或者其他目录

按图操作&#xff1a; 添加过滤器 ?:$recycle.bin &#xff0c; 其中&#xff1f;代表任意字符&#xff0c;即包括各个盘下的回收站。之后搜索结果中不再显示已经删除的文件 排除其他文件夹或者过滤器类似&#xff0c;举例&#xff1a; 点击添加文件夹&#xff0c;添加C:\…