Heroku 是业内知名的云应用平台,从对外提供服务以来,他们已经有上百万应用的托管和运营经验。其创始人 Adam Wiggins 根据这些经验,发布了一个“十二要素应用宣言(The Twelve-Factor App)”,这个设计原则对SaaS平台非常具有指导意义。

十二要素应用宣言

如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论:

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

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

12-factor为Web应用程序或SaaS平台的建立非常有用的指导原则,但它在有些地方并不适合微服务体系。因此在实施微服务架构时修改和扩展了12-factor,将“十二因子应用”中的核心思想应用于针对持续交付和优化的通用微服务架构。

微服务应用的十二个因素

1 - 基准代码:一份基准代码,多份部署

Twelve-Factor App为每个应用推荐一个代码库。在微服务架构中,正确的方法实际上是每个服务的一个代码库。此外,我们强烈建议使用Git作为存储库,因为它具有丰富的功能集和巨大的生态系统。GitHub已经成为开源社区的默认Git托管平台,但根据贵组织的需求,还有许多其他优秀的Git托管选项。

2 - 依赖关系 :显式声明依赖关系

正如The Twelve-Factor App中所建议的那样,无论您的应用程序在哪个平台上运行,都要使用您的语言或框架附带的依赖关系管理器。您如何安装操作系统或平台依赖性取决于平台:

在非集成环境中,使用配置管理工具(Chef,Puppet,Ansible)来安装系统依赖关系。
在一个容器化的环境中,在Dockerfile中执行此操作。
注意:我们建议您在全面的基础架构即代码策略背景下选择依赖管理机制,而不是作为单独的决策。

3 - 配置 :在环境中存储配置

任何部署之间的差异都可以视为配置。Twelve-Factor App指南建议将所有配置存储在环境中,而不是将其提交到存储库。我们推荐以下具体做法:

使用非版本控制的.env文件进行本地开发。Docker支持在运行时加载这些文件。
将所有.env文件保存在一个安全的存储系统(如Vault)中,以使这些文件可供开发团队使用,但不会提交给Git。
对运行时可能更改的任何内容以及不应提交给共享存储库的任何内容使用环境变量。
将应用程序部署到交付平台后,使用交付平台的机制来管理环境变量。

4 - 支持服务:把后端服务当作附加资源

Twelve-Factor App指南将支持服务定义为“作为其正常操作的一部分,应用程序在网络上使用的任何服务”。微服务的含义是服务外部的任何内容都被视为附加资源,包括其他服务。这确保了每个服务都是完全可移植的,并且松散地耦合到系统中的其他资源。此外,严格的分离会在开发过程中提高灵活性 - 开发人员只需运行他们正在修改的服务,而不需要运行其他服务。

5 - 构建,发布,运行 :严格分离构建和运行

为了支持严格分离构建,发布和运行阶段,我们推荐使用持续集成/持续交付(CI / CD)工具来自动构建。Docker镜像可以轻松分离构建和运行阶段。理想情况下,镜像是从每次提交创建的,并被视为部署工件。

6 - 过程 :以一个或多个无状态进程运行应用

对于微服务,进程因素中的重要一点是您的应用程序需要无状态。这可以通过简单地添加更多的服务实例来轻松扩展服务。将任何有状态数据或需要在实例之间共享的数据存储在后备服务中。

7 - 数据隔离:通过端口绑定提供服务

作为使端口绑定因子对微服务更有用的修改,建议只允许通过服务的API访问服务拥有的持久数据。这可以防止微服务之间的隐式服务契约,并确保微服务不能紧密耦合。数据隔离还允许开发人员为每项服务选择最适合其需求的数据存储类型。

8 - 并发性 :通过进程模型进行扩展

Unix进程模型在很大程度上是微服务架构的一个前辈,因为它允许在单个应用程序中对不同任务进行特例化和资源共享。在微服务体系结构中,您可以独立地水平扩展每项服务,并在底层基础结构支持的范围内。使用集装箱化服务,您可以免费获得Twelve-Factor应用程序推荐的并发性。

9 - 可丢弃性 :快速启动和优雅终止可最大化健壮性

服务实例需要一次性使用,以便可以快速启动,停止和重新部署,并且不会丢失数据。部署在Docker容器中的服务会自动满足此要求,因为它是容器的固有功能,可以立即停止并启动它们。将状态或会话数据存储在队列或其他后备服务中可确保在发生容器崩溃时无缝处理请求。

10 - 开发/产品奇偶校验 :尽可能的保持开发,预发布,线上环境相同

尽可能保持所有的环境 - 开发,阶段,生产等 - 以减少只在某些环境中出现错误的风险。为了支持这个原则,我们再次推荐使用容器 - 这里是一个非常强大的工具,因为它们使您能够从本地开发到生产全过程运行完全相同的执行环境。但请记住,底层数据的差异仍然会在运行时造成差异。

11 - 日志 :把日志当作事件流

不要在微服务中包含用于路由或存储日志的代码,而要使用市场上许多优秀的日志管理解决方案之一,其中几个列于十二因子应用程序中。此外,决定如何使用日志需要成为更大的APM和/或PaaS策略的一部分。

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

与应用程序分开运行管理和维护任务。容器使得这很容易,因为你可以启动一个容器来运行一个任务,然后关闭它。

结论

Twelve-Factor App 是构建微服务 SasS 软件的方法论。这些最佳实践是为了使应用程序构建与可移植性和弹性部署到web在生产环境中。希望您在开发您自己的应用时使用这些原则,使用 Twelve-Factor App 和这些附加原则来帮助您创建可持续交付,并进行了优化的基于微服务的应用程序。

文章来源:www.liangsonghua.me

SasS 设计原则十二因素的更多相关文章

  1. (转) 面向对象设计原则(二):开放-封闭原则(OCP)

    原文:https://blog.csdn.net/tjiyu/article/details/57079927 面向对象设计原则(二):开放-封闭原则(OCP) 开放-封闭原则(Open-closed ...

  2. 面象对象设计原则之二:开放封闭原则(Open-Closed Principle, OCP)

    开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则.开闭原则由Bertrand  Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed Principle, ...

  3. Silverlight & Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation)

    说到对象的旋转,或许就会联想到对象角度的概念.对象的旋转实现实际上就是利用对象的角度改变来实现的位置变换,在<Silverlight & Blend动画设计系列二:旋转动画(Rotate ...

  4. 六大设计原则(二)LSP里氏替换原则

    里氏替换原则LSP(Liskov Subsituation Principle) 里氏替换原则定义 所有父类出现的地方可以使用子类替换并不会出现错误或异常,但是反之子类出现的地方不一定能用父类替换. ...

  5. DB设计原则(二)如何拆、分表

    不要盲目为了减少表的数量,而使某一张表的字段过多,而导致表冗余列存在

  6. 优秀API设计的十大原则

    优秀API设计的十大原则 2015-09-23    分类:编程开发.设计模式.首页精华暂无人评论 分享到:更多4 二十万年薪PHP工程师培养计划 成为被疯抢的Android牛人 风中叶讲Java重难 ...

  7. 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单

    阅读目录 前言 解决数据一致性的方案 回到DDD 设计 实现 结语 一.前言 之前的十一篇把用户购买商品并提交订单整个流程上的中间环节都过了一遍.现在来到了这最后一个环节,提交订单.单从业务上看,这个 ...

  8. MySql(十二):MySql架构设计——可扩展设计的基本原则

    一.前言 科技在发展,硬件设备的发展渐渐无法满足应用系统对处理能力的要求.不过,我们还是可以通过改造系统的架构体系,提升系统的扩展能力,通过组合多个低处理能力的硬件设备来达到一个高处理能力的系统,也就 ...

  9. 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序

    如何在Visual Studio 2017中使用C# 7+语法   前言 之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法,然后闲来无事,搞着,搞着没搞出来,然后就写了这篇博文,不 ...

随机推荐

  1. 洛谷:P3950 部落冲突

    原题地址:https://www.luogu.org/problemnew/show/P3950 题目简述 给定一棵树,每次给定一个操作,有如下两种: 将某条边染黑 2.询问给定的u,v两点间是否有边 ...

  2. 夯实Java基础系列21:Java8新特性终极指南

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  3. 正则表达式在Java中使用

    正则表达式 定义 用一组特殊的字符来描述一组字符串的格式 用于验证字符串是否满足格式 不关心字符串的内容是否有效 1. 基本正则表达式所谓正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式 ...

  4. 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】

    本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...

  5. spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理

    @Configuration注解提供了全新的bean创建方式.最初spring通过xml配置文件初始化bean并完成依赖注入工作.从spring3.0开始,在spring framework模块中提供 ...

  6. 使用Jmeter并发websocket协议项目

    1.安装Jmeter 网址:http://jmeter.apache.org/下载 2.启动Jmeter \apache-jmeter-5.1.1\bin\jmeter.bat 3.安装‘Plugin ...

  7. 2019滴滴php面试总结 (包含面试题解析)

    2019滴滴java面试总结  (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...

  8. 【EasyCi】持续集成交付,一键式自动化部署系统,开箱即用

    前言 本人是一家互联网公司的java开发,由于公司初期公司未招运维人员,恰好我对linux比较熟悉,便在公司服务器搭建了一套Jenkins.Gitlab.Maven私服.Docker私服.Sonarq ...

  9. Jenkins介绍

    持续集成: 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证 ...

  10. Redis 3.0中文版学习(二)

    网址:http://wiki.jikexueyuan.com/project/redis-guide/entry-to-master-middle.html 1.Redis的列表: 采用链表的实现方法 ...