当前位置: 首页 > news >正文

姑苏网站建设保定网站建设推广公司怎么样

姑苏网站建设,保定网站建设推广公司怎么样,做装修的推广网站有那种,网站建设视频教程云盘简介 如今#xff0c;软件通常会作为一种服务来交付#xff0c;它们被称为网络应用程序#xff0c;或软件即服务#xff08;SaaS#xff09;。12-Factor 为构建如下的 SaaS 应用提供了方法论#xff1a; 使用标准化流程自动配置#xff0c;从而使新的开发者花费最少的… 简介 如今软件通常会作为一种服务来交付它们被称为网络应用程序或软件即服务SaaS。12-Factor 为构建如下的 SaaS 应用提供了方法论 使用标准化流程自动配置从而使新的开发者花费最少的学习成本加入这个项目。和操作系统之间尽可能的划清界限在各个系统中提供最大的可移植性。适合部署在现代的云计算平台从而在服务器和系统管理方面节省资源。将开发环境和生产环境的差异降至最低并使用持续交付实施敏捷开发。可以在工具、架构和开发流程不发生明显变化的前提下实现扩展。 这套理论适用于任意语言和后端服务数据库、消息队列、缓存等开发的应用程序。 读者应该是哪些人 任何 SaaS 应用的开发人员。部署和管理此类应用的运维工程师。 12-factors I. 基准代码 一份基准代码Codebase多份部署deploy 12-Factor应用(译者注应该是说一个使用本文概念来设计的应用下同)通常会使用版本控制系统加以管理如Git, Mercurial, Subversion。一份用来跟踪代码所有修订版本的数据库被称作 代码库code repository, code repo, repo。 在类似 SVN 这样的集中式版本控制系统中基准代码 就是指控制系统中的这一份代码库而在 Git 那样的分布式版本控制系统中基准代码 则是指最上游的那份代码库。 基准代码和应用之间总是保持一一对应的关系 一旦有多个基准代码就不能称为一个应用而是一个分布式系统。分布式系统中的每一个组件都是一个应用每一个应用可以分别使用 12-Factor 进行开发。多个应用共享一份基准代码是有悖于 12-Factor 原则的。解决方案是将共享的代码拆分为独立的类库然后使用 依赖管理 策略去加载它们。尽管每个应用只对应一份基准代码但可以同时存在多份部署。每份 部署 相当于运行了一个应用的实例。通常会有一个生产环境一个或多个预发布环境。此外每个开发人员都会在自己本地环境运行一个应用实例这些都相当于一份部署。 所有部署的基准代码相同但每份部署可以使用其不同的版本。比如开发人员可能有一些提交还没有同步至预发布环境预发布环境也有一些提交没有同步至生产环境。但它们都共享一份基准代码我们就认为它们只是相同应用的不同部署而已。 II. 依赖 显式声明依赖关系 dependency  大多数编程语言都会提供一个打包系统用来为各个类库提供打包服务就像 Perl 的 CPAN 或是 Ruby 的 Rubygems 。通过打包系统安装的类库可以是系统级的称之为 “site packages”或仅供某个应用程序使用部署在相应的目录中称之为 “vendoring” 或 “bunding”。 12-Factor规则下的应用程序不会隐式依赖系统级的类库。 它一定通过 依赖清单 确切地声明所有依赖项。此外在运行过程中通过 依赖隔离 工具来确保程序不会调用系统中存在但清单中未声明的依赖项。这一做法会统一应用到生产和开发环境。 例如 Ruby 的 Bundler 使用 Gemfile 作为依赖项声明清单使用 bundle exec 来进行依赖隔离。Python 中则可分别使用两种工具 – Pip 用作依赖声明 Virtualenv 用作依赖隔离。甚至 C 语言也有类似工具 Autoconf 用作依赖声明静态链接库用作依赖隔离。无论用什么工具依赖声明和依赖隔离必须一起使用否则无法满足 12-Factor 规范。 显式声明依赖的优点之一是为新进开发者简化了环境配置流程。新进开发者可以检出应用程序的基准代码安装编程语言环境和它对应的依赖管理工具只需通过一个 构建命令 来安装所有的依赖项即可开始工作。例如Ruby/Bundler 下使用 bundle install而 Clojure/Leiningen 则是 lein deps。 12-Factor 应用同样不会隐式依赖某些系统工具如 ImageMagick 或是curl。即使这些工具存在于几乎所有系统但终究无法保证所有未来的系统都能支持应用顺利运行或是能够和应用兼容。如果应用必须使用到某些系统工具那么这些工具应该被包含在应用之中。 III. 配置 在环境中存储配置 通常应用的 配置 在不同 部署 (预发布、生产环境、开发环境等等)间会有很大差异。这其中包括 数据库Memcached以及其他 后端服务 的配置第三方服务的证书如 Amazon S3、Twitter 等每份部署特有的配置如域名等 有些应用在代码中使用常量保存配置这与 12-Factor 所要求的代码和配置严格分离显然大相径庭。配置文件在各部署间存在大幅差异代码却完全一致。 判断一个应用是否正确地将配置排除在代码之外一个简单的方法是看该应用的基准代码是否可以立刻开源而不用担心会暴露任何敏感的信息。 需要指出的是这里定义的“配置”并不包括应用的内部配置比如 Rails 的 config/routes.rb或是使用 Spring 时 代码模块间的依赖注入关系 。这类配置在不同部署间不存在差异所以应该写入代码。 另外一个解决方法是使用配置文件但不把它们纳入版本控制系统就像 Rails 的 config/database.yml 。这相对于在代码中使用常量已经是长足进步但仍然有缺点总是会不小心将配置文件签入了代码库配置文件的可能会分散在不同的目录并有着不同的格式这让找出一个地方来统一管理所有配置变的不太现实。更糟的是这些格式通常是语言或框架特定的。 12-Factor推荐将应用的配置存储于 环境变量 中 env vars, env 。环境变量可以非常方便地在不同的部署间做修改却不动一行代码与配置文件不同不小心把它们签入代码库的概率微乎其微与一些传统的解决配置问题的机制比如 Java 的属性配置文件相比环境变量与语言和系统无关。 配置管理的另一个方面是分组。有时应用会将配置按照特定部署进行分组或叫做“环境”例如Rails中的 development,test, 和 production 环境。这种方法无法轻易扩展更多部署意味着更多新的环境例如 staging 或 qa 。 随着项目的不断深入开发人员可能还会添加他们自己的环境比如 joes-staging 这将导致各种配置组合的激增从而给管理部署增加了很多不确定因素。 12-Factor 应用中环境变量的粒度要足够小且相对独立。它们永远也不会组合成一个所谓的“环境”而是独立存在于每个部署之中。当应用程序不断扩展需要更多种类的部署时这种配置管理方式能够做到平滑过渡。 IV. 后端服务 把后端服务(backing services)当作附加资源 后端服务是指程序运行所需要的通过网络调用的各种服务如数据库MySQLCouchDB消息/队列系统RabbitMQBeanstalkdSMTP 邮件发送服务Postfix以及缓存系统Memcached。 类似数据库的后端服务通常由部署应用程序的系统管理员一起管理。除了本地服务之外应用程序有可能使用了第三方发布和管理的服务。示例包括 SMTP例如 Postmark数据收集服务例如 New Relic 或 Loggly数据存储服务如 Amazon S3以及使用 API 访问的服务例如 Twitter, Google Maps, Last.fm。 12-Factor 应用不会区别对待本地或第三方服务。 对应用程序而言两种都是附加资源通过一个 url 或是其他存储在 配置 中的服务定位/服务证书来获取数据。12-Factor 应用的任意 部署 都应该可以在不进行任何代码改动的情况下将本地 MySQL 数据库换成第三方服务例如 Amazon RDS。类似的本地 SMTP 服务应该也可以和第三方 SMTP 服务例如 Postmark 互换。上述 2 个例子中仅需修改配置中的资源地址。 每个不同的后端服务是一份 资源 。例如一个 MySQL 数据库是一个资源两个 MySQL 数据库用来数据分区就被当作是 2 个不同的资源。12-Factor 应用将这些数据库都视作 附加资源 这些资源和它们附属的部署保持松耦合。 部署可以按需加载或卸载资源。例如如果应用的数据库服务由于硬件问题出现异常管理员可以从最近的备份中恢复一个数据库卸载当前的数据库然后加载新的数据库 – 整个过程都不需要修改代码。 V. 构建发布运行 严格分离构建和运行 基准代码 转化为一份部署(非开发环境)需要以下三个阶段 构建阶段 是指将代码仓库转化为可执行包的过程。构建时会使用指定版本的代码获取和打包 依赖项编译成二进制文件和资源文件。发布阶段 会将构建的结果和当前部署所需 配置 相结合并能够立刻在运行环境中投入使用。运行阶段 或者说“运行时”是指针对选定的发布版本在执行环境中启动一系列应用程序 进程。12-factor 应用严格区分构建发布运行这三个步骤。 举例来说直接修改处于运行状态的代码是非常不可取的做法因为这些修改很难再同步回构建步骤。 部署工具通常都提供了发布管理工具最引人注目的功能是退回至较旧的发布版本。比如 Capistrano 将所有发布版本都存储在一个叫 releases 的子目录中当前的在线版本只需映射至对应的目录即可。该工具的 rollback 命令可以很容易地实现回退版本的功能。 每一个发布版本必须对应一个唯一的发布 ID例如可以使用发布时的时间戳2011-04-06-20:32:17亦或是一个增长的数字v100。发布的版本就像一本只能追加的账本一旦发布就不可修改任何的变动都应该产生一个新的发布版本。 新的代码在部署之前需要开发人员触发构建操作。但是运行阶段不一定需要人为触发而是可以自动进行。如服务器重启或是进程管理器重启了一个崩溃的进程。因此运行阶段应该保持尽可能少的模块这样假设半夜发生系统故障而开发人员又捉襟见肘也不会引起太大问题。构建阶段是可以相对复杂一些的因为错误信息能够立刻展示在开发人员面前从而得到妥善处理。 VI. 进程 以一个或多个无状态进程运行应用 运行环境中应用程序通常是以一个和多个 进程 运行的。 最简单的场景中代码是一个独立的脚本运行环境是开发人员自己的笔记本电脑进程由一条命令行例如python my_script.py。另外一个极端情况是复杂的应用可能会使用很多 进程类型 也就是零个或多个进程实例。 12-Factor 应用的进程必须无状态且 无共享 。 任何需要持久化的数据都要存储在 后端服务 内比如数据库。 内存区域或磁盘空间可以作为进程在做某种事务型操作时的缓存例如下载一个很大的文件对其操作并将结果写入数据库的过程。12-Factor应用根本不用考虑这些缓存的内容是不是可以保留给之后的请求来使用这是因为应用启动了多种类型的进程将来的请求多半会由其他进程来服务。即使在只有一个进程的情形下先前保存的数据内存或文件系统中也会因为重启如代码部署、配置更改、或运行环境将进程调度至另一个物理区域执行而丢失。 源文件打包工具Jammit, django-compressor 使用文件系统来缓存编译过的源文件。12-Factor 应用更倾向于在 构建步骤 做此动作——正如 Rails资源管道 而不是在运行阶段。 一些互联网系统依赖于 “粘性 session” 这是指将用户 session 中的数据缓存至某进程的内存中并将同一用户的后续请求路由到同一个进程。粘性 session 是 12-Factor 极力反对的。Session 中的数据应该保存在诸如 Memcached 或 Redis 这样的带有过期时间的缓存中。 VII. 端口绑定 通过端口绑定(Port binding)来提供服务 互联网应用有时会运行于服务器的容器之中。例如 PHP 经常作为 Apache HTTPD 的一个模块来运行正如 Java 运行于 Tomcat 。 12-Factor 应用完全自我加载 而不依赖于任何网络服务器就可以创建一个面向网络的服务。互联网应用 通过端口绑定来提供服务 并监听发送至该端口的请求。 本地环境中开发人员通过类似http://localhost:5000/的地址来访问服务。在线上环境中请求统一发送至公共域名而后路由至绑定了端口的网络进程。 通常的实现思路是将网络服务器类库通过 依赖声明 载入应用。例如Python 的 Tornado, Ruby 的Thin , Java 以及其他基于 JVM 语言的 Jetty。完全由 用户端 确切的说应该是应用的代码发起请求。和运行环境约定好绑定的端口即可处理这些请求。 HTTP 并不是唯一一个可以由端口绑定提供的服务。其实几乎所有服务器软件都可以通过进程绑定端口来等待请求。例如使用 XMPP 的 ejabberd  以及使用 Redis 协议 的 Redis 。 还要指出的是端口绑定这种方式也意味着一个应用可以成为另外一个应用的 后端服务 调用方将服务方提供的相应 URL 当作资源存入 配置 以备将来调用。 VIII. 并发 通过进程模型进行扩展 任何计算机程序一旦启动就会生成一个或多个进程。互联网应用采用多种进程运行方式。例如PHP 进程作为 Apache 的子进程存在随请求按需启动。Java 进程则采取了相反的方式在程序启动之初 JVM 就提供了一个超级进程储备了大量的系统资源(CPU 和内存)并通过多线程实现内部的并发管理。上述 2 个例子中进程是开发人员可以操作的最小单位。 在 12-factor 应用中进程是一等公民。12-Factor 应用的进程主要借鉴于 unix 守护进程模型 。开发人员可以运用这个模型去设计应用架构将不同的工作分配给不同的 进程类型 。例如HTTP 请求可以交给 web 进程来处理而常驻的后台工作则交由 worker 进程负责。 这并不包括个别较为特殊的进程例如通过虚拟机的线程处理并发的内部运算或是使用诸如 EventMachine, Twisted, Node.js 的异步/事件触发模型。但一台独立的虚拟机的扩展有瓶颈垂直扩展所以应用程序必须可以在多台物理机器间跨进程工作。 上述进程模型会在系统急需扩展时大放异彩。 12-Factor 应用的进程所具备的无共享水平分区的特性 意味着添加并发会变得简单而稳妥。这些进程的类型以及每个类型中进程的数量就被称作 进程构成 。 12-Factor 应用的进程 不需要守护进程 或是写入 PID 文件。相反的应该借助操作系统的进程管理器(例如 systemd 分布式的进程管理云平台或是类似 Foreman 的工具)来管理 输出流 响应崩溃的进程以及处理用户触发的重启和关闭超级进程的请求。 IX. 易处理 快速启动和优雅终止可最大化健壮性 12-Factor 应用的 进程 是 易处理disposable的意思是说它们可以瞬间开启或停止。 这有利于快速、弹性的伸缩应用迅速部署变化的 代码 或 配置 稳健的部署应用。 进程应当追求 最小启动时间 。 理想状态下进程从敲下命令到真正启动并等待请求的时间应该只需很短的时间。更少的启动时间提供了更敏捷的 发布 以及扩展过程此外还增加了健壮性因为进程管理器可以在授权情形下容易的将进程搬到新的物理机器上。 进程 一旦接收 终止信号SIGTERM 就会优雅的终止 。就网络进程而言优雅终止是指停止监听服务的端口即拒绝所有新的请求并继续执行当前已接收的请求然后退出。此类型的进程所隐含的要求是HTTP请求大多都很短(不会超过几秒钟)而在长时间轮询中客户端在丢失连接后应该马上尝试重连。 对于 worker 进程来说优雅终止是指将当前任务退回队列。例如RabbitMQ 中worker 可以发送一个NACK信号。 Beanstalkd 中任务终止并退回队列会在worker断开时自动触发。有锁机制的系统诸如 Delayed Job 则需要确定释放了系统资源。此类型的进程所隐含的要求是任务都应该 可重复执行  这主要由将结果包装进事务或是使重复操作 幂等 来实现。 进程还应当在面对突然死亡时保持健壮例如底层硬件故障。虽然这种情况比起优雅终止来说少之又少但终究有可能发生。一种推荐的方式是使用一个健壮的后端队列例如 Beanstalkd 它可以在客户端断开或超时后自动退回任务。无论如何12-Factor 应用都应该可以设计能够应对意外的、不优雅的终结。Crash-only design 将这种概念转化为 合乎逻辑的理论。 X. 开发环境与线上环境等价 尽可能的保持开发预发布线上环境相同 从以往经验来看开发环境即开发人员的本地 部署和线上环境外部用户访问的真实部署之间存在着很多差异。这些差异表现在以下三个方面 时间差异 开发人员正在编写的代码可能需要几天几周甚至几个月才会上线。人员差异 开发人员编写代码运维人员部署代码。工具差异 开发人员或许使用 NginxSQLiteOS X而线上环境使用 ApacheMySQL 以及 Linux。 12-Factor 应用想要做到 持续部署 就必须缩小本地与线上差异。 再回头看上面所描述的三个差异: 缩小时间差异开发人员可以几小时甚至几分钟就部署代码。缩小人员差异开发人员不只要编写代码更应该密切参与部署过程以及代码在线上的表现。缩小工具差异尽量保证开发环境以及线上环境的一致性。 将上述总结变为一个表格如下 传统应用12-Factor 应用每次部署间隔数周几小时开发人员 vs 运维人员不同的人相同的人开发环境 vs 线上环境不同尽量接近 后端服务 是保持开发与线上等价的重要部分例如数据库队列系统以及缓存。许多语言都提供了简化获取后端服务的类库例如不同类型服务的 适配器 。下列表格提供了一些例子。 类型语言类库适配器数据库Ruby/RailsActiveRecordMySQL, PostgreSQL, SQLite队列Python/DjangoCeleryRabbitMQ, Beanstalkd, Redis缓存Ruby/RailsActiveSupport::CacheMemory, filesystem, Memcached 开发人员有时会觉得在本地环境中使用轻量的后端服务具有很强的吸引力而那些更重量级的健壮的后端服务应该使用在生产环境。例如本地使用 SQLite 线上使用 PostgreSQL又如本地缓存在进程内存中而线上存入 Memcached。 12-Factor 应用的开发人员应该反对在不同环境间使用不同的后端服务 即使适配器已经可以几乎消除使用上的差异。这是因为不同的后端服务意味着会突然出现的不兼容从而导致测试、预发布都正常的代码在线上出现问题。这些错误会给持续部署带来阻力。从应用程序的生命周期来看消除这种阻力需要花费很大的代价。 与此同时轻量的本地服务也不像以前那样引人注目。借助于Homebrewapt-get等现代的打包系统诸如Memcached、PostgreSQL、RabbitMQ 等后端服务的安装与运行也并不复杂。此外使用类似 Chef 和 Puppet 的声明式配置工具结合像 Vagrant 这样轻量的虚拟环境就可以使得开发人员的本地环境与线上环境无限接近。与同步环境和持续部署所带来的益处相比安装这些系统显然是值得的。 不同后端服务的适配器仍然是有用的因为它们可以使移植后端服务变得简单。但应用的所有部署这其中包括开发、预发布以及线上环境都应该使用同一个后端服务的相同版本。 XI. 日志 把日志当作事件流 日志 使得应用程序运行的动作变得透明。在基于服务器的环境中日志通常被写在硬盘的一个文件里但这只是一种输出格式。 日志应该是 事件流 的汇总将所有运行中进程和后端服务的输出流按照时间顺序收集起来。尽管在回溯问题时可能需要看很多行日志最原始的格式确实是一个事件一行。日志没有确定开始和结束但随着应用在运行会持续的增加。 12-factor应用本身从不考虑存储自己的输出流。 不应该试图去写或者管理日志文件。相反每一个运行的进程都会直接的标准输出stdout事件流。开发环境中开发人员可以通过这些数据流实时在终端看到应用的活动。 在预发布或线上部署中每个进程的输出流由运行环境截获并将其他输出流整理在一起然后一并发送给一个或多个最终的处理程序用于查看或是长期存档。这些存档路径对于应用来说不可见也不可配置而是完全交给程序的运行环境管理。类似 Logplex 和 Fluentd 的开源工具可以达到这个目的。 这些事件流可以输出至文件或者在终端实时观察。最重要的输出流可以发送到 Splunk 这样的日志索引及分析系统或 Hadoop/Hive 这样的通用数据存储系统。这些系统为查看应用的历史活动提供了强大而灵活的功能包括 找出过去一段时间特殊的事件。图形化一个大规模的趋势比如每分钟的请求量。根据用户定义的条件实时触发警报比如每分钟的报错超过某个警戒线。XII. 管理进程 后台管理任务当作一次性进程运行 进程构成process formation是指用来处理应用的常规业务比如处理 web 请求的一组进程。与此不同开发人员经常希望执行一些管理或维护应用的一次性任务例如 运行数据移植Django 中的 manage.py migrate, Rails 中的 rake db:migrate。运行一个控制台也被称为 REPL shell来执行一些代码或是针对线上数据库做一些检查。大多数语言都通过解释器提供了一个 REPL 工具python 或 perl 或是其他命令Ruby 使用 irb, Rails 使用 rails console。运行一些提交到代码仓库的一次性脚本。 一次性管理进程应该和正常的 常驻进程 使用同样的环境。这些管理进程和任何其他的进程一样使用相同的 代码 和 配置 基于某个 发布版本 运行。后台管理代码应该随其他应用程序代码一起发布从而避免同步问题。 所有进程类型应该使用同样的 依赖隔离 技术。例如如果Ruby的web进程使用了命令 bundle exec thin start 那么数据库移植应使用 bundle exec rake db:migrate 。同样的如果一个 Python 程序使用了 Virtualenv则需要在运行 Tornado Web 服务器和任何 manage.py 管理进程时引入 bin/python 。 12-factor 尤其青睐那些提供了 REPL shell 的语言因为那会让运行一次性脚本变得简单。在本地部署中开发人员直接在命令行使用 shell 命令调用一次性管理进程。在线上部署中开发人员依旧可以使用ssh或是运行环境提供的其他机制来运行这样的进程。 有人在此基础上补充了另外7个要素Observable, Schedulable, Upgradable, Least privilege, Auditable, Securable, Measurable。 参考 https://12factor.net/zh_cn/ https://zhuanlan.zhihu.com/p/65570111
http://www.huolong8.cn/news/205051/

相关文章:

  • 福安城乡建设与规划局网站深圳东门步行街
  • 行业网站建设教程wordpress 4.7.3主题
  • 校园网站建设情况统计表自己做网站详细流程
  • 手机微网站制作系统站群 wordpress
  • 缩短链接网站做网站诊断步骤
  • 衡阳购物网站开发案例线上营销培训
  • 建立网站需要什么软件个人网站开发平台有哪些
  • wap网站建设服务jsp网站开发平台
  • 移动网站打不开解决办法网站制作设计收费标准
  • 威海 网站建设怎样做网站公司
  • 班服定制的网站外贸网站seo教程
  • 广州开发区科技企业加速器seo快速提升排名
  • 重庆哪家公司做网站好创建个人网站教案
  • 有彩虹代刷源码怎么做网站网站内容描述
  • 做网站iiwok外贸收款平台有哪些
  • 为什么招聘网站做不大网址生成短链接
  • 网站开发 技术支持服务协议北京it外包服务商
  • 网站建设拟解决问题企业seo顾问公司
  • 网站备案的坏处购物网站建设方案书
  • 济源市建设工程管理处网站高端品牌网站设计公司价格
  • 医院网站建设方案书网站logo在哪里修改
  • 商城网站开发dw做网站详细教程
  • hpsocket 网站开发高水平的锦州网站建设
  • 一级a做爰片免费网站 新闻凡科删除建设的网站
  • 网站建设公司未来发展方向网站超链接
  • 品牌网站建设策划方案怎样做站长建网站
  • 美食网站的建设背景it互联网培训机构排名
  • 房地产开发公司网站建设方案模板银川网站推广方式
  • 网站设置访问密码wordpress开启gzip压缩
  • 怎样快速学好网站建设在云服务器上搭建网站