IT技术互动交流平台

openstack:RPC消息通信示例

来源:IT165收集  发布日期:2015-08-24 22:38:03

包括服务端和客户端:

1. RPC服务端:

Server.py:

 

#server.py server point

from oslo.config import cfg
from oslo import messaging

class ServerControlEndpoint(object):
	target = messaging.Target(namespace='control', version='2.0')
	
	def __init__(self, server):
		self.server = server
		
	def stop(self, ctx):
		if self.server:
			print("### I AM HERE @stop a")
			self.server.stop()
		print("### I AM HERE @ stop b")
		

class TestEndpoint(object):
	def test(self, ctx, arg):
		print("### I AM HERE @ test,arg:%s" %arg)
		return arg


transport = messaging.get_transport(cfg.CONF)
target = messaging.Target(topic='test', server='server1')
endpoints = [
	ServerControlEndpoint(None),
	TestEndpoint(),
]

server = messaging.get_rpc_server(transport, target, endpoints, executor='blocking')

server.start()
server.wait()

2. client.py:

 

 

#client.py

from oslo.config import cfg
from oslo import messaging

transport = messaging.get_transport(cfg.CONF)
target = messaging.Target(topic='test')
client = messaging.RPCClient(transport, target)
ret = client.call(ctxt = {},
			method = 'test',
			arg = 'myarg')
							
cctxt = client.prepare(namespace='control', version='2.0')
cctxt.cast({}, 'stop')

 

3. 执行

 

执行server服务:

[root@controller-rdo site-packages]# /usr/bin/python2.7 server.py

执行client发消息:

[root@controller-rdo site-packages]# /usr/bin/python2.7 client.py

 

在server端就会出现触发:

[root@controller-rdo site-packages]# /usr/bin/python2.7 server.py

### I AM HERE @ test, arg:myarg

### I AM HERE @ stop b

4.说明

Transport(传输层):主要实现RPC底层的通信(比如socket)以及事件循环、多线程等其他功能。可以通过url来获得指定不同transport实现的句柄。Url的格式为:

Transport://user:pass@host1:port[,hostN:portN]/virtual_host

目前支持的transport有rabbit,qpid和zmq,分别对应不同的后端消息总线。用户可以通过oslo.messaging.get_transport来获得transport对象实例的句柄

 

Targtet(目的地):target封装指定了某一个消息最终目的地的所有信息。

Target对象属性:

Exchange

Topic 非常重要,在openstack用的比较多,以后会有文章介绍cinder中的使用

Namespace

Version

Server

Fanout

 

Server(服务器):一个服务器可以暴露多个endpoint,每个endpoint包含一组方法,这组方法是可以被客户端通过某种transport对象远程调用的。创建server时,需要制定transport、target和一组endpoint。

 

RPC Client:通过RPC Client,可以远程调用RPC Server上的方法。远程调用时,需要提供一个字典对象来指明调用的上下文,调用方法的名字和传递给调用方法的参数。

 

调用方式:有call和cast两种远程调用方式。Cast方式请求发送后就直接返回;call方式需要等待服务器端的响应。



 

延伸阅读:

Tag标签: 示例   消息  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规