SOA(面向服务的软件架构、Service Oriented Architecture),是一种软件设计模式,主要应用于不一样应用组件之间经过某种协议来互操做。例如典型的 通讯网络协议。所以SOA是独立于任何厂商、产品、技术的。编程
SOA有两个层面的定义:设计模式
简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息,技术应用在WebService上。服务器
表征状态转移(Representional State Transfer)。其宗旨是从资源的角度来观察整个网络,分布在各处的资源由URI肯定,而客户端的应用经过URI来获取资源的表征。得到这些表征导致这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变着其状态。网络
举个栗子:架构
Marcus是一个农民,他有4头牛,12只鸡和3头奶牛。他如今模拟一个REST API,而我是客户端。若是我想用REST来请求当前的农场状态,我仅会问:“State?”Marcus会回答:“4头猪、12只鸡、3头奶牛”。框架
这是REST最简单的一个例子。Marcus使用表征来传输农场状态。表征的句子很简单:“4头猪、12只鸡、3头奶牛”。
再往下看,看我如何让Marcus用REST方式添加2头奶牛?
按照常理,能够会这样说:Marcus,请在农场你再添加2头奶牛。难道这就是REST方式吗?难道就是经过这样的表征来传输状态的吗?不是的!这是一个远程过程调用,过程是给农场添加2头奶牛。
Marcus很愤怒地响应到:“400,Bad Request”,你究竟是什么意思?
因此,让咱们从新来一次。咱们怎样作到REST方式呢?该怎样从新表征呢?它应该是4头猪、12只鸡、3头奶牛。好,让咱们再次从新表征……
我:“Marcus,……4头猪、12只鸡、5头奶牛!”
Marcus:“好的”。
我:“Marcus,如今是什么状态?”
Marcus:“4头猪、12只鸡、5头奶牛”。
我:“好!”
看到了吗?就这样简单。分布式
为何RPC也不够好?
从逻辑角度来看,为何会更加青睐REST而不是RPC(Remote Procedure Call,远程过程调用 ),由于它极大的下降了咱们沟通的复杂度,经过把表征做为惟一的沟通的方式。无需去讨论过程(添加一头牛?增长一种动物类型?给鸡的数量翻倍仍是卖掉全部猪?)咱们只需讨论表征,而且使用这个表征来达到咱们想要的目标,很简单,不是吗?我不但愿和Marcus的沟通失败,由于咱们彼此的理解过程会不同,因此只须要知道最后的状态就行。但这仅仅是建立RPC会产生许多问题之一。若是你使用RPC,你须要设计一些程序嵌入到某种结构中。这种结构须要存储参数、错误的代码、返回值等。经过URL取代了传递大量参数。spa
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通讯程序之间携带信息数据。在OSI网络通讯模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。如阿里Dubbo框架。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,而后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器得到进程参数,计算结果,发送答复信息,而后等待下一个调用信息,最后,客户端调用进程接收答复信息,得到进程结果,而后调用执行继续进行。操作系统