首页 > 其他分享 >如何理解十二要素方法论

如何理解十二要素方法论

时间:2023-12-14 15:46:52浏览次数:34  
标签:要素 方法论 Spring Boot 十二 应用程序 缓存

本文翻译自 How To Understand Twelve-Factor Methodology In Spring Boot Applications,原作者:OLEKSII。


十二要素应用程序是构建现代可扩展应用程序架构所需的一系列原则。本篇文章将从 Spring Boot 应用的角度回顾这些原则。


一、代码库

应用程序在版本控制系统(如 Git)中进行跟踪。

代码库和应用程序之间是一对一的关系。因此,每个 Spring Boot 应用程序都有自己的代码库。这些应用程序构成了一个分布式系统。多个部署(如测试、阶段、生产等)的代码是相同的。


二、依赖关系

在十二要素应用程序中,系统依赖关系是明确声明的。

在 Spring Boot 中,可以使用 MavenGradle 来实现这些目的。这些工具可用于指定所需的应用程序依赖关系。此外,跨依赖关系可能存在的问题也得到了解决。


三、配置

如前所述,每个应用程序只有一个代码库。但是,相同的代码会用于多个部署。因此,这些部署需要一些配置功能。
Spring Boot 中,属性可以用来解决这个问题。属性可以通过多种方式指定。例如,可以在 application.yml 文件中指定默认值。在环境变量的帮助下,每个部署都可以覆盖所需的属性。更多详情可参阅 Spring Boot 的文档。


四、 备份服务

每个应用程序都可以使用多个外部或第三方服务。

可以是数据库(如 MySQL)、消息代理(如 Kafka)、第三方 API 等。每个服务都应像资源一样运行。这意味着,你的代码应同时在 Docker 中的 MySQLAWS 中的 MySQL 上运行,而无需做任何更改。

Spring Boot 中,可以通过 Spring Boot 属性、特殊接口和类(如 Spring Data Repository)来实现。


五、构建、发布、运行

十二要素方法需要三个不同的阶段,才能将源代码转化为运行中的应用程序。

构建

首先,将源代码转化为可执行文件。可以使用 MavenGradle 来构建目标 jar 文件。

发布

第二步,将可执行文件与特定配置相结合。例如,可以创建一个 Docker 镜像,将 jar 文件与所需配置相结合。

运行

在这一步中,可以创建一个 Docker 容器,根据上一步的映像运行应用程序。这意味着,在必要时,我们可以在不同版本的应用程序之间快速切换。如果当前版本有一些错误,可以使用之前的 Docker 镜像来运行应用程序。


六、程序

十二要素应用程序是无状态的,不共享任何数据。不过,数据可以保存在数据库等有状态备份服务中。

让我们来看一个例子。想象一下,我们有一个带有 MySQL 数据库的应用程序。对数据库的某些请求速度很慢。因此,我们使用了内存中的 Caffeine 缓存。数据更新时,缓存会失效。只有一个节点部署时,一切正常。

一段时间后,系统负载不断增加。我们希望通过添加第二个节点来扩展我们的应用程序。缓存位于每个节点上。因此,用户在两次后续请求中看到的结果是不同的。用户更新了记录。第一个节点会使其内存缓存失效。一方面,用户可以看到新数据。用户再次读取数据。第二个节点(拥有旧缓存)会以旧数据做出响应。

为了克服这个问题,应用程序是无状态的。这种缓存可以位于分布式缓存中,如 Redis


七、端口绑定

在以前使用的典型 Java 应用程序中,可执行文件以 war 文件的形式出现。该文件在 Tomcat 等容器中执行。

在十二要素应用程序中,可执行文件是独立的。Spring Boot 应用程序内部依赖于 Tomcat。因此,jar 是自包含的,运行应用程序只需要一个 java 环境。唯一需要指定的是应用程序应使用的目标端口。这可以通过配置属性完成。


八、并发性

十二要素应用程序是为扩展而设计的。Java 应用程序作为与 JVM 绑定的单个进程运行。为了扩展 Spring Boot 应用程序,必须启动一个新实例。在 五、构建、发布、运行一节中,Docker 容器被描述为运行 Spring Boot 应用程序的一种方式。因此,为了扩展,可以使用 Kubernetes

九、可处置性

十二要素应用程序应具有快速启动和优雅关闭的特点。

这意味着,同一应用程序的实例可以随时启动或停止。这不应影响应用程序。为了实现这一点,当应用程序实例停止时,该实例应停止监听传入请求,完成对所有当前请求的处理,并优雅地停止。

Spring Boot 中,这可以通过应用程序事件来实现。


十、开发/生产比价

在典型的应用程序开发流程中,开发与生产之间存在很大差距。应用程序是在本地环境中开发的,开发人员不参与部署过程,开发人员可以使用与生产不同的工具。

十二要素应用程序是为持续部署而设计的,目的就是尽量缩小这种差距。Spring BootDocker 使之成为可能。开发人员可以使用与生产环境中相同的工具快速编写应用程序。


十一、日志日志

日志是软件应用程序的重要组成部分,可提供运行应用程序的可见性。

在十二要素应用程序中,日志被写入标准输出。执行环境应负责处理日志。Fluentd 可用于收集此类日志,并将其淡入日志索引工具。ElasticseachKibana 就是这方面的常见例子。


十二、管理流程

经常需要在应用程序上运行一次性任务或例行程序。十二要素应用方法论建议将这些任务纳入应用程序代码中。

例如,典型的任务是数据库迁移。可通过 FlywayLiquibase 实现。

标签:要素,方法论,Spring,Boot,十二,应用程序,缓存
From: https://www.cnblogs.com/dev2007/p/17879889.html

相关文章

  • 十二月十二日破防记录
    【详细解密】CQ-01怎样写Pollard-Rho写破防【既然遇到了就来学一学pollard-rho吧】.jpg这是怎么会是呢?感觉对着题解抄都抄不对啊!/fn/fn/fn把数据下下来一个一个调,最后发现是随机的时候RE了???经过仔细观察,发现我写随机的时候写的是:uniform_int_distribution<>u(2,x-1);......
  • 2023-12-12 双十二思考借钱给steve的事
    2023-12-12   2014年投资了3.8W合伙成立半山腰。这个事情也怪我当初,我看Sw总要创业,做的事情又是有经验的,投资一点,以后赚了就跟着赚一点,亏了我也认栽。从一开始,就没有想过投资2~3万,要他回报给我2~300万。能赚个10几万,我觉得就很不错了。后面就很多年里,应该有7~8年,每年都问我......
  • 学C笔记归纳 第十二篇——函数2 声明和定义
    函数功能越单一,可移植性越强——“高内聚低耦合”;函数可以嵌套调用,不可以嵌套定义;关于函数声明:    告诉编译器函数名、参数、返回类型,但函数具体存在由函数定义决定;    函数声明一般出现在函数使用之前,要满足先声明后使用;    函数声明一般放在头文件......
  • 村庄规划标识码和要素代码自动赋值
    下载:资源下载介绍:整个数据库自动编标识码和要素代码。操作:1.拷贝整个CZGH文件夹,利用arcgis打开,选择村庄规划质检数据库(数据库存放文件夹不能为汉语,数据库名称不能为汉语),输入村委会代码点击确定即可。2.由于GHWB和SGTJ两个表中文件名称与要素代码名称有些不一致,需要人......
  • 第12期 | 用友BIP项目云,助力施工项目全过程、全要素创新发展
    12.1施工方项目管理解决方案建筑行业是一个古老且重要的产业,在经济发展中扮演着重要角色,但也面临着一些挑战。2022年,建筑业产值利润率为2.68%,比上年降低了0.21个百分点,连续六年下降,连续两年低于3%。针对建筑行业目前的高成本和低利润、项目管理不规范、技术创新缓慢等问题,建筑企业......
  • 控制论与科学方法论
    《控制论与科学方法论》,真心不错。书籍原文电子版PDF:https://pan.quark.cn/s/aa40d59295df(分类在学习目录下)控制论是一种让系统按照我们想要的方式运行的方法。以下是控制论、信息论、系统论的总结:控制论控制过程共有的几点:被控制对象必须存在多种发展的可能性人可以......
  • PTA-2023第十二次练习题目题解
    PTA-2023第十二次练习题目题解(祝大家机考顺利)以下代码已做防抄袭处理,切勿抄袭。注意:手机端因为屏幕限制,代码会有(不希望的)换行。解决方案:1.建议使用电脑端打开。2.点击代码进入全屏观看。6-24实验8_3_设计函数利用冒泡排序的思想,将每一列的最小值放到每列的最后一个位置。voi......
  • 【题解】LibreOJ #3051「十二省联考 2019」皮配
    传送门:https://loj.ac/p/3051  首先,对于这样“少部分个体有特殊要求”的题目,我们先考虑,如果没有任何个体有特殊要求怎么做,然后再考虑怎么加上特殊要求;对于这道题,如果$k=0$,即没有学校有不喜欢的导师,那么,设总人数为$al$,城市$i$的人数和为$cit_i$、选择的阵营为$zy_i=0/......
  • 每天5分钟复习OpenStack(十二)Ceph FileStore 和 BlueSotre
    一个最小化的Ceph集群需要三个组件MONMGROSD.上一章我们部署了MON,本章节我们完成剩下MGR和OSD的部署。在文末我们将重点介绍下什么是FileStore和BlueStore,并详细分析其特点,来说明为什么Ceph社区放弃了FileStore,直接采用了BlueStore.1、MGR部署创建mgr工作目录sudo-u......
  • 2023-11-13第十二周记录
    2023-11-13第十二周11-13缩点上周周末去ccpc深圳打了次星。四道签到题就写了一题,打的时候都有种要爆0的感觉。平时在学校还是打的太安逸了,觉得自己打的还挺好。确实是缺少拷打。没办法,菜就多练。上周看了下连通性的一些知识点,今天的目标就是把缩点和2-sat的知识点学了,再去补......