zoukankan      html  css  js  c++  java
  • 云服务开发要注意的12因素

    12因素

    SaaS(Software-as-a-service):软件即服务.用户通过网络来访问软件的软件分发模型.它把软件当作一种服务来交付,它们被称为网络应用程序.

    SaaS服务构建应该满足下面12种因素,这样才能实现:

    标准化流程,快速上手
    划清服务边界,提供最大的可移植性
    适合部署在云平台,节省服务器和系统管理资源
    缩减不同环境差异,便于持续交付
    可在工具,架构和开发流程不发生明显变化的前提下实现扩展
    

    理解12因素,要基于云服务(容器)的前提来考虑,就会更好理解它们的价值点.

    • 1 基准代码

    一份基准代码,多份部署

    便于代码和应用之间对应
    缩减不同环境差异
    

    不同部署的应用版本,代码是否要保留??

    release版本是从master中切出去的,大小版本迭代:模块化,维护成本高,接口地址会变多.
    

    模块化:将支付宝拆分为支付,商家,金融不同模块;最终由专门团队聚合;

    热修复版本:已发布版本存在bug,互联网产品因为是web应用,只需更新线上版本即可.存在客户端的历史版本需要发布补丁等处理.

    • 2 依赖

    显示声明依赖

    简化环境配置流程
    快速运行应用
    避免依赖版本冲突;
    
    • 3 配置

    在环境变量中存储配置,让配置和代码分离.优点如下:

    1 代码更加通用
    2 配置与代码分开管理,容易管理,可避免配置误嵌入代码库;
    3 不同环境的环境变量天然可以区分,不存在增加配置后,配置文件变多问题;
    
    • 4 后端服务

    把后端服务当作附加资源

    后端服务是指:应用依赖的通过网络调用的各种服务.如数据库,缓存等;
    将后端服务当作附加资源,它不区分本地或第三方服务,只要是网络调用就是后端服务,它的优点:

    1 参数化依赖服务 所有的后端服务对于应用就是一个配置项;
    2 按需装卸依赖服务 只要修改配置文件,就可以更换后端服务;
    
    • 5 构建,发布,运行

    严格分离构建和运行.

    部署基准代码分为三个阶段:

    构建阶段:将代码仓库转化为可执行包.构建时会使用指定版本的代码,获取和打包依赖项,编译成二进制文件和资源文件;
    发布阶段:将构建结果和部署所需的配置结合,生成可运行应用;
    运行阶段:运行已发布应用.
    

    阶段分离的优点:

    规范发布流程;
    便于提起发现应用中异常;
    加速应用启动; 
    
    • 6 进程

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

    应用进行必须无状态且无共享.

    任何持久化数据都要存储在后端服务内,如数据库.
    内存区域或磁盘空间可以作为进程在做某种事务型操作时的缓存,因为它们不会影响应用状态.多进程间,缓存数据不共享;单进程内也会因为容器重新部署而丢弃这部分数据.
    session保持通过redis等带有过期时间的缓存来处理.极力反对hash等"粘性session",这会让应用存在状态,同时也存在服务扩展后缓存穿透的问题.
    

    tip:
    一致性hash问题,针对于老系统,可能没有考虑会话问题或者文件状态问题,无法通过缓存方式获取会话状态等情况,反而采用一致性hash,可以很好的解决问题,也不用修改业务代码,所以具体原则运用也要考虑具体的场景.

    • 7 端口绑定

    通过端口绑定来提供服务

    应用应完全自我加载,不依赖任何网络服务就可创建一个面向网络的服务.互联网应用通过端口绑定来提供服务.

    应用依赖更灵活.任何应用都是一个可配置的参数.
    运行更灵活.随起随用
    
    • 8 并发

    通过进程模型进行扩展

    进程是云应用的基石,它主要基于unix守护进程模型(https://adam.herokuapp.com/past/2011/5/9/applying_the_unix_process_model_to_web_apps/).

    进程无共享,水平分区,会让并发更容易添加且更健壮.
    
    • 9 易处理

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

    进程易处理指:进程具备快速开启和停止的能力.追求最小启动时间.追求快且优雅的停止.还要保证停止时的健壮性.

    有利于快速,弹性伸缩应用;
    加速产品迭代;
    降低停止的影响;
    保证意外发生时,可以优雅的退出.
    
    • 10 开发环境和线上环境等价

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

    环境差异表现:

    时间差异: 开发人员正在编写的代码时间线长;
    人员差异: 开发人员编写代码,运维人员部署代码;
    工具差异: 开发人员在用nginx,osx,线上环境使用apache,linux;
    

    应用想持续部署必须缩小本地和线上差异.

    缩小时间差异: 开发人员可以几小时甚至几分钟就部署代码;
    缩小人员差异: 开发人员不知要编写代码,部署和线上服务运行也要参与;
    缩小工具差异: 尽量保证开发环境和线上环境的一致性;
    

    反对不同环境使用不同的后端服务.

    • 11 日志

    把日志当作事件流

    应用本身不考虑存储自己的输出流.不应该去管理日志文件,每个运行的进程都会直接的标准输出事件流,将所有运行中的进程和后端服务的输出流按时间顺序收集.
    开发环境: 通过这些数据流,实时的在终端看到应用的活动.
    生产环境: 输出流汇集后发送给日志处理程序,用于查看或存档.

    日志统一管理,便于查看整个调用链情况;
    日志管理和应用解耦;
    便于后续根据日志进行行为分析;
    
    • 12 管理进程

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

    进程构成:用来处理应用的常规业务的一组进程.常规业务之外,还有一些管理或维护应用的一次性任务,如:

    数据迁移;
    运行一个控制台,用于执行一些代码或进行数据检查等;
    运行一些一次性脚本等;
    

    这些后台管理任务应该当作一次性进程,它应该和常驻进程使用同样的环境.它应该随其他应用程序代码一起发布,从而避免同步问题.

    避免同步问题
    

    参考文档:
    12factor https://12factor.net/zh_cn/

  • 相关阅读:
    大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 时序算法)
    大数据时代:基于微软案例数据库数据挖掘知识点总结(结果预测篇)
    svg图片的缩放拖拽
    计算机网络之以太网,通俗点的说法
    yield 与生成器
    安卓开发第一记 android stdio 安装后 新建测试项目报错
    Javascript的异常捕获机制
    小而实用的工具插件集锦(JQGrid,zTree)
    proxifier 注册码 +电脑全局代理设置
    雷林鹏分享:jsp 发送邮件
  • 原文地址:https://www.cnblogs.com/chengmuyu/p/13040691.html
Copyright © 2011-2022 走看看