SOA面向服务架构

  传统的SOA是一种面向服务的单体架构,强调服务共享和重用,国内“中台”概念其实就是一种SOA单体架构(中台是一个营销概念!),经过几十年的SOA实践探索,人们已经发现服务的解耦性必须高于服务的复用共享性,因此催生了微服务架构

  SOA定义是什么?著名软件工程专家Martin Fowler提出SOA歧义Service Oriented Ambiguity,认为"什么是SOA"是不可能回答,因为不同的人意味着不同的事情,SOA意味服务接口,意味流程整合,意味资源再利用,意味着管制,在下面SOA组件图中,服务和服务消费者(客户端)之间存在多个约束,当一个服务显式暴露后,客户端能够通过绑定定位到该服务,相当于两者签订了合同,规定了合同内容和如何实施,具体合同的描述是通过消息方式进行:

  由于Java等传统语言主要是以类表达对象,将功能行为封装在类内部,而业务客户一般都是注重软件的功能,包括同行业公司系统之间数据交流也是以功能服务为接口,因此,面向服务的架构SOA更加贴近业务客户,也更适合业务伙伴之间流程整合,各个行业已经诞生自己行业特点的SOA,例如电信联盟的NGOSS,已经成为电信行业业务支撑系统BOSS的标准。SOA不但是技术用语,也是业务销售用语,通过服务这个中间概念,可以实现业务和技术之间的无缝转换,如今SOA已经和REST DDD以及云计算等新技术方法结合。其内部主要概念有SCA ESB JBI等等,涉及工作流 规则引擎 消息总线等多个技术细节方面。

  通常,一个架构师进行系统架构顶层设计时,必须考虑使用者的利益,不能单单实现软件的功能,还要考虑到软件的性能Scalable 可用性available/usable 安全性等软件质量,还要借鉴社区的最佳实践和经验形成的模式和反模式,避免重蹈覆辙和陷阱,再大胆采取最新的软件技术(比如用REST替代SOAP等)。

  服务的提出其实隐含了两个概念,服务提供者和服务消费者,这两者之间有一个合同约定,这非常类似我们现实生活中签订的服务合同,A单位和B单位分别是服务的提供者和消费者,两者签订了一个服务合同,规定A为B提供某项服务。服务就是提供一些公共需求的设施,通过一个工作过程能提供帮助,使用,让使用者受益。

  服务具体有如下:Windows Service:如PC定位者RPC Locator, 事件日志EventLog, DHCP Client,;. 软件服务Software Service,如分布式服务Distribution Service, 警告服务Alert Service 安全服务 Security Service, 日志服务;业务服务Business Service,如 帐号和客户服务,销售服务,订单服务,采购服务。

  服务两个重要特点:自治和管制,自治代表服务不能被外部势力牵制,比如如果一个服务内部处理中需要调用外部资源或等待外部流程结束,这种等待不能影响服务本身的调用,如果一个服务分为显式对外和隐式内部两个部分,那么自治是针对隐式内部,意味着我们不能在具体一个服务中直接使用同步代码实现复杂功能。如:

public AServiceImpl implements AService{

  public void productSale(...){

    Product product = productService.getProduct();
    int inventory = InventoryService.getInventory(product);
    int price = priceService.getPrice(product);

 

  }

}

  在AServiceImpl的productSale方法中,我们获得商品的库存和定价,都是通过同步的RPC实现调用的,这样造成productSale方法依赖于InventoryService和priceService,无法实现自身自治。

  实现服务真正自治,实际就是解决类之间依赖耦合的问题,消息是一种方式,但是基于消息又有两种通讯方式,基于请求响应和基于事件的EDA。

  从服务自治可以看出,为什么要提出服务必须自治,因为服务是受管制的,在实际业务活动中,不同服务是被不同部分管理,比如定价服务归属财务部门系统,库存归属仓库系统,涉及系统之间调用协调不能自己使用同步RPC,而是需要消息。

  在实际应用中,很多单位使用SOA主要看中其能够无缝整合新旧系统,称为EAI企业应用整合,下图是苏宁的一种SOA图,使用ESB企业服务总线这样的消息系统整合了新旧各种系统。

苏宁SOA

  使用SOA和ESB能够灵活实现业务流程管理,工作流的管理BPM,如下图,一个订单的产生可能需要几个部门批准才能完成,而且这几个部门经常是变化的,如何灵活实现这种批准流程的定制也成为SOA实现的一部分,如下:

bpm

  注意图中1 2 3 4 5 6 7 8 9标注的订单处理流程步骤,这种不同服务之间调用处理顺序可通过BPM进行灵活定制。

  目前提供SOA全套解决方案和产品的厂商很多,包括IBM SAP和Oracle,国内金蝶用友浪潮软件等等,比如苏宁的SOA是以SAP为主的八国联军组装,既然SOA中间件服务商已经为我们提供了成熟的架构方案和产品,那么作为SOA使用者是否就无需顶层架构设计了呢?当然不是,SOA使用者要根据自己业务进行模块划分,进行领域建模设计,根据DDD领域驱动设计将业务分解为一个上下文模块,然后再用服务作为对外接口,内部封装的是DDD聚合根,而传统SOA作法是内部封装的是数据表的DTO,从而导致SOA服务内部腐烂堵塞,违背SOA自治和可用性等原则约束。具体可见DDD领域驱动设计

SOA的好处

1. 松耦合:由于服务自治,有一定封装边界,服务调用交互是通过发布接口。这意味着应用程序不感兴趣的服务如何被实现。
2.位置透明:服务的消费者不必关系服务位于什么地方。
3.可在异构平台间复用。可以将遗留系统包装成服务。
4.便于测试,能并行开发,较高可靠性和良好可伸缩性。

SOA基础

SOA面试题

SOA案例项目源码

SOA最佳实践

微服务架构

微服务实现工具概述

为什么RESTful微服务和异步编程是一种趋势?

Lagom是一个集成ES/CQRS的Reactive微服务框架

Docker:VM、代码迁移和SOA解决方案

Docker容器化组件架构

微服务专题

 

ESB/EAI集成

SOA之企业应用集成EAI

Apache ServiceMix介绍

什么时候使用Apache camel

SOA集成框架Spring Integration, Mule ESB or Apache Camel比较

Apache Camel建立基于消息的应用

基于Spring集成的EDA的开源项目

各种ESB产品比较

使用REST实现企业集成

使用Apache Camel实现REST端点集成

为什么你并不需要企业服务总线(ESB)

Apache Kafka简单介绍

企业服务总线ESB已死! 服务网格上位

更多ESB专题

Web服务

使用Spring Webservices建立SOAP服务代理

六个强大的创建RESTful服务的Java框架

使用Apache CXF开发RESTful服务

使用Apache CXF开发Web服务

使用SCA和JAX-RS建立RESTful服务

ZooKeeper在服务发现中应用

使用zookeeper和curator实现微服务的负载平衡

使用vert.x 2.0, RxJava 和 mongoDB创建一个简单的RESTful服务

Spring RESTful服务源码案例下载

使用Shiro实现基于服务的多域身份验证和授权

WEB服务WebService专题

微服务架构快速指南

Netflix hystrix入门教程

REST服务专题

BPM工作流/BPEL

在亚马逊云计算平台上使用Camel开发分布式工作流

Effektif:第一个基于云的BPM产品

BPMN开始结束事件的最佳实践

业务流程的新实现:微服务和事件编排

深入理解Activiti工作流

使用Activiti和Spring集成完成BPEL和BPM

工作流引擎四重罪

更多工作流专题

SOA最佳实践

构建实时流数据平台实践指南

SugarCRM使用EDA替代SOA

SOA并不能解决高并发事务

你的SOA已经使用了EDA和CQRS吗?

OOD vs SOA

DCI和服务Services (EJB)

使用Fabric3实现服务的组合

SOA企业线下培训咨询

NGOSS是什么

EBAY架构

LinkedIn架构

综合Twitter、Github等各大网站API设计经验:RESTful API实用设计与最佳实践 - Vinay Sahni

从单体SOA到微服务的思路转变:垂直切片的烟囱式故事已经一去不复返了,迎来的是新的中台微服务和渠道微服务

 

相关主题

云计算

云原生

技术架构

分布式系统

分布式架构

分布式CAP定理

分布式共识一致性教程

NoSQL数据库

中台数据工程教程

软件弹性工程与设计

分布式事务

分布式事务教程

#无服务器Serverless #EDA专题 #微服务架构

#CQRS架构 #中间件 #分布式系统

#REST专题

#API设计专题

#异步专题

更多# SOA专题