Openstack_通用技术_RPC 远程异步调用
目录
RPC
RPC: 同一个项目内的不同服务进程之间的交互方式。为不同的进程服务提供了 call()
(同步) 和 cast()
(异步) 两种调用方式。
问题 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
- RPC 调用操作函数
环境
Devstack 用的 L 版,样例在自定义的 Openstack 项目中实现,详见自动化生成 Openstack 新项目开发框架。
接收 HTTP Request
- 定义 HTTP Request URL 路由转发的 Resource
详见Openstack Restful API 开发框架 Paste + PasteDeploy + Routes + WebOb 和
Openstack Paste.ini 文件详解
# project/api/v1/router.py
from project.api.v1 import new_resource
class APIRouter(octopunch.api.openstack.APIRouter):
"""Routes requests on the API to the appropriate controller and method."""
ExtensionManager = extensions.ExtensionManager
def _setup_routes(self, mapper, ext_mgr):
self.resources['versions'] = versions.create_resource()
mapper.connect("versions", "/",
controller=self.resources['versions'],
action='show')
mapper.redirect("", "/")
self.resources['new_resource'] = new_resource.create_resource(ext_mgr)
mapper.resource('new_resource', 'new_resource',
controller=self.resources['new_resource'])
- 将 Resource 和 HTTP 方法绑定到 Controller 的 Action 函数中
# project/api/v1/new_resource.py
class NewResourceController(wsgi.Controller):
def __init__(self, ext_mgr):
self.ext_mgr = ext_mgr
super(NewResourceController, self).__init__()
# Create() 对应了 HTTP 的 POST 方法
@wsgi.serializers()
def create(self, req, body):
"""Create a NewResource."""
context = req.environ['project.context']
# Sync the project database.
self.new_resource_api.db_sync(context)
def create_resource(ext_mgr):
"""project resource factory method."""
return wsgi.Resource(NewResourceController(ext_mgr))
上述两个文件实现了通过 HTTP Request 的 POST 方法来执行指定的 Create() 函数。
RPC 调用具体的操作函数
- 通过 API 调用 RPC-API
# project/new_resource/api.py
# import rpcapi module
from project.new_resource import rpcapi as new_resource_rpcapi
class API(base.Base):
"""API for interacting with the new_resource manager."""
def __init__(self, db_driver=None, image_service=None):
self.new_resource_rpcapi = new_resource_rpcapi.NewResourceAPI()
super(API, self).__init__(db_driver)
# 定义调用 rpcapi 的接口函数
def db_sync(self, context):
"""Call rpc api to start db sync for new_resource database."""
self.new_resource_rpcapi.db_sync(context)
API 的存在是为了能够快速的响应请求,至于之后的执行过程交由 RPC-API 和 Manager 来处理
- rpc-api.py 调用 manager.py
在 rpcapi.py 定义的 RPC 接口函数会自动的映射到 manager.py 中指定的处理函数。
# project/new_resource/rpcapi.py
class NewResourceAPI(object):
def __init__(self):
super(NewResourceAPI, self).__init__()
target = messaging.Target(topic=CONF.manage_topic,
version=self.RPC_API_VERSION)
serializer = objects_base.ProjectObjectSerializer()
self.client = rpc.get_client(target, version_cap='1.8',
serializer=serializer)
# 定义 rpcapi 函数,使用 cast 异步调用方式
def db_sync(self, context):
cctxt = self.client.prepare()
# 指定 rpcapi 的调用方式,和指定映射到 manager.py 的处理函数
cctxt.cast(context, 'db_sync')
RPC-API 的存在是为了快速的响应进程服务之间的调用请求。
# project/new_resource/manager.py
class NewResourceManager(manager.Manager):
RPC_API_VERSION = '1.8'
target = messaging.Target(version=RPC_API_VERSION)
def __init__(self, service_name=None, *args, **kwargs):
super(NewResourceManager, self).__init__(*args, **kwargs)
self._startup_delay = True
def init_host_with_rpc(self):
eventlet.sleep(CONF.periodic_interval)
self._startup_delay = False
def db_sync(self, context):
print "这里是具体的 RPC 操作函数"
小结:
Openstack 的 PRC 调用的过程为: api.py ⇒ rpcapi.py ⇒ manager.py
详见:Openstack Nova 源码分析 — RPC 远程调用过程
测试
- 启动 API 服务
project-api --config-file /etc/project/proname.conf
- 启动 Manager 服务
project-manager --config-file /etc/project/project.conf
- 发送 HTTP 请求
curl -i 'http://<Service_host_ip>:<service_port>/v1/<project_id>/<ResourceUrl>' -X POST -H "Content-Type: application/json" -H "X-Auth-Project-Id: admin" -H "X-Auth-Token: <token_id>" -d '<body_content_dict>'
注意: 样例需要根据自身开发环境进行调整,
Openstack_通用技术_RPC 远程异步调用的更多相关文章
- [SAP ABAP开发技术总结]Function远程、同步、异步调用
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- XML-RPC远程方法调用
一.简介 XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用. 它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列 ...
- PRC远程过程调用
RPC(Remote Promote Call) 一种进程间通信方式.允许像调用本地服务一样调用远程服务. RPC框架的主要目标就是让远程服务调用更简单.透明.RPC框架负责屏蔽底层的传输方式(TCP ...
- Dubbo学习笔记4:服务消费端泛化调用与异步调用
本文借用dubbo.learn的Dubbo API方式来解释原理. 服务消费端泛化调用 前面我们讲解到,基于Spring和基于Dubbo API方式搭建简单的分布式系统时,服务消费端引入了一个SDK二 ...
- RabbitMQ九:远程过程调用RPC
定义 RPC(Remote Procedure Call Protocol)——远程过程调用协议:它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...
- 抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会
hello,大家好呀,我是小楼. 最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊~ 他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说不定可以水,哦不.. ...
- C# 多线程详解 Part.02(UI 线程和子线程的互动、ProgressBar 的异步调用)
我们先来看一段运行时会抛出 InvalidOperationException 异常的代码段: private void btnThreadA_Click(object sender, ...
- ABAP中的同步和异步调用
ABAP 的 CALL FUNCTION 类似于 Java/.NET 中的本地或远程方法调用.CALL FUNCTION 可以分为四种:1. Synchronous RFC (sRFC) - 同步调用 ...
- Ajax异步调用使用
//验证通知号重复 function checkinformcodeagage() { var informcode = $("#txtinformcode").val(); if ...
随机推荐
- 【论文解读】[目标检测]retinanet
作为单阶段网络,retinanet兼具速度和精度(精度是没问题,速度我持疑问),是非常耐用的一个检测器,现在很多单阶段检测器也是以retinanet为baseline,进行各种改进,足见retinan ...
- 2019 安洵杯 Re 部分WP
0x01.EasyEncryption 测试文件:https://www.lanzous.com/i7soysb 1.IDA打开 int sub_416560() { int v0; // eax i ...
- JS中对数组元素进行增、删、改、查的方法,以及其他方法
前言 昨天联调一个页面,看着就一个页面,接口倒是不少. 热点问题配置测试联调完成(同步异步接口共11个) 1.配置新增 2.配置编辑 3.配置删除 4.热点问题新增 5.热点问题编辑 6.热点问题删除 ...
- python之 yield --- “协程”
在编程中我们经常会用到列表,以前使用列表时需要声明和初始化,在数据量比较大的时候也需要把列表完整生产出来,例如要存放1000给数据,需要准备长度1000的列表,这样计算机就需要准备内存放置这个列表,在 ...
- Docker数据目录相关操作
数据目录挂载 我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器.使用 -v 选项 docker run -id -v /宿主机绝 ...
- Docker 启动与停止容器
启动已运行过的容器 docker start 容器名称|容器id 如: docker start mycentos 启动所有运行过的容器(注意:反单引号` `), docker ps -a -q 是查 ...
- CenterOS7中解决No package mysql-server available.
CenterOS7中解决No package mysql-server available. 1.使用yum install -y mysql-server报错如下: [root@heyong_jd ...
- $strobe$monitor$display
$strobe:当该时刻的所有事件处理完后,在这个时间步的结尾打印一行格式化的文本,语法$strobe( Argument,...);$fstrobe( Mcd, Argument,...);Mc ...
- Ant Design -- 图片可拖拽效果,图片跟随鼠标移动
Ant Design 图片可拖拽效果,图片跟随鼠标移动,需计算鼠标在图片中与图片左上角的X轴的距离和鼠标在图片中与图片左上角的Y轴的距离. constructor(props) { super(pro ...
- vue-cli3.0配置
仅在项目根目录中新建vue.config.js文件即可,部分配置如下 module.exports = { // 基本路径 baseUrl: '/', // 输出文件目录 outputDir: 'di ...