文档章节

微服务十二要素(The Twelve Factors)

6pker
 6pker
发布于 2017/06/02 17:45
字数 1784
阅读 29
收藏 1

如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或“软件即服务”(SaaS)。

“十二要素应用程序”(12-Factor App)为构建如下的SaaS应用提供了方法论:

  • 使用标准化流程自动配置,从而使新的开发者花费最少的学习成本加入这个项目;
  • 和操作系统之间尽可能的划清界限,在各个系统中提供最大的可移植性;
  • 适合部署在现代的云计算平台,从而在服务器和系统管理方面节省资源;
  • 将开发环境和生产环境的差异降至最低,并使用持续交付实施敏捷开发;
  • 可以在工具、架构和开发流程不发生明显变化的前提下实现扩展;

这套理论适用于任意语言和后端服务(数据库、消息队列、缓存等)开发的应用程序。

1. 基准代码 (Code Base)

一份基准代码,多份部署

基准代码和应用之间总是保持一一对应的关系,一旦有多个基准代码,就不能称为一个应用,而是一个分布式系统。
分布式系统中的每一个组件都是一个应用,每一个应用可以分别使用12-Factor进行开发。
多个应用共享一份基准代码是有悖于12-Factor原则的。
解决方案是将共享的代码拆分为独立的类库,然后使用依赖管理策略去加载它们。
尽管每个应用只对应一份基准代码,但可以同时存在多份部署。
所有部署的基准代码相同,但每份部署可以使用其不同的版本。

 

2. 依赖 (Dependences)

显式声明依赖关系

12-Factor规则下的应用程序不会隐式依赖系统级的类库。
它一定通过依赖清单 ,确切地声明所有依赖项。
此外,在运行过程中通过依赖隔离工具来确保程序不会调用系统中存在但清单中未声明的依赖项。
这一做法会统一应用到生产和开发环境。

 

3. 配置 (Config)

在环境中存储配置

12-Factor推荐将应用的配置存储于环境变量中 (env vars, env) 。
环境变量可以非常方便地在不同的部署间做修改,却不动一行代码;
与配置文件不同,不小心把它们签入代码库的概率微乎其微;
与一些传统的解决配置问题的机制(比如Java的属性配置文件)相比,环境变量与语言和系统无关。
12-Factor应用中,环境变量的粒度要足够小,且相对独立。
它们永远也不会组合成一个所谓的“环境”,而是独立存在于每个部署之中。
当应用程序不断扩展,需要更多种类的部署时,这种配置管理方式能够做到平滑过渡。

 

4. 后端服务 (Backing Services)

把后端服务当作附加资源

12-Factor应用不会区别对待本地或第三方服务。
对应用程序而言,两种都是附加资源,通过一个url或是其他存储在配置中的服务定位/服务证书来获取数据。
12-Factor应用的任意部署 ,都应该可以在不进行任何代码改动的情况下,将本地MySQL数据库换成第三方服务(例如 Amazon RDS)。
类似的,本地SMTP服务应该也可以和第三方SMTP服务(例如Postmark)互换。

 

5. 构建,发布,运行 (Build, release, run)

严格分离构建和运行

12-facfor应用严格区分构建,发布,运行这三个步骤。
每一个发布版本必须对应一个唯一的发布ID。
新的代码在部署之前,需要开发人员触发构建操作。
但是,运行阶段不一定需要人为触发,而是可以自动进行。

 

6. 进程 (Process)

以一个或多个无状态进程运行应用

12-factor应用的进程必须无状态且无共享 。
任何需要持久化的数据都要存储在后端服务内,比如数据库。
粘性Session是twelve-factor极力反对的。
Session中的数据应该保存在诸如Memcached 或 Redis 这样的带有过期时间的缓存中。

 

7. 端口绑定 (Port Binding)

通过端口绑定提供服务

12-factor应用完全自我加载而不依赖于任何网络服务器就可以创建一个面向网络的服务。
互联网应用通过端口绑定来提供服务,并监听发送至该端口的请求。

 

8. 并发 (Concurrency)

通过进程模型进行扩展

在12-factor应用中,进程是一等公民。
12-factor应用的进程主要借鉴于unix守护进程模型 。
开发人员可以运用这个模型去设计应用架构,将不同的工作分配给不同的进程类型 。

 

9. 易处理 (Disposability)

快速启动和优雅终止可最大化健壮性

12-factor应用的进程是可支配的,意思是说它们可以瞬间开启或停止。
这有利于快速、弹性的伸缩应用,迅速部署变化的代码或配置,稳健地部署应用。
进程应当追求最小启动时间;进程一旦接收终止信号(SIGTERM) 就会优雅的终止 。
进程还应当在面对突然死亡时保持健壮 。

 

10. 开发环境与线上环境等价 (Dev/Prod Parity)

尽可能的保持开发、预发布、线上环境相同

12-factor应用想要做到持续部署就必须缩小本地与线上差异。
12-factor应用的开发人员应该反对在不同环境间使用不同的后端服务 ,即使适配器已经可以几乎消除使用上的差异。

 

11. 日志 (Logs)

把日志当作事件流

12-factor应用本身从不考虑存储自己的输出流。
不应该试图去写或者管理日志文件。
相反,每一个运行的进程都会直接的标准输出(stdout)事件流。
开发环境中,开发人员可以通过这些数据流,实时在终端看到应用的活动。

 

12. 管理进程 (Admin Processes)

后台管理任务当作一次性进程运行

一次性管理进程应该和正常的常驻进程使用同样的环境。
这些管理进程和任何其他的进程一样使用相同的代码和配置,基于某个发布版本运行。
后台管理代码应该随其他应用程序代码一起发布,从而避免同步问题。
所有进程类型应该使用同样的依赖隔离技术。
12-factor尤其青睐那些提供了REPL shell的语言,因为那会让运行一次性脚本变得简单。

本文转载自:http://blog.csdn.net/zeb_perfect/article/details/52536411

共有 人打赏支持
6pker
粉丝 54
博文 97
码字总数 59252
作品 0
浦东
程序员
私信 提问
云原生概述

1. 什么是云原生 1.1 CNCF组织 在讲云原生之前,我们先了解一下CNCF,即云原生计算基金会,2015年由谷歌牵头成立,基金会成员目前已有一百多企业与机构,包括亚马逊、微软。思科等巨头。 cn...

aoho
2017/12/25
0
0
云原生架构概述

云原生架构概述 Harries Blog™2017-12-251 阅读 SpringcatAPIDockerCassandra 1. 什么是 云 原生 1.1 CNCF 组织 在讲云原生之前,我们先了解一下CNCF,即云原生计算 基金 会, 2015 年由 谷...

Harries Blog™
2017/12/25
0
0
针对云原生转型的6个关键数据策略

如今,许多组织正在将采用云原生平台作为其数字转型战略。云原生允许企业以更灵活的方式提供快速响应、用户友好的应用程序。但是,支持云原生转换的数据体系结构常常被忽略,希望它会自行处理...

技术小能手
2018/05/22
0
0
Be Cloud Native - 仓库与依赖

前言 CNCF 与 Cloud Native 这两个技术词汇最近频频走进了程序员的视野,一切和他能搭上边的软件意味着标准、开放、时尚,也更能俘获技术哥哥们的心;这篇文章不想去带大家重温这个词汇后面的...

中间件小哥
2018/12/25
0
0
【小马哥】Spring Cloud系列讲座

这里为大家推荐一个不错的Spring Cloud系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施...

杜琪
2018/03/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 我都想和他们组成一个家庭了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @Sharon啊 :分享王菲的单曲《流年》有生之年狭路相逢终不能幸免,手心突然忽然长出纠缠的曲线。 《流年》- 王菲 手机党少年们想听歌,请使劲...

小小编辑
今天
176
6
CentOS7利用systemctl添加自定义系统服务

CentOS7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下. CentOS7的每...

linuxprobe16
今天
1
0
RabbitMQ入门

RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都非常的优秀。是当前最主流的消息中间...

watermelon11
今天
19
0
今天的学习

自动加载:方法一 function __autoload( $className ){在这里,完成加载B这个类文件的工作。}class A{} //这是一个类$a1 = new A(); //这里没有自动加载的发生,因为A这个类...

墨冥
今天
4
0
印刷工艺步骤

印刷厂从收到订单到交付整个流程,一般涉及到以下步骤 1.设计(经过软件如cdr,psd,ai等等设计需要印刷的名片,宣传单,画册等物料); 2.排版拼版(在电脑软件这区域完成); 3.出版、出硫...

focusone
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部