配置即代码:先有鸡还是先有蛋

2024-04-14 12:48
文章标签 配置 代码 先有

本文主要是介绍配置即代码:先有鸡还是先有蛋,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们来编个故事

咕咕哒公司是一家新型数字化养鸡场企业。养鸡场使用基础设施即代码的理念。操控流水线完全自动化构建和部署新的养鸡场及更新旧养鸡场。这一举措致使公司可以统一管理旗下养鸡场,生产的鸡蛋质量统一,部署过程完全自动化,无人化,极大的避免了人为错误。目前公司业务进展顺利,开始全面开始拓展市场。

事件

因为不同地域的气候特征以及饲料供应链差异,公司发现使用同一种品种已无法满足适应市场拓展的需求。于是公司决定使用在不同地区饲养适应该地区的特殊品种。这些地域性的配置一开始是作为参数被各地区在基础设施构建后,以手动复写配置文件的方式独立管理的,在实际的应用过程中产生了几个问题:

  1. 配置分散:自动化构建生成的基础设施相关配置(如数据库连接串)由基础设施脚本管理,而地域性配置由当地环境线上部署文件管理,总部不可控。
  2. 配置不可见:一个地域的配置需要下载这个地域线上的配置文件才能知道这个地域环境的配置是什么。
  3. 配置无唯一可信源:自动化构建生成的配置可被区域性配置复写,省级配置可被市级配置复写。最终环境上一项配置是由谁配的,被谁复写过,为什么最终是这个配置无法溯源。
  4. 配置修改门槛高:因为修改或增加配置需要复写线上部署文件,需要了解底层部署原理才能进行操作。这个任务往往最终转变成DevOps的任务,给DevOps带来了不必要的负担。而且人为错误可能性大幅提升。

为保证不影响作为公司核心竞争力的自动构建和自动部署。公司决定在基础设施构建过程中引入使用配置即代码的配种(配置)中心来解决上述问题,集中并自动化管理配置。

争议

是先有配置中心(🐔鸡)还是先有基础设施及代码(🥚蛋)?
如果先有配置中心,那配置中心又是如何构建出来的?
如果先有基础设施及代码,那配置其实是由基础设施及代码来管理吗?

方案一:先有配置中心

配置中心管理所有配置并独立于基础设施及代码之上存在。

脚本

(图一)

(图二)

方案一的实现
  1. 在原有的养鸡场基础设施即代码之外新增一个配置中心。这个配置中心可以是在运行养鸡场构建之前手动创建的,或(如图二)由另一套基础设施及代码脚本独立构建的。
  2. 配置中心里保存养鸡场基础设施及代码的所有通用配置(包含基础设施参数和业务配置),各区域管理人员统一在总部这个唯一的配置中心里添加自己区域的特殊配置(包含特殊的基础设施参数和业务配置)。
  3. 在构建基础设施时由配置中心中所有带有基础设施标签的配置生成配置文件用于构建。
  4. 养鸡场直接连接配置中心(或连接中央配置中心的只读副本)并获得所有适用于改地域的业务配置。
讨论
  1. 问:是否坚持遵循基础设施即代码?

    答:应该,否则无法使用流水线自动化构建。

  2. 问:是否引入配置即代码?

    答:应该,因为上一个问题决定了这个配置中心应该可以自动被构建,所以配置也要在构建过程中写入。

结果

需要拆出(如图二)的第二套基础设施即代码。

优势
  1. 基础设施配置与业务配置在同一地点集中管理。
  2. 利用配置中心UI展示配置,所见即所得。标签区分基础设施 vs. 业务,通用 vs. 地域等。至多一次复写。
  3. 配置中心即为唯一可信源,方便公司可以统一管理。
  4. 利用配置中心UI维护配置简单方便。
劣势
  1. 配置中心成为基础设施构建部署整套流程的单点故障。
  2. 配置中心引入与养鸡场基础设施生命周期不同的基础设施,破坏基础设施即代码的完整性。
  3. 讨论结果导致最终方案需要实现了方案一与方案二的混合策略。这引入了方案二的所有缺点,直接破环了这个设计的初衷。

方案二:先有基础设施及代码

配置中心只管理所有业务配置,并由基础设施及代码(配置即代码)管理。

(图三)

实现
  1. 在原有的养鸡场基础设施即代码中加入一个配置中心的构建模块。
  2. 公司集中为每一个地域管理一套配置即代码(包括基础设施的参数与业务配置),并在这个地域的基础设施构建时将业务配置写入为这个地域构建的配置中心中。
  3. 养鸡场直接连接配置中心获取业务配置。
讨论
  1. 问:如果通过手动修改配置中心的方式改变业务配置,会不会导致配置即代码不可信?

    答:会,配置即代码并不能代表线上环境真实使用的配置。

  2. 问:配置即代码是不是应只管理业务配置的初始值?

    答:不,基础设施即代码或配置即代码修改后应用时会覆盖修改过的配置。

结果

引入“业务修改配置后应相应修改配套配置即代码”规则。

优势
  1. 基础设施配置与业务配置在同一地点集中管理,并原生遵循配置即代码。
  2. 利用配置中心UI展示业务配置,所见即所得。没有复写。基础设施参数与业务配置相隔离,可以只由DevOps管理。
  3. 配置即代码为唯一可信源,方便公司统一管理。
  4. 修改配置即代码相对与修改线上部署降低了修改配置的门槛。
劣势
  1. 引入的规则导致配置新增或修改后需要修改配置即代码,相比方案一维护门槛上升。
  2. 如果规则执行力度不够,也会直接破环可信度。
  3. 引入的规则导致配置中心不能直接用来管理配置,UI只用做配置展示,配置中心成为鸡肋。

实操迭代:分离基础设施配置和应用配置

分治基础设施配置和应用(业务)配置。应用配置使用方案一,基础设施配置使用方案二。

(图四)

实现
  1. 在原有的养鸡场基础设施即代码中加入两个配置中心的构建模块。
  2. 公司集中为每一个地域管理一套配置即代码(只包括基础设施的参数)和一套含有默认业务配置的脚本。在这个地域的基础设施构建时,将基础设施配置的实际值和业务配置的默认值分别写入为这个地域构建的两个配置中心中。
  3. 地域管理者在基础设施构建完成后自行修改并确认业务配置后开始运作。
  4. 养鸡场连接基础设施配置中心获得如数据库连接串等在基础设施构建时生成的配置,并连接应用配置中心获得如缓存时间等业务配置。
优势
  1. 基础设施配置与业务配置各自在同一地点集中管理,基础设施配置原生遵循配置即代码。
  2. 利用配置中心UI展示业务配置,所见即所得。没有复写。
  3. 基础设施配置即代码即为唯一可信源,方便公司可以统一管理。
  4. 基础设施参数与业务配置完全隔离。
  5. 区域业务配置中心为该区域唯一可信源,方便该区域统一管理。
  6. 区域业务配置可以直接利用配置中心UI维护配置简单方便。
劣势
  1. 业务配置不遵循配置即代码,要求上线前由区域业务人员手工确认配
    置。
  2. 公司无法集中管理业务配置,仅限管理业务配置的默认值。
  3. 两套配置中心,增加成本和维护复杂度。

结语

虽然文章的最后提出了我们在实际项目中经过筛选和迭代后实操的方案,但这一方案也并没有完美的解决配置即代码的鸡生蛋蛋生鸡的问题。反而相比于方案二,迭代方案在业务配置上对配置即代码的管理方式做出了让步,从而去除了强制业务使用代码管理配置的门槛。

方案一是认定先有鸡(配置中心),而对第一只鸡从哪里来做出了让步(手工创建)。方案二则推崇绝对的现有蛋(代码),放弃了鸡生蛋的循环,只能通过修改蛋产生变化。最终的方案,融合两者,在需要绝对控制而不易变化的基础设施配置上使用方案二保证自动化,而在需要便捷和变化的业务配置上使用方案一保证可用性。

做出让步可能是现阶段让我们走出鸡生蛋蛋生鸡这个死胡同的最好的办法,而做出什么让步,则取决于项目的价值优先级。最重要的,是利用DevOps的理念,在不引入新的痛点的基础上,最大限度的解决我们现有的痛点。


文/ThoughtWorks 刘天玮

更多精彩洞见,请关注微信公众号:ThoughtWorks洞见

这篇关于配置即代码:先有鸡还是先有蛋的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903035

相关文章

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

Oracle迁移PostgreSQL隐式类型转换配置指南

《Oracle迁移PostgreSQL隐式类型转换配置指南》Oracle迁移PostgreSQL时因类型差异易引发错误,需通过显式/隐式类型转换、转换关系管理及冲突处理解决,并配合验证测试确保数据一致... 目录一、问题背景二、解决方案1. 显式类型转换2. 隐式转换配置三、维护操作1. 转换关系管理2.

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

IDEA中配置Tomcat全过程

《IDEA中配置Tomcat全过程》文章介绍了在IDEA中配置Tomcat的六步流程,包括添加服务器、配置部署选项、设置应用服务器及启动,并提及Maven依赖可能因约定大于配置导致问题,需检查依赖版本... 目录第一步第二步第三步第四步第五步第六步总结第一步选择这个方框第二步选择+号,找到Tomca

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Win10安装Maven与环境变量配置过程

《Win10安装Maven与环境变量配置过程》本文介绍Maven的安装与配置方法,涵盖下载、环境变量设置、本地仓库及镜像配置,指导如何在IDEA中正确配置Maven,适用于Java及其他语言项目的构建... 目录Maven 是什么?一、下载二、安装三、配置环境四、验证测试五、配置本地仓库六、配置国内镜像地址

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.