服务器端

 
 

安装 ubuntu 16.04 server

 
 

安装 rabbitmq-server

 
 

设置 apt 源

curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.python.sh | bash

 
 

使用 apt-get install rabbitmq-server 安装 rabbitmq 服务器

 
 

按键Y或者 y 确认安装

 
 

 
 

rabbitmq-server 简单管理

 
 

rabbitmq-server通过 rabbitmqctl 进行管理,以
管理员身份执行 rabbitmqctl 可以列出全部可以使用的
指令

 
 

创建用户

sudo rabbitmqctl add_user user_name password

 
 

更改密码

sudo rabbitmqctl change_password user_name new_password

 
 

增加虚拟主机

sudo rabbitmqctl add_vhost vhost_name

 
 

授予权限

sudo rabbitmqctl set_permissions -p vhost_name user_name ".*" ".*" ".*"

 
 

 
 

说明:

user_name为
用户名

password 为密码

new_password 为新密码

vhost_name 为
虚拟主机名

".*" ".*" ".*" 为权限,分别代表 configure , read , write

 
 

 
 

 
 

 
 

如果出现错误,可以
查看 rabbitmq-server 日志, sudo tail -f /var/log/rabbitmq/rabbit@ubuntu

 
 

 
 

 
 

注意:默认用户 guest 不允许远程访问

 
 

 
 

安装管理插件

 
 

使用命令 sudo rabbitmq-plugins enable rabbitmq_management

 
 

 
 

使用 rabbitmq-server 的端口 15672 访问管理系统

 
 

 
 

登录
管理平台的用户,必须授予 adminstrator 权限,
使用命令 sudo rabbitmqctl set_user_tags user_name administrator, 例如

 
 

使用
授权的用户登录

 
 

 
 

 
 

客户端使用

 
 

安装 pika

 
 

使用命令 pip install pika 安装 pika 库

 
 

 
 

测试
例程

 
 

import pika

import random

 
 

credentials = pika.PlainCredentials('jeffery', '1234')

#这里可以连接远程IP,请记得打开远程端口

parameters = pika.ConnectionParameters('192.168.30.128',5672,'/',credentials)

connection = pika.BlockingConnection(parameters)

channel = connection.channel()

 
 

#channel.queue_declare(queue='hello')

number = random.randint(1,1000)

body = 'hello world:%s' %number

channel.basic_publish(exchange='',

routing_key='hello',

body=body)

print " [x] Sent %s" %body

connection.close()

 
 

 
 

测试
成功,例如

 
 

 
 

 
 

RPC 模式

 
 

客户端发送一个请求消息然后服务器回复一个响应消息。为了收到一个响应,我们需要发送一个'回调'的请求的队列地址。我们可以使用默认队列(在Java客户端除外)。

AMQP协议给消息定义了14个属性。大部分的属性很少使用,除了下面几个:

deliveryMode: 将消息标记为持久(值为2)或瞬态(任何其他值)。你可能记得在第二个教程中使用了这个属性。

contentType:用来设置mime类型。例如经常使用的JSON格式数据,就需要将此属性设置为:application/json。

replyTo: 通常用来命名一个回调队列.

correlationId: 用来关联RPC请求的响应.

 
 

 
 

 
 

工作流程

1)、客户端启动时,创建了一个匿名的回调队列。

2)、在一个RPC请求中,客户端发送一个消息,它有两个属性:1.REPLYTO,用来设置回调队列名;2.correlationId,对于每个请求都被设置成唯一的值。

3)、请求被发送到rpc_queue队列.

4)、RPC工作者(又名:服务器)等待接收该队列的请求。当收到一个请求,它就会处理并把结果发送给客户端,使用的队列是replyTo字段指定的。

5)、客户端等待接收回调队列中的数据。当接到一个消息,它会检查它的correlationId属性。如果它和设置的相匹配,就会把响应返回给应用程序。

 
 

 
 

例程:

 
 

rpc_server.py

 
 

#!/usr/bin/env python

import pika

 
 

credentials = pika.PlainCredentials('jeffery', '1234')

connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.30.128',5672,'/',credentials))

 
 

channel = connection.channel()

 
 

channel.queue_declare(queue='rpc_queue')

 
 

def fib(n):

if n == 0:

return 0

elif n == 1:

return 1

else:

return fib(n-1) + fib(n-2)

 
 

def on_request(ch, method, props, body):

n = int(body)

 
 

print(" [.] fib(%s)" % n)

response = fib(n)

 
 

ch.basic_publish(exchange='',

routing_key=props.reply_to,

properties=pika.BasicProperties(correlation_id = \

props.correlation_id),

body=str(response))

ch.basic_ack(delivery_tag = method.delivery_tag)

 
 

channel.basic_qos(prefetch_count=1)

channel.basic_consume(on_request, queue='rpc_queue')

 
 

print(" [x] Awaiting RPC requests")

channel.start_consuming()

 
 

 
 

rpc_client.py

 
 

#!/usr/bin/env python

import pika

import uuid

 
 

class FibonacciRpcClient(object):

def __init__(self):

credentials = pika.PlainCredentials('jeffery', '1234')

self.connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.30.128',5672,'/',credentials))

 
 

self.channel = self.connection.channel()

 
 

result = self.channel.queue_declare(exclusive=True)

self.callback_queue = result.method.queue

 
 

self.channel.basic_consume(self.on_response, no_ack=True,

queue=self.callback_queue)

 
 

def on_response(self, ch, method, props, body):

if self.corr_id == props.correlation_id:

self.response = body

 
 

def call(self, n):

self.response = None

self.corr_id = str(uuid.uuid4())

self.channel.basic_publish(exchange='',

routing_key='rpc_queue',

properties=pika.BasicProperties(

reply_to = self.callback_queue,

correlation_id = self.corr_id,

),

body=str(n))

while self.response is None:

self.connection.process_data_events()

return int(self.response)

 
 

fibonacci_rpc = FibonacciRpcClient()

 
 

print(" [x] Requesting fib(30)")

response = fibonacci_rpc.call(30)

print(" [.] Got %r" % response)

 
 

 
 

运行例程的效果

 
 

服务端

 
 

客户端

使用rabbitmq rpc 模式的更多相关文章

  1. RPC模式的Hub操作

    signalR 专题—— 第四篇 模拟RPC模式的Hub操作   在之前的文章中,我们使用的都是持久连接,但是使用持久连接的话,这种模拟socket的形式使用起来还是很不方便的,比如只有一个唯一的 O ...

  2. 【python】-- RabbitMQ RPC模型

    RabbitMQ RPC模型 RPC(remote procedure call)模型说通俗一点就是客户端发一个请求给远程服务端,让它去执行,然后服务端端再把执行的结果再返回给客户端. 1.服务端 i ...

  3. rabbitMQ tipic 模式

    RabbitMQ消息队列(八)-通过Topic主题模式分发消息(.Net Core版) 前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对di ...

  4. 1.RabbitMq - Work 模式

    RabbitMq - Work 模式 一.什么是Work模式 如果有几个消息都需要处理,且每个消息的处理时间很长,仅有一个消费者,那么当它在处理一个消息的时候,其他消息就只有等待. 等待有时候是好的, ...

  5. Solon rpc 之 SocketD 协议 - 单链接双向RPC模式

    Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...

  6. 8.rabbitmq RPC模拟微服务架构中的服务调用

    标题 : 8.rabbitmq RPC模拟微服务架构中的服务调用 目录 : RabbitMQ 序号 : 8 { var connectionFactory = new ConnectionFactor ...

  7. RabbitMQ双向发送(接收端有返回RPC模式)

    remote procedure call 服务端 import pika import time connection = pika.BlockingConnection(pika.Connecti ...

  8. RabbitMQ工作模式

    ------------恢复内容开始------------ RabbitMQ基本概念: Producer:生产者(消息的提供者) Consumer:消费者(消息的使用者) Message:消息(程序 ...

  9. asp.net signalR 专题—— 第四篇 模拟RPC模式的Hub操作

    在之前的文章中,我们使用的都是持久连接,但是使用持久连接的话,这种模拟socket的形式使用起来还是很不方便的,比如只有一个唯一的 OnReceived方法来处理业务逻辑,如下图: protected ...

随机推荐

  1. 快乐的Linux命令行

    ls - 列出目录内容 -a 列出所有文件 -d 指定目录信息 -F 为目录增加/标识 -h 增强可读性 -l 列模式显示 -r 反序显示 -S 按照大小排序 -t 按照修改时间排序 file - 确 ...

  2. POJ 2728 Desert King(最优比例生成树 二分 | Dinkelbach迭代法)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25310   Accepted: 7022 Desc ...

  3. MySql数据类型和Java数据类型对应一览

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N ...

  4. python2.7运行出现的Warning: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

    运行出现如下错误 uncode编码警告:在unicode等价比较中,把两个参数同时转换为unicode编码失败.中断并认为他们不相等. windows下的字符串str默认编码是ascii,而pytho ...

  5. [AGC002D] Stamp Rally (并查集+整体二分)

    Description 给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的变的最大编号最小. Input ...

  6. CodeForces 605 E. Intergalaxy Trips

    E. Intergalaxy Trips time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...

  7. FCKeditor2.6.4控件及其使用范例

    原文发布时间为:2009-06-14 -- 来源于本人的百度文章 [由搬家工具导入] 已经精简了,很小,不多说了,我的源代码去下载看。 web.config 看看。。。还有bin里面的dll就是控件, ...

  8. hdu 2732 Leapin' Lizards 最大流 拆点 建图

    题目链接 题意 给定一张网格,格子中有些地方有柱子,有些柱子上面有蜥蜴. 每个柱子只能承受有限只蜥蜴从上面经过.每只蜥蜴每次能走到相距曼哈顿距离\(\leq k\)的格子中去. 问有多少只蜥蜴能走出网 ...

  9. Linux firmware 加载【转】

    转自:http://blog.chinaunix.net/uid-22028680-id-3157922.html 1.request_firmware在内核使用,需要文件系统支持,就是说,启动的时候 ...

  10. Push pull, open drain circuit, pull up, pull down resistor

    Push pull 就以下面這個 電路來說, 因為沒有 pull up resistor, 所以 output voltage 由 low 往 high 的速度會較快. 有兩個電晶體,一個on,一個 ...