什么是“服务器”上的存根,骨架是什么意思?
Posted
技术标签:
【中文标题】什么是“服务器”上的存根,骨架是什么意思?【英文标题】:what is stub on the "server" and what does skeleton mean? 【发布时间】:2012-01-25 01:14:18 【问题描述】:stub 在服务器端做了什么?什么是骨架?
这是来自***的图表。我在服务器机器和客户端机器上都安装了 stub。我知道存根有助于客户端的网络,但存根在服务器端有什么作用?
还有上图中的skeleton是什么意思?
【问题讨论】:
【参考方案1】:看下图:
简而言之,stub 和 skeleton 是 Web 服务设置中的对应物。 Skeleton belongs to service provider side
和 stub belongs to receiver side
。在较低级别的存根和骨架相互通信。
从客户端,业务对象与存根对象进行通信,存根负责形成消息并调用 Web 服务。一旦调用完成,在服务提供方,骨架是存根的并行对象,它接收请求消息并理解它并将信息传递给服务方业务对象。
【讨论】:
【参考方案2】:存根和骨架都隐藏了一些复杂性。
存根隐藏了参数的序列化和网络级别的通信,以便向调用者提供简单的调用机制。
骨架负责将调用分派给实际的远程对象实现。
http://docs.oracle.com/javase/7/docs/platform/rmi/spec/rmi-arch2.html
http://www-itec.uni-klu.ac.at/~harald/ds2001/rmi/rmi.html
【讨论】:
服务器机器上的存根是否被称为骨架?客户端机器上的同一个存根? Skeleton 只是服务器端的一个存根。我想。我在大学里用 RMI 已经很久了... :) 它与客户端机器上的存根有何不同? 区别正是我在回答中所描述的:存根负责将对 java 对象的调用编组(转换)为网络级“调用”,并且骨架执行相同但顺序相反.它将网络级“调用”解组(转换回)到 java 类调用。 当我在服务器和客户端上保留相同的 .class 文件时,它们的行为有何不同?你能解释一下吗【参考方案3】:你需要做的第一件事就是忘记骷髅。它们自 1998 年以来就已经过时了。
stub 由远程对象在导出时创建。然后它要么绑定到 Registry 并由客户端通过查找获取,要么作为另一个远程方法的结果直接返回给客户端。
客户端然后使用存根作为相关远程接口的实现,执行 RMI 的网络部分,与服务器 JVM 交互,最终在远程对象中调用与客户端在存根中调用相同的方法。
【讨论】:
【参考方案4】:理解“stubs”和“skeletons”的关键是理解marshalling的概念:
What Is Data Marshalling?
Marshalling (computer science)
How RPC Works
rmiregistry 只是一个查找工具;而已。当服务器执行bind()
时,它会将自己“注册”到rmiregistry。当客户端执行lookup()
时,他会检查服务器上注册的内容。不多也不少。
我认为对诸如“骷髅”之类的术语进行狡辩是没有意义的。如果您愿意,可以将所有内容称为“存根”。重点是,两者都是PROXIES,都做MARSHALLING,一侧存在于客户端(客户端调用),另一侧存在于服务器(骨架调用实际服务器代码)。
希望我的解释和示例对您的 another link 有所帮助(至少有点)。
【讨论】:
【参考方案5】:存根
远程对象的存根充当远程对象的客户端本地代表或代理。存根隐藏了参数的序列化和网络级别的通信,以便向调用者提供一种简单的调用机制。
或者,考虑在一台机器上运行的程序:每个方法都是一个分支。当您将该方法移动到远程计算机时,您会切断分支,留下一个仅包含通信的存根。Source
骨架
在远程JVM中,每个远程对象都可能有一个对应的骨架。骨架负责将调用分派给实际的远程对象实现。
还有一个我认为是第一个实现的骨架 - 满足调用约定、执行部分操作并令人满意地完成的东西。
表格Oracle
【讨论】:
骨架代码不是伪代码,也不是伪代码。【参考方案6】:存根: 存根是一个小程序例程,用于替代较长的程序,可能稍后加载或位于远程。
骨架 远程对象的骨架是一个服务器端实体,它将调用调度到实际的远程对象实现。
【讨论】:
【参考方案7】:我将只解决为什么存根需要在服务器端以及客户端的问题。其他问题已经回答了。
当导出的远程对象作为方法参数或返回值传递给远程对象时,会发生以下情况。在服务器机器上创建一个存根。然后它被序列化,通过网络发送到客户端机器,并在那里反序列化以制作相同的存根副本。之后,服务器机器上不再需要存根。
这是一个典型的场景。
在服务器机器 S 上,创建并导出了一个对象 s。 导出的一部分是为 s 创建一个存根;称之为 ss0。 机器 S 以 s 作为参数执行 Naming.bind。 服务器端存根 ss0 被序列化并发送到注册中心的机器 R。 ss0的序列化版本用于创建ss0 R的副本;称之为 ss1。 R 上的注册表保留对 ss1 的引用。因此,在服务器端使用存根的一个用途是可以对其进行序列化并将其副本发送到其他机器,例如,作为绑定的一部分。以类似的方式,当客户端进行查找时,注册表会序列化其副本(ss1)并将其发送给客户端。
【讨论】:
在导出远程对象时创建一次存根,而不是每次将其用作参数或返回值。因此,您的要点也是不正确的。 “在那之后,客户端机器中不再需要存根”也是不正确的,当您同时谈论参数和返回值时,您对“服务器”和“客户端”的使用只是令人困惑。 注册表不保存指向任何东西的指针。它保留存根。你在定义它之前提到了ss1
,但是所有这些关于ss0/1/2
的讨论都是毫无意义的。它们都是同一个存根的副本,就像“ss0
的序列化版本”一样。没有必要谈论“服务器端存根”和副本是不同的东西。它们都只是“存根”。
ss2 是一个错字。固定的。谢谢。如果你不喜欢“指针”这个词,那么“参考”。不同 VM 中的存根是不同的对象。它们可能代表相同的事物,但它们是不同的对象。 OP 想知道为什么服务器的虚拟机上有一个存根对象。这就是我要解释的。目前投票最多的两个答案(aMooly 和 Matjaz)没有解决这部分问题。以上是关于什么是“服务器”上的存根,骨架是什么意思?的主要内容,如果未能解决你的问题,请参考以下文章