更多详情参考官方文档:https://www.rabbitmq.com/tutorials/tutorial-six-python.html

参考博客:https://blog.csdn.net/weixin_41896508/article/details/80997828

微服务通信RPC

01-HelloWorld(简单的消息队列)

  send.py  

import pika
#与RabbitMQ服务器建立连接
credential = pika.PlainCredentials('yang','abc123456')#erase_on_connect是否清楚凭证
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost',credentials=credential))
#创建频道
channel = connection.channel()#channel_number参数指定频道编号,建议默认pika自行管理
#创建频道传递消息的队列
channel.queue_declare(queue='hello') #向频道队列中发送消息
channel.basic_publish(exchange='',
routing_key='hello',
body='hello world!') print('[x]消息发送成功!')
connection.close()#断开连接

send.py

  receive.py

import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1',port=5672,credentials=credentials))
channel = connection.channel()
channel.queue_declare(queue='hello') def callback(ch, method, properties, body):
print(f'{body.decode()}') channel.basic_consume(queue='hello',
auto_ack=True,#开启自动确认关闭手动确认
on_message_callback=callback) print(' [*] Waiting for messages. ')
channel.start_consuming()

recieve.py

02-WorkQueues(任务队列)

  new_task.py  

'''
任务生产者将任务发送到指定队列中,多个工作者进行均分协同处理(启多个工作者)
'''
import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1',5672,credentials=credentials))
channel = connection.channel() channel.queue_declare(queue='work_queue',durable=True)#durable=True指定消息持久化,出现异常不会丢失。注意basic_publish需要设置参数 for i in range(1000):
message = f'new_task{i}...'
channel.basic_publish(
exchange='',
routing_key='work_queue',
body=message,
properties = pika.BasicProperties(delivery_mode=2, )# 支持数据持久化:2代表消息是持久
)
print(f'Send>>>{message}') connection.close()

new_task.py

  worker.py

import time
import random
import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1',5672,credentials=credentials))
channel = connection.channel() channel.queue_declare(queue='work_queue',durable=True)#durable=True指定消息持久化,出现异常不会丢失 def callback(ch, method, properties, body):
print(f'Rceive>>{body}')
time.sleep(random.random())
print(f'Done--{body.decode()}')
# 手动确认机制(在消费者挂掉没有给确认时,消息不会丢失)
ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_qos(prefetch_count=1)#此设置确保在没有进行确认之前当前接受得任务只有1个(不设置默认是平均分配)
channel.basic_consume(
queue='work_queue',
on_message_callback=callback
) channel.start_consuming()

worker.py

03-PublishSubcribe(订阅发布)

  publish.py 

'''
发布者发布一条任务,通过交换机发送到与此交换机简历连接的所有队列中进行共享(启多个订阅者)
'''
import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672, credentials=credentials)) channel = connection.channel() #创建频道的交换器(交换器负责将任务发送到连接词交换器的所有的队列中)
channel.exchange_declare(exchange='logs',
exchange_type='fanout',#创建一个fanout(广播)类型的交换机exchange,名字为logs
durable=True)#durabl持久化 for i in range(1000):
message = f'new_task{i}...'
channel.basic_publish(
exchange='logs',#指定交换机
routing_key='',#无需指定路由键队列,由交换机进行发送
body=message,
properties = pika.BasicProperties(delivery_mode=2, )# delivery_mode支持数据持久化:2代表消息是持久
)
print(f'Send>>>{message}') connection.close()

publish.py

  subcribe.py

import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672, credentials=credentials)) channel = connection.channel() #与交换器建立连接
channel.exchange_declare(exchange='logs',exchange_type='fanout',durable=True)#durable持久化 #确定消息队列(不指定队列名,每个订阅者rabbirmq服务器连接都会创建一个随机队列)
result= channel.queue_declare(queue='',exclusive=True,durable=True)#exclusive=True当断开连接时,队列销毁(持久化没有用,设置了断开销毁)
queue_name= result.method.queue
#与交换机新建的的随机队列进行绑定
channel.queue_bind(exchange='logs',queue=queue_name) def callback(ch, method, properties, body):
print(f'Rceive>>{body}')
print(f'Done--{body.decode()}')
# 手动确认机制(在消费者挂掉没有给确认时,消息不会丢失)
ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_consume(
queue=queue_name,
on_message_callback=callback
) channel.start_consuming()

subcribe.py

06-RPC(远程过程调用)

  rpc_client.py

import pika
import uuid class RpcClient(object):
def __init__(self):
credentials = pika.PlainCredentials('yang', 'abc123456')
self.connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1', 5672, credentials=credentials)) self.channel = self.connection.channel() # 随机创建一个唯一队列
result = self.channel.queue_declare(queue='', exclusive=True)
self.callback_queue = result.method.queue # 接收回调队列中的消息
self.channel.basic_consume(
queue=self.callback_queue,
on_message_callback=self.on_response,
auto_ack=True) def on_response(self, ch, method, props, body):
if self.corr_id == props.correlation_id:
self.response = body def call(self, m, n):
self.response = None
self.corr_id = str(uuid.uuid4())
# 想通信队列放入消息
self.channel.basic_publish(
exchange='',
routing_key='rpc_queue',
properties=pika.BasicProperties(
delivery_mode=2,#持久化参数
# content_type='application/json',#指定body数据类型,不指定则为字符串(有待测试)
reply_to=self.callback_queue, # 指定回调队列
correlation_id=self.corr_id, # 指定本次请求标识id
),
body=str(m) + ',' + str(n)
) while self.response is None:
self.connection.process_data_events()
return int(self.response) clinet_rpc = RpcClient() print(" [x] Requesting add(30,30)")
response = clinet_rpc.call(30,20)
print(" [.] Got %r" % response)

rpc_client.py

  rpc_server.py

import pika

credentials = pika.PlainCredentials('yang', 'abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1', 5672, credentials=credentials))
channel = connection.channel() channel.queue_declare(queue='rpc_queue', durable=True) # durable=True消息持久化 def add(m, n):
return m + n def on_request(ch, method, props, body):
m, n = body.decode().split(',')
response = add(int(m), int(n)) #将响应信息放入指定的回调队列中
channel.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(
queue='rpc_queue',
on_message_callback=on_request,
) print('Awaiting RPC requests...')
channel.start_consuming()

rpc_server.py  

RabbitMQ应用示例的更多相关文章

  1. NET下RabbitMQ实践[示例篇]

    在上一篇文章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置用户,权限,虚拟机等内容.         今天将会介绍如果使用rabbitmq进行简单的消息入队, ...

  2. RabbitMQ基本示例,轮询机制,no_ack作用

    一.RabbitMQ简介: ''' RabbitMQ就是消息队列 之前不是学了Queue了吗,都是队列还学RabbitMQ干嘛? 干的事情是一样的 Python的Queue有两个, 一个线程Queue ...

  3. AMQP消息队列之RabbitMQ简单示例

    前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个 ...

  4. laravel框架的rabbitmq使用示例[多队列封装]

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的.所有主要 ...

  5. rabbitmq 简单示例(Hello World)

    一:消息中间件: AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计 RabbitMQ是实现AMQP( ...

  6. Spring Boot + RabbitMQ 使用示例

    基础知识 虚拟主机 (Virtual Host): 每个 virtual host 拥有自己的 exchanges, queues 等 (类似 MySQL 中的库) 交换器 (Exchange): 生 ...

  7. RabbitMQ基础组件和SpringBoot整合RabbitMQ简单示例

    交换器(Exchange) 交换器就像路由器,我们先是把消息发到交换器,然后交换器再根据绑定键(binding key)和生产者发送消息时的路由键routingKey, 按照交换类型Exchange ...

  8. springboot + rabbitmq 整合示例

    几个概念说明:Broker:简单来说就是消息队列服务器实体.Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列.Queue:消息队列载体,每个消息都会被投入到一个或多个队列.Bindi ...

  9. 【rabbitmq】rabbitmq概念解析--消息确认--示例程序

    概述 本示例程序全部来自rabbitmq官方示例程序,rabbitmq-demo: 官方共有6个demo,针对不同的语言(如 C#,Java,Spring-AMQP等),都有不同的示例程序: 本示例程 ...

随机推荐

  1. 2019-2020-1 20199325《Linux内核原理与分析》第五周作业

    第五周作业主要是选择一个系统调用(13号系统调用time除外),使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,在实验楼Linux虚拟机环境下完成实验. 系统调用的列表参见 http ...

  2. [Qt] 文本文件读写, 摘自官方文档

    Reading Files Directly The following example reads a text file line by line: QFile file("in.txt ...

  3. Python3 注释和运算符

    Python3 注释 确保对模块, 函数, 方法和行内注释使用正确的风格 Python中的注释有单行注释和多行注释: Python中单行注释以 # 开头,例如:: # 这是一个注释 print(&qu ...

  4. Unity 极简UI框架

    写ui的时候一般追求控制逻辑和显示逻辑分离,经典的类似于MVC,其余大多都是这个模式的衍生,实际上书写的时候M是在整个游戏的底层,我更倾向于将它称之为D(Data)而不是M(Model),而C(Ctr ...

  5. Week-1 linux命令行重点整理

    ①仅对当前用户: ~/.bashrc ②对所有用户有效: /etc/bashrc screen命令:创建新screen会话screen –S [SESSION]加入screen会话screen –x ...

  6. python 遍历, 获取目录下所有文件名和文件夹的方法-----os.walk(), os.listdir

    http://www.runoob.com/python/os-walk.html https://www.cnblogs.com/dreamer-fish/p/3820625.html 转载于:ht ...

  7. 修复.NET的HttpClient

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ 早在2016年我们就报道过 ,.NET的HttpClient存在一些问题.随着.NET Co ...

  8. XML--XML从入门到精通 Part 1 认识XML

    XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义.您需要 ...

  9. STL 训练 POJ - 1862 Stripies

    Description Our chemical biologists have invented a new very useful form of life called stripies (in ...

  10. 轻量化模型:MobileNet v2

    MobileNet v2 论文链接:https://arxiv.org/abs/1801.04381 MobileNet v2是对MobileNet v1的改进,也是一个轻量化模型. 关于Mobile ...