【中间件】配置中心中间件intro

中间件middleware

内容管理

    • why use 配置中心
    • 配置中心feature
    • 配置中心develop
    • 主流配置中心
    • Apollo浅谈


本文从理论上介绍一下服务化中服务治理系统中的配置中心的理论并浅析Apllo


配置在生产中是很关键的一个部分,cfeng在work中遇到几次配置问题引发的问题,如果没有一个方便快捷的配置修改方案,那么不利于产品的快速迭代。

why use 配置中心

配置分离是一个基本的过程,把开关写在代码里面是非常低级的行为。we接触SpringBoot的时候,经常将配置写在yml文件中,但是文件打包发布之后,你如果再修改yml内容,那么就需要再次部署。 可以直接在yml中利用${XXX}的方式将参数设置为变量进行管理,不管是在K8s中配置还是在Potainer中配置都比较快捷, 这就是配置管理的重要性。

配置Configuration是独立于程序的变量: 首先就是配置独立程序,不同的配置程序会有不同的行为。 常见的配置包括: DB Connection、 Thread Pool、 内存Buffer size… ②: 配置贯穿应用的整个生命周期,程序启动时读取配置进行初始化,运行时根据配置进行行为的调整; ③:配置有多种加载方式: 常见的就是程序内部硬编码,配置文件以及环境变量、启动参数、基于DB…

服务化架构下,一个产品可能由多个不同的子系统组成,产品性能的保证依靠所有子系统组成整体的配置的良好管理。 配置中心,就是统一管理项目中所有配置的系统。

没有配置中心之前的配置管理

  1. 小的单体项目之前经常是静态化配置: 项目中存在单独的配置文件,比如log.properties、yml等,但是正如👆所说,参数修改不灵活,有的甚至需要重启项目才行
  2. 配置文件区分环境需要手动编写多个文件,比如application.yml, application_test.yml, application_dev.yml,手动维护可能会因为误操作导致一些问题, 同时多个文件会显得非常分散,不易管理
  3. 配置修改不能追溯: 也就是修改是没有记录的,不会记录历史操作记录,那么都不能进行配置回滚,非常麻烦
上面几个痛点的解决就是配置中心: 
那么一个配置中心需要具有哪些特性来改善?
1. 权限控制: 因为配置会影响程序的行为,配置修改属于敏感操作,需要进行控制
2. 不同环境、集群配置管理: 同一个程序不同环境、不同的集群对应不同的配置,需要完善管理
3.兼容框架类组件配置管理: 框架类组件配置如CAT客户端配置,框架是产品的一部分,这些配置作为产品配置一部分也需要管理起来
...

配置中心feature

配置中心最基本支持的功能就应该是配置的CRUD, 除了基本的配置治理需求之外,对于分布式架构,配置中心还需要具备一下特点:

高可用

服务化系统需要考虑高可用问题,配置是逻辑中非常重要的部分,很大程度决定程序的行为,为避免无法预期的结果,会直接报错,所以配置很关键,需要保证HA

配置热发布

大多数场景下,应用程序的重新发布(重启)代表业务中断,这个会影响产品使用,很多时候的版本迭代可能只是涉及到配置的修改,这个时候如果能够支持热发布【程序运行时更新配置】,那么就可以消除上述影响

不同环境、集群配置管理

公司一般会涉及到不同的环境(比如开发、SIT、UAT、生产…)以及不同的集群(不同地域的机房…),如果手动的复制不同环境的配置文件,会极大增加错误的风险; 那么配置中心如果能够设置规则,并且复制相关的相同的配置… ,可以提高效率

权限管理,操作审核

一些关键的配置会严重影响产品的使用,对于一些配置的修改,应该管控起来,配置的更改应该具有一定的资质(权限),每次配置的修改都应该留存记录,并且应当让产品的高权限者进行审核,以此确保产品的正常发布

灰度发布

配置的重要性不言而喻,cfeng之前work一般发布的时候都会有灰度验证步骤,这是增加了一次试错机会。配置中心需要支持将配置应用到部分实例上, 这样we可以观察配置在这些实例上生效之后的效果,如果符合预期,监控系统没有报错,那么就可以将其应用到所有实例上

版本管理

配置中心的配置的每次修改都应该有记录,并且配置记录具有版本的概念,不同版本的发布应该对应不同的版本。以此支持版本回滚操作

监控&&多语言支持

配置中心应该具备监控功能,这样才能更加保证配置中心的可靠性。配置中心对接的是不同的产品系统,服务端代码当然是配置中心本身决定,但是客户端耦合时,需要支持多种语言支持,方便不同语言编写的系统的接入(一些产品可能go实现、java实现、C++实现…)

配置中心develop

随着业务的不断发展,架构在不断变化,各种新兴业务的接入,配置中心也需要考虑新的困难。

容器化、Serverless、云原生

云原生架构当下是比较热门的,cfeng 之前work中就是这种架构,这种架构会要求无状态的应用程序不要依赖磁盘,而是将数据放到有状态的系统上,like 分布式存储系统和DB… 需要考虑在没有磁盘缓存的场景下,如何保证配置中心的可用性…

并且在没有磁盘缓存的情况下,如果需要扩容 ----- 将应用部署到新的机器上,没有磁盘缓存,如果配置中心服务端连接断开,怎么处理…

写配置HA

大多数场景都会实现配置中心的读配置的高可用,因为配置变动非常低频,【如果发生异常,配置中心无法读取到新的配置,原有的配置也是继续运行的,不会导致服务中断】

但是写配置HA也需要保证, eg:某个机房大量断电,导致某个核心应用不能正常运行,它依赖的一些其他的应用也不能运行,短时间难以恢复。 那么这个时候的解决办法可能是:应用负责人登录配置中心,尝试更改配置,切换URL,部署到其他的机房机器上。 但是如果没有写配置HA,那么这个时候写配置会提示DB错误,不能正常修改,无法达到效果

如何实现写配置HA也是需要考虑的一个问题…

敏感配置

敏感的配置信息:比如数据库的数据源、账号密码,不适合缓存在本地,那么这些敏感数据在配置中心中应该如何正确的进行治理也是需要仔细考虑的一个问题…

主流配置中心

目前市面上流通的配置中心包括baidu开源的Disconf、 Spring Cloud生态中的Spring Cloud Config、 ctrip开源的Apollo、ali开源的Nacos

主流配置中心对比_Leon_Jinhai_Sun的博客-CSDN博客

详细的对比解析这里不再具体展开,Nacos不仅具有配置治理功能,同时还具有注册中心的功能; Spring Cloud Config作为Spring Cloud生态中一员,与Git紧密相关。

Apollo浅谈

Apollo是专业的配置治理中间件。 其分为MySQL、 Config Service、 Admin Service、 Portal(入口)四个模块。

  • MySQL: 用于存储Apollo元数据和相关的用户的配置数据
  • Config Service: 提供配置的读取、推送等功能,客户端的请求直接落点
  • Admin Service:配置的修改、发布等功能,Portal操作的服务就是对应该组件功能
  • Portal: 入口大屏,提供给用户的配置界面

Apollo架构体系、Apollo运行原理、Apollo配置中心简单介绍(一)_apollo(v1.11.8)-CSDN博客

这是Apollo官网给出的时间比较久远的架构,可以看到配置中心也是需要和类似Eureka的注册中心进行交互注册。

Apllo的apollo-client的AbstactConfigFile中:

//AbstractConfigFile 这个类的成员包含ConfigRepository, 获取配置文件需要从仓库中获取protected final ConfigRepository m_configRepository;//要初始化AbstractConfigFile,需要从仓库中获取配置文件加入properies成员中
private void initialize () {...m_configProperties.set(m_configRepository.getConfig);...
}

Repository在应用中经常见到,就是抽象的本地存储,从本地存储中获取config信息加入properties中使用

再看看具体的getConfig方法:

public Properties getConfig() {...sync();...
}//再看看LocalConfigFileRepository类的实现in = new FileInputStream(file);
properties = new Properties();
properties.lodad(in); //可以看到这里就是读取file文件,并且本地缓存不只是支持Properties这种类型文件,在apllo/internals/PlainTextConfigFile中提供了文件支持

Apllo的客户端和服务端之间会保持长连接,这样当然是为了方便进行服务端的推送【配置更新主动推送到客户端】

//apollo-client/... /internals/RemoteConfigLongPollService//连接超时时间为90s
private static final int LONG_POLLING_READ_TIMOUT = 90 * 1000; //设置读超时
HttpRequest request = new HttpRequest(url);
request.setReadTimeout(LONG_POLLING_READ_TIMEOUT);//接收服务端配置更新推送
if(response.getStatusCode() == 200 && response.getBody() != null) {updateNotifications(response.getBody());updateRemoteNotifications(response.getBody());notify(lastServiceDto, response.getBody());
}

客户端发起一个readTimeout为90s的请求,进行配置的推送。

详细的源码解析和简易demo的实现后续会详细展开🌳

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

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

相关文章

计算机基础知识59

MySQL的卸载流程 1、先停止MySQL服务:右键“此电脑”,选择“管理”,之后选择“服务和应用程序”--“服务”,在服务中找到“MySQL”,右键选择“停止”。 2、找到“控制面板”--“程序和功能”,找到MySQL&…

SocialFi 和 GameFi 的碰撞 — Socrates 构建新的 Web3 流量入口

伴随着比特币现货 ETF 即将通过 SEC 批准的消息,整个加密市场在11月份达到了熊市以来的新高峰。市场普遍上涨,新的玩法和项目不断涌出吸引了大量老用户回归以及新用户加入。加密市场经过长期的低迷,终于来到了牛市的起点! 上一轮牛…

Selenium 连接到现有的 Firefox 示例

当前环境: python 3.7 selenium 3.14.1 urllib3 1.26.8 Frefox 115.1.0esr(32位) geckodriver.exe 0.33.0 1 下载 Firefox 浏览器,根据自己的需要选择。 下载 Firefox 浏览器,这里有简体中文及其他 90 多种语言版本…

Python交互式解释器及用法

为了让开发者能快速学习、测试 Python 的各种功能,Python 提供的“python”命令不仅能用于运行 Python 程序,也可作为一个交互式解释器一一开发者逐行输入 Python 代码,它逐行解释执行。 当输入“python”命令时,可以看到如下输出…

带你用uniapp从零开发一个仿小米商场_10. 首页开发

图标菜单栏开发 轮播图开发完成后,就是图标菜单栏了 可以看出这些图标都是一样的样式,所以可以勇哥flex布局让他们每个占百分之20 代码如下,既然都是一样的那就直接用个循环嵌套一下 data数据如下 同样,为了能让这段代码能在别的地方也用到,我直接把它封装成组件 <templ…

【Element】el-switch开关 点击弹窗确认框时状态先改变----点击弹窗取消框失效

一、背景 需求&#xff1a;在列表中添加定期出账的开关按钮&#xff0c;点击开关时&#xff0c;原来的状态不改变&#xff0c;弹出弹窗&#xff1b;点击弹窗取消按钮&#xff1a;状态不改变&#xff0c;点击弹窗确定按钮&#xff1a;状态改变&#xff0c;并调取列表数据刷新页…

LINUX入门篇【10】---进程篇【2】---进程状态

前言&#xff1a; 有了上一篇关于进程的初步认识和我们的PCB第一个数据段–标识符的讲解&#xff0c;接下来我们将继续讲解PCB的其他数据段&#xff0c;本篇要讲的是进程状态。 进程状态&#xff1a; 就像我们写贪吃蛇的时候&#xff0c;构建的游戏状态来判定游戏结束的方式…

代码随想录算法训练营第六十天|84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释…

Linux——使用命令查看文件和文件夹数量

目录 一、相关命令参数解析二、查看当前目录下的文件数量2.1 包含子目录中的文件2.2 不包含子目录中的目录 三、查看当前目录下的文件夹个数3.1 不包含目录中的目录3.2 包含目录中的目录 四、查看当前文件夹下叫某某的文件的数量实例 五、总结 一、相关命令参数解析 "&qu…

java方法引用

MethodReference 前言特定类任意方法引用函数接口特定类调用 前言 JDK1.8之后提供是Lambda&#xff0c;它可以让开发者自定义函数接口中抽象方法的实现&#xff0c;方法引用可以让开发者直接引用已存在的方法。 方法引用的形式: 类::静态方法 类::特定类任意方法 对象::实例方…

MyBatis 操作数据库(入门)

一&#xff1a;MyBatis概念 (1)MyBatis &#x1f497;MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 (2)持久层 1.持久层 &#x1f49c;持久层&#xff1a;持久化操作的层&#xff0c;通常指数据访问层(dao)&#xff0c;是用来操作数据库的 2.持久层的规范 ①…

竞赛选题 题目:基于卷积神经网络的手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

前缀和——1314. 矩阵区域和

文章目录 &#x1f3a4;1. 题目&#x1f3a4;2. 算法原理&#x1f3a4;3. 代码实现 &#x1f3a4;1. 题目 题目链接&#xff1a;1314. 矩阵区域和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#…

[极客大挑战2023] Crypto/PWN/Reverse

这个网站真辛苦&#xff0c;每次都要回到all&#xff0c;屏幕随时卡。界面有待进步老远。也不提示结束&#xff0c;结果现在才听说结束了&#xff0c;才开始记录一下。 还跟往常一样&#xff0c;WM不作&#xff0c;其它也AK不了&#xff0c;总是差点。 Crypto SignIn 53594…

C语言错误处理之<errno.h>与<error.h>

目录 前言 错误号处理方式 errno.h头文件 常见的宏 error.h头文件 参数解释&#xff1a; 关于的”__attribute__“解释&#xff1a; 关于“属性”的解释&#xff1a; 实例一&#xff1a; 实例二&#xff1a; error.h与errno.h的区别 补充内容&#xff1a; 前言 …

6款AI工具网站,赶紧收藏,以备不时之需

1、海鲸AI-支持AI对话、AI文档解析、AI绘画 https://www.atalk-ai.com 海鲸AI是一个AI应用网站&#xff0c;同时支持PC和移动端&#xff0c;它在一个页面上提供了多种模型&#xff08;GPT3&#xff0c;GPT4&#xff0c;文心一言&#xff0c;通义千问&#xff0c;智谱AI&#…

【Vue】记事本

上一篇&#xff1a;Vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5501 本篇所需指令&#xff1a; v- for v-model v-on v-show 目录 删除功能 添加功能 统计功能 清空功能 v-show 删除功能 <!DOCTYPE html> …

一、Lua基础

文章目录 一、Lua是什么二、Lua特性&#xff08;一&#xff09;轻量级&#xff08;二&#xff09;可扩展&#xff08;三&#xff09;其它特性 三、Lua安装四、Lua应用 看到评论说&#xff0c;C让我见识了语言的严谨与缜密&#xff0c;lua让我见识到了语言的精巧与创新&#xff…

Linux:通过VMWare,定制化Linux系统

一、原理图 二、新增磁盘&#xff08;对应上图sdb盘&#xff09; 三、挂载磁盘 主要是四步&#xff1a;查看磁盘&#xff0c;分区磁盘&#xff0c;格式化磁盘&#xff0c;挂载磁盘 1、查看磁盘 2、分区磁盘 3、格式化磁盘 4、挂载磁盘 创建两个备用目录&#xff0c;用于磁盘…

【Kotlin】引入与基础语法

文章目录 Kotlin的特性Kotlin优势Kotlin的安卓项目变量变量保存了指向对象的引用优先使用val来避免副作用 后端变量Backing Fields延迟初始化 Kotlin的特性 它更加易表现&#xff1a;这是它最重要的优点之一。你可以编写少得多的代码。Kotlin是一种兼容Java的语言Kotlin比Java…