title: SOA with REST: 用RESTful构建企业级SOA解决方案
date: 2015-03-06 13:29:55
tags:
- SOA
- RESTful
categories:
- programming
- architecture

这是一篇读书笔记,也是在翻译本书过程中,对重点的摘录。

本书不仅展示了REST是一种适合于构建面向服务解决方案的媒介,同时也展示了面向服务的架构模型是能够充分发挥商业潜力的REST风格的技术架构的坚实(通常也是必要的)基础。

  • 面向服务计算的目标是战略性的和面向业务的。
  • REST的目标是以技术为中心的,并且有助于实现战略目标和战术性业务目标。
  • 虽然并非所有的REST设计目标与每个面向服务计算的目标都有联系,但是大多数REST的设计目标都直接支持面向服务计算的目标。
  • REST与面向服务计算的目标之间没有冲突。

经过对REST和SOA的探讨,发现REST是这样的:

  • REST* 架构设计目标:
    • 性能
    • 可伸缩性
    • 简单性
    • 可修改性
    • 可视性
    • 可移植性
    • 可靠性
  • REST架构设计约束和原则:
    • 客户端-服务器
    • 无状态
    • 缓存
    • 接口/统一契约
    • 分层系统
    • 随需应变代码

而SOA是这样的:

  • SOA面向服务架构的特征:
    • 业务驱动
    • 厂商中立
    • 以组合为中心
    • 以企业为中心
  • SOA架构设计7大目标
    • 提升内在互操作性
    • 增强联邦
    • 提升厂商选择多样性
    • 提升业务与技术对齐
    • 提升投资回报率
    • 提升组织敏捷性
    • 降低IT负担
  • SOA的8条具体设计原则:
    • 标准化服务契约
    • 服务松耦合
    • 服务可重用性
    • 服务自治
    • 服务无状态
    • 服务可发现性
    • 服务可组合性

由此得出SOA与REST通用目标:

  • 提升标准化
  • 提升可伸缩性
  • 提升可重用性
  • 提升互操作性
  • 提升厂商中立性
  • 加快对变化的响应

书中介绍了MSOAM流程,特别是包含了服务目录和契约的设计、发现和版本控制,从全局来体现规范性和集中性,试图避免服务目录和组织扩张以后,服务慢慢腐坏的问题。

如何设计基于REST的SOA服务

在设计REST服务契约时,设计的内容包括:

  • 标准化的HTTP方法、头、响应代码、媒体类型
  • 任务、实体、公用服务
  • 资源标识符、URI
  • 无状态、缓存、统一契约、分层系统

除了Get/Post/Put/Delete/Head等简单方法(http method),还设计几个复杂方法:

  • Fetch 支持自动重试、重定向、内容协商、缓存的Get方法
  • Store 支持自动重试、重定向、内容协商、缓存的Put/Delete方法
  • Delta 维护资源变化的历史列表
  • Async 异步调用
  • Trans 两阶段提交所需的交互
  • PubSub 发布-订阅交互

基本的REST服务组合可以建立常见的任务、实体和公用功能等服务层。设计REST服务组合时需要考虑:

  • REST服务* 组合可以在组合启动者和组合控制器之间使用同步或异步消息交换。
  • 在给定服务活动中的多个服务调用之间经常要保证幂等性,
  • 若要设计有效的REST服务组合架构,就需要理解在组合参与者之间使用后期绑定的优势和劣势。
    而复杂服务组合设计的常见矛盾之一是对服务无状态(418)和无状态{395}的运用。

书中介绍了几种高级服务组合:

  • 跨服务的REST事务,均受益于事务协调者角色以满足服务无状态
    • REST友好的原子服务事务: 初始化-预留-确认、取消、超时
    • REST友好的补偿服务事务:开始-执行-完成、撤销、超时
    • 非REST友好的原子服务事务:初始化-执行-准备-提交、回滚或超时
  • 事件驱动的REST交互。
    • 消息机制
    • 消息轮询
  • 带有动态绑定和逻辑延迟的服务组合
  • 跨服务目录的服务组合

还有7个受REST启发的SOA设计模式:

  • 端点重定向。当过时的消费者访问旧服务端点时,它就会告知消费者新的服务端点。
  • 内容协商。基于消费者在请求消息中提供的不同元数据,内容协商[446]可使单个服务能力处理不同类型的消费者请求。
  • 端点链接。运用这一模式,服务在响应消息中向服务消费者提供链接,可支持实体关系的运行时通讯。
  • 幂等能力。消费者与服务之间无需持久保持的链接即可建立通讯可靠性。
  • 轻量级端点。鼓励在合理情况下使服务能力重叠。
  • 可重用契约。建立由多个服务共享的集中化技术契约。
  • 统一契约。统一契约是高度抽象且通用的,依赖通用方法(如GET和PUT)与媒体类型的结合。

最后提到,需要使用版本标识符来对契约、方法、媒体类型等进行版本控制。

SOA 宣言

Thomas Erl 牵头的SOA敏捷宣言,其格式效仿了敏捷(Agile)宣言,即将内容限制为简洁的陈述,由其表达雄心、价值观以及实现它们的指导原则。

我们一直采用面向服务来帮助企业组织不断地交付可持续的商业价值,
通过提高敏捷性和成本效益,以配合不断变化的业务需求。

    通过我们的工作,我们优先考虑:

    业务价值高于技术策略 
    战略目标高于特定项目的效益 
    内在互操作性高于定制的集成
    服务共享高于为特殊目的具体实施 
    灵活性高于优化 
    渐进的提炼高于完美的开始

    也就是说,尽管右项有其价值,我们更重视左项的价值。