<a href="#%E7%9B%AE%E5%BD%95">目录</a>
<a href="#rpc">RPC</a>
<a href="#%E4%B8%80%E4%B8%AA%E9%80%9A%E8%BF%87-http-request-%E8%B0%83%E7%94%A8%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0%E7%9A%84-rpc-%E5%AE%9E%E7%8E%B0%E6%A0%B7%E4%BE%8B">一个通过 HTTP Request 调用操作函数的 RPC 实现样例</a>
<a href="#%E7%8E%AF%E5%A2%83">环境</a>
<a href="#%E6%8E%A5%E6%94%B6-http-request">接收 HTTP Request</a>
<a href="#rpc-%E8%B0%83%E7%94%A8%E5%85%B7%E4%BD%93%E7%9A%84%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0">RPC 调用具体的操作函数</a>
<a href="#%E6%B5%8B%E8%AF%95">测试</a>
RPC: 同一个项目内的不同服务进程之间的交互方式。为不同的进程服务提供了 <code>call()</code>(同步) 和 <code>cast()</code>(异步) 两种调用方式。
问题 1: 在一个 Openstack 项目中拥有多个不同的进程服务,EG. API Service/Manage Service。 当我们通过 Client 发送 API Request 去调用 Manage Service 执行一个操作任务时,我们会希望这个调用的结果是能够快速响应到 Client 的(保证用户体验)。
问题 2: 而且进程服务之间的调用我们还需要考虑如何有效的避免进程服务之间调用的阻塞问题。EG. API Service 调用 Manage Service 时,如果不能及时的将 API Service 释放掉,那么 API Request 就会因为被占用,而无法处理新的请求。
对于上面两个问题,我们可以通过将具体的执行过程和响应过程分离来达到理想的效果。这也是 RPC 和 API 存在的原因之一。
包含了下列两个过程实现:
接收 HTTP Request
RPC 调用操作函数
定义 HTTP Request URL 路由转发的 Resource
<a href="http://blog.csdn.net/jmilk/article/details/52081748">Openstack Paste.ini 文件详解</a>
将 Resource 和 HTTP 方法绑定到 Controller 的 Action 函数中
上述两个文件实现了通过 HTTP Request 的 POST 方法来执行指定的 Create() 函数。
通过 API 调用 RPC-API
API 的存在是为了能够快速的响应请求,至于之后的执行过程交由 RPC-API 和 Manager 来处理
rpc-api.py 调用 manager.py
在 rpcapi.py 定义的 RPC 接口函数会自动的映射到 manager.py 中指定的处理函数。
RPC-API 的存在是为了快速的响应进程服务之间的调用请求。
小结:
Openstack 的 PRC 调用的过程为: api.py ⇒ rpcapi.py ⇒ manager.py
启动 API 服务
启动 Manager 服务
发送 HTTP 请求
注意: 样例需要根据自身开发环境进行调整,