Apollo配置中心最佳实践

携程配置中心地址:GitCode - 全球开发者的开源社区,开源代码托管平台

1.1      Apollo配置中心介绍

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

主要特性:

Apollo

功能特性

  静态配置管理

支持

  动态配置管理

支持

  统一管理

支持

  多维度管理

支持(应用、环境、集群、命名空间)

  本地配置缓存

支持

  配置生效时间

实时

  配置更新推送

支持

  配置定时拉去

支持

  用户权限管理

支持

  授权、审核、审计

支持

  配置版本管理

支持

  配置合规检测

支持

  实例配置监控

支持

  灰度发布

支持

  告警通知

支持,邮件方式告警

  OpenAPI

支持

技术路线

支持SpringBoot

支持

支持SpringCloud 

支持

客户端支持

Java.Net

业务系统侵入性

侵入性弱

依赖组件

Eureka

可用性

单点故障(SPOF)

支持HA部署

多数据中心部署

支持

配置获取性能

官方说比spring

易用性

配置界面

统一界面(一个界面多个服务)

社区活跃度

非常高

1.1.1  核心概念

1.1.1.1     application (应用)

实际使用配置的应用,需要有唯一的身份标识 -- appId

从而可以去获取对应的配置。

1.1.1.2     environment环境

配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置

我们认为环境和代码无关,同一份代码部署在不同的环境就应该能够获取到不同环境的配置

1.1.1.3          cluster (集群)

一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。

对不同的cluster,同一个配置可以有不一样的值,如dubbo地址。

1.1.1.4     namespace (命名空间)

一个应用下不同配置的分组,可以简单地把namespace类比为

文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等

例如:

应用里面redis配置地址

Apollo namespace对应为:

1.1.2  整体架构

简易模型

1.1.2.1    四个核心模块及其主要功能

1. ConfigService

  • 提供配置获取接口
  • 提供配置推送接口
  • 服务于Apollo客户端

2. AdminService

  • 提供配置管理接口
  • 提供配置修改发布接口
  • 服务于管理界面Portal

3. Client

  • 为应用获取配置,支持实时更新
  • 通过MetaServer获取ConfigService的服务列表
  • 使用客户端软负载SLB方式调用ConfigService

4. Portal

  • 配置管理界面
  • 通过MetaServer获取AdminService的服务列表
  • 使用客户端软负载SLB方式调用AdminService
1.1.2.2      客户端设计

1.2     NameSpace数据结构

1.2.1  权限

说明:针对应用对应的客户端来说

  1. 私有权限private只能被所属的应用获取到。
  2. 公有权限public能被任何应用获取。

1.2.2  类型

  1. 私有类型的Namespace具有private权限。
  2. 公共类型的Namespace具有public权限,所以公共的Namespace的名称必须全局唯一。
  3. 关联类型又可称为继承类型,关联类型具有private权限。

关联类型的Namespace继承于公共类型的Namespace

用于覆盖公共Namespace的某些配置。

1.3     权限说明

1.3.1  用户权限

1.3.2  使用场景

以广告系统为例

  Apollo配置中心地址:GitCode - 全球开发者的开源社区,开源代码托管平台

1.4     客户端加载机制

1.4.1  Springboot集成

ApolloSpring/SpringBoot集成的手段:在应用启动阶段,Apollo从远端获取配置,然后组装成PropertySource并插入到第一个即可,如下图所示:

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

加载顺序

1. 首先查找运行时cluster的配置(通过apollo.cluster指定)

2. 如果没有找到,则查找数据中心cluster的配置

3. 如果还是没有找到,则返回默认cluster的配置

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

如果应用部署在A数据中心,同时在运行时指定了SomeCluster,但是没有在Apollo创建cluster,那么获取的配置就是A数据中心cluster的配置,如果A数据中心cluster没有配置的话,那么获取的配置就是默认clusterdefault)的。

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

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

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

1. 首先获取当前应用下的FX.Hermes.Producer namespace的配置

2. 然后获取hermes应用下FX.Hermes.Producer namespace的配置

3. 上面两部分配置的并集就是最终使用的配置,如有key一样的部分,以当前应用优先

1.4.3  广告系统使用

1.4.3.1          统一引入客户端

优势:

1、统一管理版本。

2、便于SPI扩展。

1.4.3.2    必选设置

appIdMeta Server、本地缓存路径

appId

  1. System Property

通过System Property传入app.id信息,如

-Dapp.id= iss-advert001

  1. Spring Boot application.properties

通过Spring Bootapplication.properties文件配置,如

app.id= iss-advert001

  1. app.properties

确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:

app.id= iss-advert001

Apollo Meta Server

  1. 在Java程序启动脚本中,可以指定-Dapollo.meta=http://config-service-url
  2. 通过Spring Boot的配置文件

    可以在Spring Bootapplication.properties中指定   apollo.meta=http://config-service-url

  1. 通过操作系统的环境变量指定APOLLO_META
  2. 通过server.properties配置文件
  • 可以在server.properties配置文件中指定apollo.meta=http://config-service-url
  • 对于Mac/Linux,文件位置为/opt/settings/server.properties
  • 对于Windows,文件位置为C:\opt\settings\server.properties
  1. 通过app.properties配置文件

可以在classpath:/META-INF/app.properties指定apollo.meta=http://config-service-url

  1. 通过Java system property ${env}_meta

如果当前envdev,那么用户可以配置-Ddev_meta=http://config-service-url

如果通过以上各种手段都无法获取到Meta Server地址,Apollo最终会fallbackhttp://apollo.meta作为Meta Server地址

本地缓存路径

默认

  • Mac/Linux: /opt/data/{appId}/config-cache
  • Windows: C:\opt\data\{appId}\config-cache
  1. 通过Java启动参数 -Dapollo.cacheDir= /mnt/iss/web/
  2. 通过Spring Boot的配置文件

可以在Spring Bootapplication.propertiesbootstrap.properties中指定apollo.cacheDir=/mnt/iss/web/

  1. 通过操作系统的环境变量APOLLO_CACHEDIR
  2. 通过server.properties配置文件
1.4.3.3    可选设置

Environment

  1. 1.   通过Java System Property

可以通过Java的System Property env来指定环境

在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT

如果是运行jar文件,需要注意格式是java -Denv=YOUR-ENVIRONMENT -jar xxx.jar

注意key为全小写

  1. 2.   通过操作系统的System Environment

还可以通过操作系统的System Environment ENV来指定

注意key为全大写

通过配置文件

  1. 3.   最后一个推荐的方式是通过配置文件来指定env=YOUR-ENVIRONMENT

对于Mac/Linux,文件位置为/opt/settings/server.properties

对于Windows,文件位置为C:\opt\settings\server.properties

文件内容形如:

env=DEV

Cluster(集群)

通过Java System Property apollo.cluster

在Java程序启动脚本中,可以指定-Dapollo.cluster=SomeCluster

  1. 通过Spring Boot的配置文件

可以在Spring Bootapplication.propertiesbootstrap.properties中指定apollo.cluster=SomeCluster

  1. 2.   通过server.properties配置文件
  2. 3.   可以在server.properties配置文件中指定idc=xxx

对于Mac/Linux,文件位置为/opt/settings/server.properties

对于Windows,文件位置为C:\opt\settings\server.properties

综上:

Springboot  application.properties:指定

app.id=iss-advert001
#配置中心缓存文件目录,配置于此,便于开发人员调试更改本地路径
apollo.cacheDir=../jar包上一层目录   /mnt/iss/web
/mnt/iss/boot/应用名/cache ../webapp/    

方案一:选用

    Java程序启动脚本中,指定

     -Denv=YOUR-ENVIRONMENT
     -Dapollo.cluster=SomeCluster
     -Dapollo.meta=http://config-service-url

此方案涉及多个环境,需要配置对应的启动脚本。

方案二:

     通过server.properties配置文件

      对于Mac/Linux,文件位置为/opt/settings/server.properties

env=DEV
idc=SomeCluster
apollo.meta=http://config-service-url

机器上配置对应的集群名字和注册中心地址

应用对应的缓存目录部署应用时不用删除。

1.4.3.4    客户端使用
  1. 直接以API方式使用:
  2. 基于XML的配置
@ApolloConfig
private Config config; //inject config for namespace application

1.注入默认namespace的配置到Spring

http://www.ctrip.com/schema/apollo http://www.ctrip.com/schema/apollo.xsd
<!-- 这个是最简单的配置形式,一般应用用这种形式就可以了,用来指示Apollo注入application namespace的配置到Spring环境中 -->
    <apollo:config/>
    <!-- 这个是稍微复杂一些的配置形式,指示Apollo注入FX.apolloFX.soa namespace的配置到Spring环境中 -->
    <apollo:config namespaces="FX.apollo,FX.soa"/>

  1. 基于Java的配置(推荐)

注意@EnableApolloConfig要和@Configuration一起使用,不然不会生效。

客户端应用ID

建议项目名称

1.5     部署架构方案

1.6     服务端客户端通信

1.6.1.1    实时生效(1s)

  1. 用户在 Portal 操作配置发布
  2. Portal 调用 Admin Service 的接口操作发布
  3. Admin Service 发布配置后,发送 ReleaseMessage 给各个Config Service
  4. Config Service 收到 ReleaseMessage 后,通知对应的客户端

portal发布配置流程:12

34

Admin Service在配置发布后,需要通知所有的 Config Service有配置发布,从而 Config Service 可以通知对应的客户端来拉取最新的配置。

具体实现

  1. RemoteConfigRepository ,定时轮询 Config Service 的配置读取 /configs/{appId}/{clusterName}/{namespace:.+} 接口。
  2. RemoteConfigLongPollService ,轮询 Config Service 的配置变更通知 /notifications/v2 接口。
  3. 当有新的通知时,触发 RemoteConfigRepository ,立即轮询 Config Service 的配置读取 /configs/{appId}/{clusterName}/{namespace:.+} 接口。

²  一个 Namespace 对应一个 RemoteConfigRepository

²  多个 RemoteConfigRepository ,注册到全局唯一 RemoteConfigLongPollService 中。

为什么不在 long polling 的返回结果中直接返回更新的结果呢?

   保持逻辑的简单,目前的做法推送只负责做简单的通知,不需要去计算客户端的配置应该是什么,因为计算逻辑挺复杂的,需要考虑集群,关联,灰度等。

在满足幂等性,实时性的基础上保持设计的简单

推拉结合?

1client 的定时轮询,可以保持最终一致。

2client 的长轮询,是定时轮训的实时补充。

 Apollo配置中心地址:GitCode - 全球开发者的开源社区,开源代码托管平台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASM字节码插桩实现点击防抖

思路&#xff1a;在点击事件onclick的时候&#xff0c;将view的onclick在给定的时间给拦截掉。以前我们可能都是用一个util来拦截&#xff0c;这样在每个点击事件都得去判断&#xff0c;那么这里就用字节码插桩的形式来实现一下。 ASM的引入 dependencies {implementation gr…

QT day01

思维导图 QT编程 实现一个账号登录界面 代码&#xff1a; myweidget.h #ifndef MYWEIDGET_H #define MYWEIDGET_H#include <QWidget> #include <QIcon> //图标类 #include <QLineEdit> //行编辑器类 #include <QLabel> //标签类 #…

【Redis】安装和命令行客户端

https://www.bilibili.com/video/BV1cr4y1671t https://www.oz6.cn/articles/58 redis 非结构化有&#xff1a; 键值类型(Redis)文档类型(MongoDB)列类型(HBase)Graph:类型(Neo4j) 扩展性&#xff1a;水平即为分布式扩展 redis特征 键值&#xff08;key-value&#xff09;型…

【springBoot学习篇】springBoot集成mybatis

目录 第一步&#xff1a;新建spring项目的时候&#xff0c;需要勾选mybatis框架和jdbc连接数据库的包 第二步&#xff1a;在resource目录下面的配置文件当中添加以下的内容&#xff1a;配置数据源 第三步&#xff1a;配置实体类 第四步&#xff1a;添加一个对象的增删改查方…

上位机图像处理和嵌入式模块部署(h750 mcu和图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;h750和之前的103、407相比较&#xff0c;本身cpu频率比较高&#xff0c;flash大小一般&#xff0c;但是ram比较大&#x…

群辉其它方案远程访问(ZeroTier篇)

目录 1、注册ZeroTier 2、创建网络 3、下载安装客户端 (1)Windows (2)移动端 i.Android i.iOS (a)注册新ID (b)登陆苹果应用商店 iii.群辉NAS 4、客户端加入网络 (a)Windows (b)Android (c)群辉NAS 5、使用 群辉的远程访问,最标准的做法就是使用…

自动控制原理【期末复习】(二)

无人机上桨之后可以在调试架上先调试&#xff1a; 1.根轨迹的绘制 /// 前面针对的是时域分析&#xff0c;下面针对频域分析&#xff1a; 2.波特图 3.奈维斯特图绘制 1.奈氏稳定判据 2.对数稳定判据 3.相位裕度和幅值裕度

【全篇】Python从零基础到入门

文章目录 第一章 基础语法1.字面量2.注释3.变量4.数据类型5.数据类型转换6.标识符7.运算符8.字符串拓展1.字符串的三种定义方式2.字符串拼接&#xff08;不用&#xff09;3.字符串格式化&#xff08;了解&#xff09;4.格式化的精度控制5.字符串格式化2&#xff08;常用&#x…

跟《经济学人》学英文:2024年6月8日这期:Part 01

本文是对《经济学人》杂志2024.6.8这期的英文学习。 Narendra Modi looks likely to serve a third term as India’s prime minister, after his Bharatiya Janata Party and its allies won a slim majority. The ruling alliance won 293 seats, compared with the opposi…

【代码随想录】【算法训练营】【第36天】[452]用最少数量的箭引爆气球 [435]无重叠区间 [763]划分字母区间

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 36&#xff0c;周三&#xff0c;最难坚持的一天~ 题目详情 [452] 用最少数量的箭引爆气球 题目描述 452 用最少数量的箭引爆气球 解题思路 前提&#xff1a;区间可能重叠 思路&#xff1a;…

YOLO系列理论解读 v1 v2 v3

YOLO系列理论解读 YOLO v1&#xff08;You Only Look Once:Unified, Real-Time Object Detection&#xff09; YOLO v1实现步骤 将一幅图像分成SxS个网格(grid cell)&#xff0c;如果某个object的中心落在这个网格中&#xff0c;则这个网格就负责预测这个object。 通常情况…

服务器无法远程桌面连接,解决服务器进行无法远程桌面连接方法有哪些

当服务器无法建立远程桌面连接时&#xff0c;通常涉及多个层面的排查和修复。下面将详细列举一些专业的解决方法&#xff0c;以应对服务器远程桌面连接问题。 一、基础排查与验证 1. 确认网络连通性&#xff1a; - 使用ping命令检查客户端与服务器之间的网络连通性。 - …

数组(C语言)(详细过程!!!)

目录 数组的概念 一维数组 sizeof计算数组元素个数 二维数组 C99中的变⻓数组 数组的概念 数组是⼀组相同类型元素的集合。 数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般比较多见的是二维数组。 从这个概念中我们就可以发现2个有价值的信息&#xff1a;(1)数…

什么是相对路径?什么是绝对路径?打包时路径怎么搞?

简单点说&#xff1a; 绝对路径&#xff1a;绝对路径是一个完整的路径&#xff0c;从根目录开始一直到目标文件或目录的路径。通常我们直接使用"/ "代表从根目录开始的目录路径。它提供了文件或目录在文件系统中的确切位置&#xff0c;与当前工作目录无关。绝对路径…

AMS深入浅出

目标&#xff1a; 1. 一、AMS启动流程 ActivityManagerService是 安卓10 以后&#xff0c;将AMS拆分出ActivityTaskManagerService。 1.1 启动入口 AMS是由SystemServer进程启动&#xff0c;在启动过程 startBootStripService&#xff0c;会启动AMS和ATMS服务。 SystemSe…

外卖跑腿APP开发指南:探索同城O2O系统源码技术要点

同城O2O系统作为这类服务的技术支撑平台&#xff0c;承载了外卖跑腿APP的开发与运行。本篇文章&#xff0c;小编将深入探讨同城O2O系统源码的技术要点&#xff0c;为外卖跑腿APP的开发提供指导与参考。 一、同城O2O系统概述 同城O2O系统是一种基于地理位置的线上到线下服务平台…

“论多源数据集成及应用”必过范文,突击2024软考高项论文

论文真题 在如今信息爆炸的时代&#xff0c;企业、组织和个人面临着大量的数据。这些数据来自不同的渠道和资源&#xff0c;包括传感器、社交媒体、销售记录等&#xff0c;它们各自具有不同的数据格式、分布和存储方式。因此如何收集、整理和清洗数据&#xff0c;以建立一个一…

阅读源码解析dynamic-datasource-spring-boot-starter中是如何动态切换数据源的

dynamic-datasource-spring-boot-starter是苞米豆提供的一个动态切换数据源的工具&#xff0c;可以帮助企业或者个人实现多数据源的切换&#xff0c;这里通过阅读源码的方式解析是如何动态的切换数据源的&#xff0c;采用的版本是3.5.1 源码解析 通过官方文档可以看到&#x…

vue 和 js写屏幕自适应

实现屏幕自适应的方式有很多种&#xff0c;可以通过插件本身提供的方法&#xff0c;可以通过flex布局等&#xff0c;今天我们来写写通过js实现屏幕自适应。 以下是在vue中实现的屏幕自适应 首先在data中定义一下屏幕的默认大小和缩放比例 然后在mounted中获取窗口的内置宽高&a…

揭秘软件测试秘籍:测试用例设计方法大揭秘

文章目录 引言一、等价类划分1.1 定义1.2 步骤1.3 等价类划分优点和缺点 二、边界值分析法2.1 定义2.2 步骤2.3 边界值分析法的优点和缺点 三、判定表法3.1 定义3.2 步骤3.3 判定表组成不分3.4 判定表的优点和缺点 四、正交实验法4.1 定义4.2 步骤4.3 正交实验法的优点和缺点 五…