注意:我知道问题标题不是最理想的。随意改进。
Thrift支持序列化和RPC。但是,与COM或CORBA或ZeroC ICE等系统不同,......它不以多态方式具有远程对象或远程接口的概念,因此Thrift基础架构中定义的所有服务都只是功能集合。
将非特征状态(接口?)多态性作为一个非常公平的非目标,但是......
作为一个自然使用对象的语言的程序员,我可以拥有返回其他对象(或接口引用)的函数,而不仅仅是结构,这似乎有点尴尬,因为这意味着所有“对象“节俭服务中的功能必须由另外将句柄作为输入参数来定义正在操作的函数提供 - 有点像在C中执行OO :-)
想象一下对文件进行操作的thrift服务。它的界面看起来更像C(fopen
等),而不是我们今天在C ++,C#甚至Python中使用的界面。
当然可以用目标语言编写额外的包装器,但是你没有Thrift框架的任何支持,所以这就是我所谓的“尴尬”。
用另一种方式表达:在远程服务级别回退到纯粹的程序界面是一个问题吗?
为了给这又一个转折:即使我使用Jenkins的REST接口,基于URL的接口我感觉有些“OO”,因为我通过URL名称访问作业对象,然后指定对它们的操作通过GET参数。也就是说,对我来说,基于字符串的REST方法似乎可以比纯粹的程序界面更自然地捕获对资源(对象或接口,如果你喜欢)的操作。 Thrift完全可以定义超出范围,但很高兴知道用户是否认为这是一个值得注意的事情。
这是一个活跃的Thrift用户的问题:我上面描述的问题是否是日常使用中的实际问题?这是一个观察到的问题吗?
这是SOA的一般“问题”吗?
答案 0 :(得分:2)
我的印象是,你以不正确的方式混合概念,然后尝试从中得出结论。
RPC只不过是remote procedure call。这意味着:调用一段远程代码,传递一些参数并获得一些结果。这就是全部。如何解释这些数据是完全不同的事情。
在OOP上下文中,每个 method call(包括RPC,但不限于)是一个过程/函数调用,带有一个额外的隐藏参数,通常称为{{1} }或this
。真正区分对象和非OOP代码的是能够进行信息隐藏,派生类和覆盖方法以及其他一些好东西。在幕后,一切都只是数据,当您必须将对象取消/序列化为数据时,这一点变得非常明显。数据库 - 在大多数情况下,您将使用某种ORM来执行该任务。 RPC机制位于等效平面上。 COM或CORBA等框架在幕后进行is nothing else, they just hide it better from you。
至少在COM上,你不是在处理对象。您正在与接口进行交互,这些接口通常实现为对象。很难判断特定接口是否是对象的一部分,或者是否由aggregation或组合添加。即使相反也可能是这样:可能是这样的情况,由于某种原因,两个不相关的接口可能由同一个对象实例实现。接口与服务的共同点多于对象的共同点。
SOA不仅限于RPC。例如,许多人认为REST-based接口不被认为是RPC(虽然可以说这一点)并且不提供任何值得命名的对象,但您可以使用REST进行SOA。当然,SOA也不仅限于COM或CORBA环境,也不限于SOAP或XML-RPC接口。 SOA主要是关于服务(因此是名称),而不是对象。把它放在一个句子中,RPC,OOP和SOA是不同的概念,并且将它们相互比较就是所谓的category mistake。
服务器和客户端代码如何表示数据取决于所使用的系统和目标语言的特征。不要让自己对IDL实体的命名感到困惑 - IDL中的Self
不一定是代码中的struct
。例如,使用Thrift和C#作为目标语言,您可以从struct
生成整齐的partial class
,可以使用一些手动编写的代码轻松扩展。这可能与另一种目标语言(例如普通C或the Go language)和另一种系统(如Protobuf,Avro或您选择的REST客户端)不同。