0

编辑:我原来的标题是“在 RPC 中使用存根”;我编辑标题只是为了让其他人知道它不仅仅是那个问题。

我已经开始开发一些基于 SOAP 的服务,但我无法理解存根的作用。引用维基:

客户端和服务器使用不同的地址空间,因此必须执行函数调用中使用的参数的转换,否则这些参数的值无法使用,因为指向计算机内存的指针指向每台机器上的不同数据。即使对于简单的参数,客户端和服务器也可以使用不同的数据表示(例如,整数的大端与小端)。存根用于执行参数的转换,因此远程函数调用看起来像本地函数调用对于远程计算机。

这很愚蠢,但我“实际上”不明白这一点。我已经用 Java 进行了一些套接字编程,但是当我的 TCP/UDP 客户端与我的服务器交互时,我不记得任何“参数转换”步骤。(我假设使用 TCP/UDP 套接字的原始服务器-客户端通信确实属于 RPC)

我在 RESTful 服务开发方面有一些经验,但我也无法识别带有 REST 的 Stub 类似物。有人可以帮帮我吗 ?

4

1 回答 1

2

通过网络调用的存根(无论是 SOAP、REST、CORBA、DCOM、JSON-RPC 还是其他)只是帮助类,它们为您提供了一个处理所有底层细节的包装函数,例如:

  • 初始化你的 TCP/UDP/任何传输层
  • 找到正确的呼叫地址并在需要时进行 DNS 查找
  • 连接到服务器应位于的网络端点
  • 如果服务器未在侦听,则处理错误
  • 检查服务器是否符合我们的预期(安全检查、版本控制等)
  • 协商编码格式
  • 以适合在网络上传输的格式(CDR、NDR、JSON、XML 等)对您的请求参数进行编码(或“编组”)
  • 通过网络传输您的编码请求参数,根据需要处理分块或流量控制
  • 接收来自服务器的响应
  • 解码(或“解组”)响应详细信息
  • 将响应返回到您的原始调用代码(或者如果出现问题则抛出错误)

没有“原始” TCP 通信之类的东西。如果您在请求/响应模型中使用它并从通过 TCP 连接发送的数据中推断出任何类型的含义,那么您已经在其中编码了某种形式的“参数”。您只是碰巧自己构建了存根通常会提供的东西。

存根试图让你的远程调用看起来像本地进程调用,但老实说,这是一件非常糟糕的事情。它们根本不一样,您的应用程序应该以不同的方式考虑它们。

于 2012-08-23T20:53:27.247 回答