十二要素应用程序是构建Web应用程序的12条原则或最佳实践的集合, 如今这些应用程序或应用通常被称为软件即服务(SAAS)应用程序。它由Heroku的联合创始人Adam Wiggins先生于2011年出版。这些原则是作为平台即服务平台Heroku的工作人员获得的所有经验和观察的结果。上面曾经部署过各种各样的软件即服务应用程序。
这些原则有助于我们创建使用以下内容的应用程序:陈述式自动化的编程编程, 从而减少了新开发人员加入时的开发时间和项目成本, 并且不依赖任何特定的操作系统, 并且很容易随身携带, 非常适合部署在云上并允许持续部署并且可以轻松地水平扩展, 而无需在代码库中进行很多更改。这些因素如下:
1.代码库
在许多部署的版本控制中, 每个应用程序跟踪一个代码库。让我们打破它的正式声明, 并尝试理解其中的两个主要术语。简而言之, 代码库是所有人工编写的源代码, 其中不包含工具生成的类或目标文件。部署是指该特定应用程序的单个运行实例。每个应用程序必须只有一个代码库。每个这样的代码库必须在版本控制系统中进行管理。一些流行的VCS(版本控制系统)包括git, svn和mercurial。它存在多个代码库, 那么它不是应用程序, 而是分布式系统。该系统的每个组件将被称为应遵循12要素应用程序原理的应用程序。
2.依存关系
明确声明和隔离依赖项。我们所有人都必须在编程生涯中至少观察到一次, 我们出于某种目的下载了python库, 然后发现我们下载了错误版本的库或在系统中安装了错误版本的python。通常发生这种情况是因为管理依赖项的任务已交给开发人员。因此, 该因素表明我们必须始终在清单文件中声明依赖项, 该文件包含依赖项的元数据, 例如名称, 版本。由于现在开发人员无需管理正确版本的库, 因此可以提高开发速度。不再需要显式下载所需的JAR。
3.配置
将配置存储在环境中。源代码和配置必须完全分开。我们必须像业界通常的做法一样, 将所有配置(如数据库凭据, 路径, URI)存储在环境变量中, 应用程序的配置因环境而异, 如dev, test, prod等。而且, 也不应在git中存储任何配置以纯文本格式。有一种非常简单的方法可以检查你当前的应用程序是否遵循此要求设定档询问自己是否可以立即使应用程序开源, 而无需进行任何更改且不损害任何凭据, 这是你的基本原则。
4.支持服务
将支持服务视为附加资源。
如果我们用非常简单的术语进行交谈, 那么你的应用程序通过网络使用的任何服务都称为后备服务。你的应用程序必须将这些服务视为通过网络消耗的资源。它给我们带来的优势是我们的服务可以轻松互换, 并为我们的应用程序提供了极大的可移植性。
举一个简单的例子, 假设你的应用程序当前使用本地PostgreSQL数据库进行操作, 然后仅通过更改URL和数据库凭据即可将其替换为托管在你公司服务器上的数据库。
5.构建, 发布和运行
严格分开构建和运行阶段。你的应用程序的部署必须正确地分为三个非重叠的非依赖阶段, 即构建, 发布和运行。构建阶段构成了代码的编译, 最终生成了JAR或WAR文件之类的工件。第二阶段, 发布, 获取上一阶段结束时生成的工件文件, 并向其中添加特定环境的配置。最后一个阶段包括运行应用程序实例。
6.流程
将应用程序作为一个或多个无状态进程执行。如果可以随时创建和销毁其实例, 而又不影响应用程序的整体功能, 则该应用程序将遵循此原则。为了实现并实现这一原理, 我们的应用程序必须将其生成的任何类型的数据存储在任何持久性(有状态)数据存储区中。但这并不意味着我们无法使用应用程序进程的内存。我们可以使用它来存储为临时存储。简单来说, 必须避免使用粘性会话。简单来说, 粘性会话是指在进程的本地内存中捕获已登录用户的会话数据, 然后将来自该特定用户的每个后续请求定向到同一进程。粘性会话的问题在于, 它会导致应用程序实例之间的负载均衡不均衡。
7.端口绑定
通过端口绑定导出服务。遵循此原理的任何应用程序都是完全独立且独立的。它将HTTP导出为服务, 并且不需要诸如tomcat之类的任何服务器来侦听请求。它将自身绑定到某个特定端口, 并侦听该端口上的所有请求。在设计在特定端口上运行的应用程序或微服务时, 你还必须已经观察到它, 并且使用邮递员在该特定端口上命中请求以获取响应。我们的服务将侦听哪个端口的信息也存储在配置文件本身中。
8.并发
通过流程模型进行横向扩展。遵循此原理的应用程序必须分为较小的不同进程, 而不是单个大型应用程序。每个此类过程都必须能够随时独立地启动, 终止和复制自身。这个原理可以很容易地扩展我们的应用程序。通过横向扩展, 我们指的是水平扩展, 其中我们运行多个流程实例。由于存在独立的水平可伸缩过程, 因此它以非常简单的方式为我们的应用程序增加了并发性。
9.一次性性
快速启动和正常关闭可最大程度地提高鲁棒性。应用程序的健壮性是指在不影响整个应用程序功能的前提下, 正常启动和终止其过程。例如, 我们应用程序的流程之一是将公司新增加的员工的详细信息存储到数据库中。但是, 这样做时, 会在中间发生意外错误, 从而导致进程在中间意外终止。但是, 我们的应用程序或数据库的状态不得受到它的影响, 并且该过程必须是故障安全的。此外, 必须在需要时快速启动。
10.开发/生产平价
保持开发, 登台和生产尽可能相似。这只是意味着开发和生产环境必须尽可能相似。使用的过程, 技术和基础结构必须相同。这将以某种方式帮助你, 随着时间的推移发生的任何错误都将发生在开发阶段本身, 而不是在生产中意外发生。这有助于持续部署我们的应用程序, 并减少了开发时间和工作量。
11.日志
【什么是十二要素应用程序(什么是软件即服务(SAAS)应用程序?)】将日志视为事件流。日志对于理解应用程序的内部工作非常重要, 它可以具有不同级别, 并且通常存储在存储器中名为”
logFile”
的文件中。理想情况下, 我们的十二要素应用程序一定不要担心日志的存储。每当请求进入系统时, 都会创建相应的日志, 并将它们视为一系列事件, 这些事件可用于在发生某些问题时进行调试。
12.管理流程
一次性运行管理/管理任务。大多数应用程序需要先执行一些一次性任务, 然后才能开始实际的应用程序流程。这些任务不是经常需要的, 因此, 我们通常为它创建一个脚本, 该脚本是在其他环境中运行的。另一方面, 由十二个因素组成的方法论表明, 必须将此类脚本作为我们代码库本身的一部分, 并在版本控制系统中进行管理。这些任务还应遵循十二要素原则。
推荐阅读
- PHP中@符号的用途是什么(如何使用?)
- 是什么使Scala具有可扩展性()
- 自动化(使用Python的Whatsapp!)
- Ping和Traceroute之间有什么区别()
- DBUtils使用详解#yyds干货盘点#
- 设计模式的七大原则 #yyds干货盘点#
- #yyds干货盘点#Maven打jar包供外部调用
- #yyds干货盘点# 如何处理消费过程中的重复消息()
- 07-docker系列-使用dockerfile构建pythonjenkins镜像