在上一篇文章中,我说到SOA是一个特别大的话题,不但没有绝对统一的原则,而且很多原则本身的内容也具备相当模糊性和宽泛性。虽然我们可以说SOA ≈ 模块化开发 + 分布式计算,但由于其原则的模糊性,我们仍然很难说什么应用是绝对符合SOA的,只能识别出哪些是不符合SOA的。
本篇将对8种可操作的服务设计原则进行细化的分析,作为SOA实践的参考。
服务设计原则1:优化远程调用
这里的远程调用特指RPC(Remote Procedure Call)。当然更面向对象的说法应该是远程方法调用或者远程服务调用等等。
由于SO接口通常要被远程访问,而网络传输,对象序列化/反序列化等开销都远远超过本地Object访问几个数量级,所以要加快系统的响应速度、减少带宽占用和提高吞吐量,选择高性能的远程调用方式经常是很重要的。
但是远程调用方式往往又要受限于具体的业务和部署环境,比如内网、外网、同构平台、异构平台等等。有时还要考虑它对诸如分布式事务,消息级别签名/加密,可靠异步传输等方面的支持程度(这些方面通常被称为SLA:service level agreement),甚至还包括开发者的熟悉和接受程度等等。
因此,远程调用方式往往需要根据具体情况做出选择和权衡。
以Java远程Service为例分析不同场景下,传输方式的某些可能较好选择:
内网 + 同框架Java客户端 + 大并发:多路复用的TCP长连接 + kryo (二进制序列化) (kryo也可以用Protostuff,FST等代替)
内网 + 不同框架Java客户端:TCP + Kryo
内网 + Java客户端 + 2PC分布式事务:RMI/IIOP (TCP + 二进制)
内网 + Java客户端 + 可靠异步调用:JMS + Kryo (TCP + 二进制)
内网 + 不同语言客户端:thrift(TCP + 二进制序列化)
外网 + 不同语言客户端 + 企业级特性:HTTP + WSDL + SOAP (文本)
外网 + 兼顾浏览器、手机等客户端:HTTP + JSON (文本)
外网 + 不同语言客户端 + 高性能:HTTP + ProtocolBuffer (二进制)
简单来说,从性能上讲,tcp协议 + 二进制序列化更适合内网应用。从兼容性、简单性上来说,http协议 + 文本序列化更适合外网应用。当然这并不是绝对的。另外,tcp协议在这里并不是限定远程调用协议一定只能是位于OSI网络模型的第四层的原始tcp,它可以包含tcp之上的任何非http协议。
所以,回答上面提到的问题,WebServices (经典的WSDL+SOAP+HTTP)虽然是最符合前述SOA设计原则的技术,但并不等同于SOA,我认为它只是满足了SOA的底线,而未必是某个具体场景下的最佳选择。这正如一个十项全能选手在每个单项上是很难和单项冠军去竞争的。更理想的SOA Service最好能在可以支持WebServices的同时,支持多种远程调用方式,适应不同场景,这也是Spring Remoting,SCA,Dubbo,Finagle等分布式服务框架的设计原则。
本篇将对8种可操作的服务设计原则进行细化的分析,作为SOA实践的参考。
服务设计原则1:优化远程调用
这里的远程调用特指RPC(Remote Procedure Call)。当然更面向对象的说法应该是远程方法调用或者远程服务调用等等。
由于SO接口通常要被远程访问,而网络传输,对象序列化/反序列化等开销都远远超过本地Object访问几个数量级,所以要加快系统的响应速度、减少带宽占用和提高吞吐量,选择高性能的远程调用方式经常是很重要的。
但是远程调用方式往往又要受限于具体的业务和部署环境,比如内网、外网、同构平台、异构平台等等。有时还要考虑它对诸如分布式事务,消息级别签名/加密,可靠异步传输等方面的支持程度(这些方面通常被称为SLA:service level agreement),甚至还包括开发者的熟悉和接受程度等等。
因此,远程调用方式往往需要根据具体情况做出选择和权衡。
以Java远程Service为例分析不同场景下,传输方式的某些可能较好选择:
内网 + 同框架Java客户端 + 大并发:多路复用的TCP长连接 + kryo (二进制序列化) (kryo也可以用Protostuff,FST等代替)
内网 + 不同框架Java客户端:TCP + Kryo
内网 + Java客户端 + 2PC分布式事务:RMI/IIOP (TCP + 二进制)
内网 + Java客户端 + 可靠异步调用:JMS + Kryo (TCP + 二进制)
内网 + 不同语言客户端:thrift(TCP + 二进制序列化)
外网 + 不同语言客户端 + 企业级特性:HTTP + WSDL + SOAP (文本)
外网 + 兼顾浏览器、手机等客户端:HTTP + JSON (文本)
外网 + 不同语言客户端 + 高性能:HTTP + ProtocolBuffer (二进制)
简单来说,从性能上讲,tcp协议 + 二进制序列化更适合内网应用。从兼容性、简单性上来说,http协议 + 文本序列化更适合外网应用。当然这并不是绝对的。另外,tcp协议在这里并不是限定远程调用协议一定只能是位于OSI网络模型的第四层的原始tcp,它可以包含tcp之上的任何非http协议。
所以,回答上面提到的问题,WebServices (经典的WSDL+SOAP+HTTP)虽然是最符合前述SOA设计原则的技术,但并不等同于SOA,我认为它只是满足了SOA的底线,而未必是某个具体场景下的最佳选择。这正如一个十项全能选手在每个单项上是很难和单项冠军去竞争的。更理想的SOA Service最好能在可以支持WebServices的同时,支持多种远程调用方式,适应不同场景,这也是Spring Remoting,SCA,Dubbo,Finagle等分布式服务框架的设计原则。