在云的时代,越来越多的传统应用需要迁移到云环境下,新应用也要求能适应云的架构设计和开发模式。而12-factor提供了一套标准的云原生应用开发的最佳原则。

在容器云项目中应用容器化主要参考12-Factor原则。

1 12-Factor简介

12-Factor,是由Heroku创始人Adam Wiggins首次提出并开源,并由众多经验丰富的开发者共同完善,这综合了他们关于SaaS应用几乎所有的经验和智慧,是开发此类应用的理想实践标准。

12-Factor 全称叫 The Twelve-Factor App,它定义了一个优雅的、适应云环境的互联网应用在设计过程中,需要遵循的一些基本原则。

12-Factor原文地址:

https://12factor.net/zh_cn/

参考文章:

http://www.10tiao.com/html/352/201706/2660395450/1.html

https://www.jianshu.com/p/bbdccd020a1d

2 12-Factor详解

2.1. 一份基准代码,多份部署

1当应用可以被拆分为不同模块时,就不能被称为一个应用,而是一个分布式系统,其中的模块就对应一个应用。

2每个应用对应一个代码仓库,即基准代码。

3每个应用只对应一份基准代码,但可以同时存在多份部署。每份部署相当于运行了一个应用的实例。如将应用部署到生产环境、多个预发布环境、测试环境等。

2.2. 显式声明依赖关系

在应用运行中需要其他工具类库等依赖项,需要通过依赖清单,确切地声明所有依赖项。 例如,Ruby的 Bundler 使用 Gemfile 作为依赖项声明清单,使用 bundle exec 来进行依赖隔离。Python 中则可分别使用Pip 用作依赖声明。显式声明依赖的优点之一是简化了环境配置流程,只需通过一个 构建命令 来安装所有的依赖项,即可开始工作。

2.3. 在环境中存储配置

应用在不同的环境中部署时,有不同的配置,如数据库连接配置、第三方服务的证书等。要求代码与配置严格分离开。

可以通过将配置写入配置文件,且不纳入代码仓库的版本管理中来实现。

12-Factor推荐将配置存到环境变量中,非常方便地在不同的部署间做修改,却不动一行代码

2.4. 把后端服务当作附加资源

对于后端服务,如mysql、redis等本地服务和邮件、api等第三方服务都应该作为附加资源存在配置中。可以通过更改配置来切换后端服务。

2.5. 严格分离构建和运行

应用部署需要以下三个阶段:

构建阶段 是指将代码仓库转化为可执行包的过程。构建时会使用指定版本的代码,获取和打包 依赖项,编译成二进制文件和资源文件。

发布阶段 会将构建的结果和当前部署所需 配置 相结合,并能够立刻在运行环境中投入使用。

运行阶段 (或者说"运行时")是指针对选定的发布版本,在执行环境中启动一系列应用程序进程。12-factor要求应用严格区分构建,发布,运行这三个步骤。

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

1以一个或多个无状态进程 运行应用,需要持久化的数据放到后端服务中。

2不可使用粘性 session(将用户 session 中的数据缓存至某进程的内存中,并将同一用户的后续请求路由到同一个进程)。

2.7. 通过端口绑定提供服务

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

依赖网络服务器的应用,如PHP应用作为 Apache HTTPD 的一个模块来运行, Java应用运行于 Tomcat 。

自我加载网络服务的应用如,Python 的 Tornado, Ruby 的Thin , Java 以及其他基于 JVM 语言的 Jetty。完全由应用的代码,绑定端口,提供服务。

2.8. 通过进程模型进行扩展

(自己理解,有待讨论)

1开发人员将不同的工作分配给不同的进程类型。例如,HTTP 请求可以交给 web 进程来处理,而常驻的后台工作则交由 worker 进程负责。定时任务交由 clock 来处理,这样扩展每一类的进程就非常方便,如下图所示:

2与通过进程模型进行扩展相反的方式是通过线程模型进行扩展,这是一种相对较为传统的方式。当我们启动一个Java进程的时候,通常会在应用层面为其设置一个或者多个线程池的容量上下限,当外部负载变化时,进程所占用的内存容量和进程内部的线程数量可以在这些预先设置好的上下限之间进行扩展,这种方式也被称为纵向扩展或者垂直扩展。

现在更为推崇使用"固定的"进程(对前面Java应用的例子来说,就是固定的内存容量和线程池容量),在外部负载提高时,启动更多的进程,在外部负载降低时,停止一部分进程,这种方式就是本原则所说的通过进程模型进行扩展,有时候也被称为横向扩展或者水平扩展。

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

12-Factor 应用的 进程 是 易处理(disposable)的,意思是说它们可以瞬间开启或停止。 这有利于快速、弹性的伸缩应用,迅速部署变化的 代码 或 配置 ,稳健的部署应用。

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

12-Facto应用缩小本地与线上差异有利于实现持续部署。主要是以下三个差异:

缩小时间差异:开发人员可以几小时,甚至几分钟就部署代码。

缩小人员差异:开发人员不只要编写代码,更应该密切参与部署过程以及代码在线上的表现。

缩小工具差异:尽量保证开发环境以及线上环境的一致性。

2.11. 把日志当作事件流

1应用程序应该将其产生的事件以每个事件一行的格式按时间顺序输出

2应用程序不要自行管理日志文件。要求应用程序将日志以事件流的方式输出到标准输出STDOUT和标准错误输出STDERR,然后由运行环境捕获这些事件流,并转发到专门的日志处理服务进行处理。

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

该原则反对通过SSH接入线上环境执行管理任务,建议后台管理任务当作一次性进程运行。

如果管理任务是修改应用配置,那么应该通过配置管理服务进行操作;如果管理任务是批处理任务,例如数据的迁移、清洗或者检查,那么应该通过云平台的批处理机制进行操作,大多数的云平台都会提供这种机制,例如Kubernetes的Jobs。

docker应用容器化准则—12 factor的更多相关文章

  1. Asp.NetCore轻松学-使用Docker进行容器化托管

    前言 没有 docker 部署的程序是不完整的,在写了 IIS/Centos/Supervisor 3篇托管介绍文章后,终于来到了容器化部署,博客园里面有关于 docker 部署的文章比比皆是,作为硬 ...

  2. ASP.NET Core使用Docker进行容器化托管和部署

    一.课程介绍 人生苦短,我用.NET Core!今天给大家分享一下Asp.Net Core以Docker进行容器化部署托管,本课程并不是完完全全的零基础Docker入门教学,课程知识点难免有没覆盖全面 ...

  3. .NETCore Docker实现容器化与私有镜像仓库管理

    一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖.相较于虚拟机而 ...

  4. Docker应用容器化

    Docker 的核心思想就是如何将应用整合到容器中,并且能在容器中实际运行. 将应用整合到容器中并且运行起来的这个过程,称为“容器化”(Containerizing),有时也叫作“Docker化”(D ...

  5. Docker之容器化学习之路v20.10.3

    Docker概述 **本人博客网站 **IT小神 www.itxiaoshen.com Docker文档官网 Docker是一个用于开发.发布和运行应用程序的开放平台.Docker使您能够将应用程序与 ...

  6. Asp.Net Core 使用Docker进行容器化部署(一)

    前几篇文章介绍了Liunx下的环境搭建,今天来分享一下.Net Core在Liunx上的部署. 我采用的方案是使用Dokcer作为运行虚拟机,Nginx作为Http服务器来进行反向代理,你可以理解为D ...

  7. Asp.Net Core 使用Docker进行容器化部署(二)使用Nginx进行反向代理

    上一篇介绍了Asp.Net 程序在Docker中的部署,这篇介绍使用Nginx对Docker的实例进行反向代理 一.修改Nginx配置文件 使用winscp链接Liunx服务器,在/ect/nginx ...

  8. .NET Core容器化@Docker

    温馨提示:本文适合动手演练,效果更佳.  1. 引言 我们知道. NET Core最大的特性之一就是跨平台,而对于跨平台,似乎大家印象中就是可以在非Windows系统上部署运行.而至于如何操作,可能就 ...

  9. Docker容器化技术(上)

    目录 Docker容器化技术 一.介绍 二.Docker的发展 三.Docker安装 四.阿里云Docker镜像加速 五.Docker的基本概念 六.命令 七.Docker宿主机与容器通信 八.容器内 ...

随机推荐

  1. VPP(Vector Packet Processing)浅析

    VPP简介 VPP(Vector Packet Processing)是思科旗下的一款可拓展的开源框架,提供容易使用的.高质量的交换.路由功能 特点:高性能.运行在普通的cpu上. 优点:高性能.技术 ...

  2. DBCP数据库连接池的简单使用

    0.DBCP简介      DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目.DBCP通过连接池预先同数据库建立一些连接放在内存中( ...

  3. iOS获取设备ip地址(OC版)

    #import <SystemConfiguration/CaptiveNetwork.h> #import <ifaddrs.h> #import <arpa/inet ...

  4. SSM(SpringMVC+Spring+Mybatis)框架学习理解

    近期做到的项目中,用到的框架是SSM(SpringMVC+Spring+Mybatis).之前比较常见的是SSH.用到了自然得了解各部分的分工 spring mvc 是spring 处理web层请求的 ...

  5. 聊聊编程开发的数据库批量插入(sql)

    这里的批量插入,主要是支持SQL的大型存储数据库,本文以Mysql,Oracle,SqlServer,postgresql4类来说明,这大概是国内应用比较多的了.其余的应该可以按照这些去找.提到编程的 ...

  6. functional filter()

    #include "pch.h" #include <iostream> #include <deque> #include <string> ...

  7. 新增时json类型报错

    新增时出错:如下 实体类中字段类型没有对应上,vue页面中修改跳转页面的路径:使用params...

  8. 关于python文件问题

    一.python内部的首行命令 #!/usr/bin/env python #_*_coding:utf8_*_ 第一条命令用于Linux系统中的./命令,用于声明用什么Python解释器.第二条命令 ...

  9. Office 365部分安装及同时安装Visio的方法

    From MWeb Win版本的Office 365安装包默认安装所有组件,没有选择的页面,在安装Office 365后再安装下载的Visio 2016专业版时,会显示计算机上已经安装了即插即用Off ...

  10. leetcode-746-Min Cost Climbing Stairs(动态规划)

    题目描述: On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once yo ...