/avatar.png

格心

云上软件架构

摘要
  • 什么是云原生?
    • 什么是12要素
  • 云原生应该关注什么?
    • 微服务架构
    • 敏捷基础设施及公共基础服务
    • 分布式架构设计
  • 云原生程度的评判标准是什么?
  • 云服务现在如何,未来怎么走?

什么是云原生

云原生的概念最早开始于 2010 年,在当时 Paul Fremantle 的一篇博客中被提及,他一直想用一个词表达一种架构,这种架构能描述应用程序和中间件在云环境中的良好运行状态。因此他抽象出了 Cloud Native 必须包含的属性,只有满足了这些属性才能保证良好的运行状态。当时提出云原生是为了能构建一种符合云计算特性的标准来指导云计算应用的编写。

后来到 2013 年 Matt Stine 在推特上迅速推广云原生概念,并在 2015 年《迁移到云原生架构》一书中定义了符合云原生架构的特征:12 因素、微服务、自服务、基于 API 协作、扛脆弱性。而由于这本书的推广畅销,这也成了很多人对云原生的早期印象,同时云原生也被 12 要素变成了一个抽象的概念。Matt Stine 认为在单体架构向 Cloud Native 迁移的过程中,需要文化、组织、技术共同变革。

12要素

2012 年,Heroku 创始人 Adam Wiggins 发布十二要素应用宣言。它为构建一个优雅的互联网应用,定义了需要遵循的一些基本原则和方法论,也广泛影响了众多的微服务应用架构。十二要素重点关注:应用程序的健康成长,开发者之间的有效的协作,以及避免软件架构腐化的影响。

  • 基准代码:一份基准代码,多份部署,使用 GIT 或者 SVN 管理代码,并且有明确的版本信息。
  • 依赖:显示声明依赖。
  • 配置:环境中存储配置。
  • 后端服务:把后端服务当作附加资源。后端服务是指程序运行所需要的通过网络调用的各种服务,如数据库(MySQL、CouchDB)、消息/队列系统(RabbitMQ、Beanstalkd)、SMTP 邮件发送服务(Postfix),以及缓存系统(Memcached)。
  • 构建、发布、运行:严格分离构建和运行。
  • 进程:以一个或多个无状态进程运行应用,如果存在状态,应该将状态外置到后端服务中,例如数据库、缓存等。
  • 端口绑定:通过端口绑定提供服务,应用通过端口绑定来提供服务,并监听发送至该端口的请求。
  • 并发:通过进程模型进行扩展,扩展方式有进程和线程两种。进程的方式使扩展性更好,架构更简单,隔离性更好。线程扩展使编程更复杂,但是更节省资源。
  • 易处理:快速启动和优雅终止可最大化健壮性,只有满足快速启动和优雅终止,才能使服务更健壮。
  • 开发环境与线上环境等价:尽可能保持开发、预发布、线上环境相同。
  • 日志:把日志当作事件流,微服务架构中服务数量的爆发需要具备调用链分析能力,快速定位故障。
  • 管理进程:把后台管理任务当作一次性进程运行,一些工具类在生产环境上的操作可能是一次性的,因此最好把它们放在生产环境中执行,而不是本地。

12 要素应用为我们提供了很好的架构指导,帮助我们:

测试评审方法

测试方法

软件测试阶段

  1. 单元测试 重点:模块接口,局部数据结构,重要的执行通路,出错处理通路,边界条件
  2. 集成测试 非渐增式,渐增式
  3. 系统测试 确认测试(需求说明书检查,软件配置复查),验收测试(alpha,beta)

白盒测试和黑盒测试

  1. 白盒测试 语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,条件组合覆盖,路径覆盖
  2. 黑盒测试 等价类划分,边值分析,错误推测,因果图
  3. 缺陷的分类和级别 分类:输入/输出错误,逻辑错误,计算错误,接口错误,数据错误 级别:轻微,中等,使人不悦,影响使用,严重,非常严重,极为严重,无法容忍,灾难性,传染性
  4. 调试 排错策略:原始类,回溯类,排除类

评审方法

软件需求评审,概要设计评审,详细设计评审,软件验证和确认评审,功能检查,物理检查,综合检查,管理评审

注意:不应以测试代替评审,评审人员应关注产品而不应评论开发人员,评审人员应关注实质性问题,评审会议不应变为问题解决方案讨论会,评审应被安排进入项目计划,评审参与者应了解整个评审过程,评审人员事先应对评审材料充分了解,应重视评审的组织工作

验证与确认

验证:合同验证,过程验证,需求验证,设计验证,编码验证,集成验证,文档验证 确认

测试自动化

测试用例生成,测试执行控制,测试结果对比,测试结果分析,总测试状况的统计与报表产生

面向对象测试

OOA测试,OOD测试,OOP测试,单元测试,集成测试,系统测试

[转载]微服务架构的设计模式

独享数据库(Database per Microservice)

当一家公司将大型单体系统替换成一组微服务,首先要面临的最重要决策是关于数据库。单体架构会使用大型中央数据库。即使转移到微服务架构许多架构师仍倾向于保持数据库不变。虽然有一些短期收益,但它却是反模式的,特别是在大规模系统中,微服务将在数据库层严重耦合,整个迁移到微服务的目标都将面临失败(例如,团队授权、独立开发等问题)。

更好的方法是为每个微服务提供自己的数据存储,这样服务之间在数据库层就不存在强耦合。这里我使用数据库这一术语来表示逻辑上的数据隔离,也就是说微服务可以共享物理数据库,但应该使用分开的数据结构、集合或者表,这还将有助于确保微服务是按照领域驱动设计的方法正确拆分的。

https://cdn.jsdelivr.net/gh/Gethin1990/PicBed/BlogImg/20210927161754-2021-09-27-16-17-55.png

优点

  • 数据由服务完全所有。

  • 服务的开发团队之间耦合度降低。

缺点

  • 服务间的数据共享变得更有挑战性。

  • 在应用范围的保证 ACID 事务变得困难许多。

  • 细心设计如何拆分单体数据库是一项极具挑战的任务。

何时使用独享数据库

  • 在大型企业应用程序中。

  • 当团队需要完全把控微服务以实现开发规模扩展和速度提升。

何时不宜使用独享数据库

  • 在小规模应用中。

  • 如果是单个团队开发所有微服务。

可用技术示例

所有 SQL、 NoSQL 数据库都提供数据的逻辑分离(例如,单独的表、集合、结构、数据库)。

延伸阅读

微服务模式:独享数据库
https://microservices.io/patterns/data/database-per-service.html

分布式数据存储
https://docs.microsoft.com/en-us/dotnet/architecture/cloud-native/distributed-data

事件源(Event Sourcing)

在微服务架构中,特别使用独享数据库时,微服务之间需要进行数据交换。对于弹性高可伸缩的和可容错的系统,它们应该通过交换事件进行异步通信。在这种情况,您可能希望进行类似更新数据库并发送消息这样的原子操作,如果在大数据量的分布式场景使用关系数据库,您将无法使用两阶段锁协议(2PL),因为它无法伸缩。而 NoSQL 数据库因为大多不支持两阶段锁协议甚至无法实现分布式事务。

在这些场景,可以基于事件的架构使用事件源模式。在传统数据库中,直接存储的是业务实体的当前“状态”,而在事件源中任何“状态”更新事件或其他重要事件都会被存储起来,而不是直接存储实体本身。这意味着业务实体的所有更改将被保存为一系列不可变的事件。因为数据是作为一系列事件存储的,而非直接更新存储,所以各项服务可以通过重放事件存储中的事件来计算出所需的数据状态。

https://cdn.jsdelivr.net/gh/Gethin1990/PicBed/BlogImg/20210927163753-2021-09-27-16-37-54.png

优点

  • 为高可伸缩系统提供原子性操作。

  • 自动记录实体变更历史,包括时序回溯功能。

  • 松耦合和事件驱动的微服务。

缺点

  • 从事件存储中读取实体成为新的挑战,通常需要额外的数据存储(CQRS 模式)。

  • 系统整体复杂性增加了,通常需要领域驱动设计。

  • 系统需要处理事件重复(幂等)或丢失。

  • 变更事件结构成为新的挑战。

何时使用事件源

  • 使用关系数据库的、高可伸缩的事务型系统。

  • 使用 NoSQL 数据库的事务型系统。

开发管理

项目的范围、时间与成本

项目范围管理

  1. 项目启动
  2. 范围计划编制
  3. 范围定义
  4. 范围核实
  5. 范围变更

项目成本管理

  1. 资源计划编制
  2. 成本估算
  3. 成本预算
  4. 成本控制

项目时间管理

  1. 活动定义
  2. 活动排序
  3. 活动历时估算
  4. 进度计划编制
  5. 进度控制

配置管理与文档管理

软件配置管理概念

  1. 配置标识
  2. 版本控制
  3. 状态统计
  4. 审计与审查
  5. 生产
  6. 过程管理
  7. 小组协作

软件配置管理的解决方案

各种版本控制工具

软件文档管理

  1. 软件文档的作用
    1. 管理依据
    2. 任务之间联系的凭证
    3. 质量保证
    4. 培训与参考
    5. 软件维护支持
    6. 历史档案
    7. 销售可能
  2. 文档的归类
    1. 开发文档
    2. 产品文档
    3. 管理文档
  3. 文档编制计划
    1. 列出应编制文档的目录
    2. 提示编制文档应参考的标准
    3. 指定文档管理员
    4. 提供编制文档所需要的条件
    5. 明确保证文档质量的方法
    6. 绘制进度表
  4. 对文档质量的要求
    1. 针对性
    2. 准确性
    3. 清晰性
    4. 完整性
    5. 灵活性

软件需求管理

需求变更

  1. 项目启动阶段的变更预防
  2. 项目实施阶段的需求变更

需求跟踪

  1. 确定需求变更控制过程
  2. 进行需求变更影响分析
  3. 建立需求基准版本和需求控制版本文档
  4. 维护需求变更的历史纪录
  5. 跟踪每项需求的状态

软件开发的质量与风险

软件质量管理

  1. 软件质量计划
  2. 软件质量保证
  3. 软件质量控制
    1. 软件评审
    2. 测试

项目风险管理

  1. 项目风险管理的概念
    1. 内部技术风险
    2. 内部非技术风险
      1. 公司战略变化、管理人员水平、没有在预算内完成进度
    3. 外部法律风险
    4. 外部非法律风险
      1. 经济环境变化、组织雇佣关系变化
  2. 风险管理的过程
    1. 风险管理规划
    2. 项目风险识别
    3. 定性风险分析
    4. 定量风险分析
    5. 风险应对计划
    6. 风险监督与控制

人力资源管理

组织规划

  1. 垂直团队组织
  2. 水平团队组织
  3. 混合团队组织

人员招募

  1. 领导能力
  2. 沟通技巧
  3. 人际交往能力
  4. 应付压力能力
  5. 培养员工能力
  6. 时间管理能力

团队建设

  1. 形成阶段
  2. 震荡阶段
  3. 正规阶段
  4. 表现阶段

软件的运行与评价

  1. 软件的稳定性与可靠性评价
  2. 软件是否满足了用户的需求
  3. 软件实施给用户带来的好处

软件过程改进

  1. CMM
  2. CMMI
  3. ISO 9000
  4. ITIL

系统计划

项目的提出与选择

项目的立项目标和动机

  • 进行基础研究并获取技术
  • 进行应用研发并获得产品
  • 提供技术服务
  • 信息技术产品的使用者

项目的选择和确定

  • 选择有核心价值的产品/项目或开发方向
  • 评估项目风险、收益和代价
  • 评估项目的多种实施方式
  • 平衡的选择合适的方案

项目的提出和选择结果

项目的提出和选择的结果,最终会以“产品/项目建议书”的方式来体现。

可行性研究与效益分析

可行性研究和内容

  1. 经济可行性
  2. 技术可行性
    1. 技术
    2. 资源
    3. 目标
  3. 法律可行性
  4. 执行可行性
  5. 方案的选择

成本效益分析

  1. 项目可能涉及的成本
    1. 基础建设支出
    2. 一次性支出
    3. 运行维护费用
  2. 项目可能涉及的收益
    1. 一次性收益
    2. 非一次性收益
    3. 不可定量的收益
  3. 效益分析的若干指标和进一步的分析
    1. 收益/投资比
    2. 投资回收周期
    3. 敏感性分析

可行性分析报告

  1. 项目背景
  2. 管理概要和建议
  3. 候选方案
  4. 系统描述
  5. 经济可行性
  6. 技术可行性
  7. 法律可行性
  8. 用户使用可行性
  9. 其他与项目有关的问题

方案的制订和改进

  1. 确定软件架构
  2. 确定实现的各种关键性要素和实现手段
  3. 归结目标到最适合的计算体系

新旧系统的分析和对比

遗留系统的评价方法

  1. 启动评价
    1. 遗留系统是否至关重要
    2. 企业的商业目标是什么
    3. 演化需求是什么
    4. 所期望的系统寿命多长
    5. 系统使用期限多久
    6. 系统技术状态如何
    7. 企业是否愿意改变
    8. 企业是否有能力承受演化
  2. 商业价值评价
    1. 咨询
    2. 评价问卷
    3. 进行评价
  3. 外部环境评价
    1. 硬件
    2. 支撑软件
    3. 企业基础设施
  4. 应用软件评价
    1. 系统级
    2. 部件级
  5. 分析评价结果

遗留系统的演化策略

  1. 淘汰策略
  2. 继承策略
  3. 改造策略
  4. 集成策略

算法-数据结构