Rabbitmq 消息中间件

rabbitmq 安装

Linux服务器

# 安装rabbitmq全部依赖
yum -y install rabbitmq*

# 以守护程序的方式在后台运行
rabbitmq-server --detached

# 查询 RabbitMQ 服务器的状态信息可以用参数 status
rabbitmqctl status

# 关闭整个 RabbitMQ 节点可以用参数 stop
rabbitmqctl stop

# 指定关闭不同的节点,包括远程节点,只需要传入参数 -n
# -n node 默认 node 名称是 rabbit@server ,如果你的主机名是 server.example.com ,那么 node 名称就是 rabbit@server.example.com
rabbitmqctl -n rabbit@server.example.com stop

# 如果只想关闭和开启应用程序,同时保持 Erlang 节点运行则可以用 stop_app
rabbitmqctl stop_app
rabbitmqctl start_app

# 重置 RabbitMQ 节点
rabbitmqctl reset

# 查看交换器
rabbitmqctl list_exchanges

# 该命令还可以附加参数,比如列出交换器的名称、类型、是否持久化、是否自动删除
rabbitmqctl list_exchanges name type durable auto_delete

# 查看绑定
rabbitmqctl list_bindings

# 查看已声明的队列(重点)
rabbitmqctl list_queues

# 创建用户密码(重点)
rabbitmqctl add_user user password
    
# 授予用户权限 set_permissions [-p vhost]{user}{conf}{write}{red}(重点)
rabbitmqctl set_permissions -p / user ".*" ".*" ".*"

rabbitmq直接发送

produrce 生产者

import pika

# 创建用户和密码
credentials = pika.PlainCredentials('user', 'password')

# 远程连接rabbitmq服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('172.17.0.77', credentials=credentials))

# 创建管道
channel = connection.channel()

# 声明一个queue
channel.queue_declare(queue='hello', durable=True)

channel.basic_publish(exchange='',
                      routing_key='hello',  # 和queue做一个绑定保持一致
                      body='Hello Word!',  # 发送的消息
                      properties=pika.BasicProperties(
                          delivery_mode=2,
                      ))   # 设置参数持久化

# 打印发送的消息
print(" [x] Sent 'Hello Word!'")

# 关闭缓存
connection.close()

consumer 消费者

import pika

# 创建用户和密码
credentials = pika.PlainCredentials('user', 'password')

# 远程连接rabbitmq服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('172.17.0.77', credentials=credentials))

# 创建管道
channel = connection.channel()

# 声明一个queue
channel.queue_declare(queue='hello', durable=True)

# 回调函数
def callback(ch, method, properties, body):
    print(" [x] Receivde %r" % body)


channel.basic_consume(queue='hello', # 和queue做一个绑定保持一致
                      auto_ack=True, # 设置参数持久化
                      on_message_callback=callback)

# 打印
print(' [*] Waiting for messages. To exit press CTRL+C')

# 启动消费者
channel.start_consuming()    

direct 组播类型

produrce 生产者

import pika
import sys

# 创建用户和密码
credentials = pika.PlainCredentials('user', 'password')

# 远程连接rabbitmq服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('172.17.0.77', credentials=credentials))

# 创建管道
channel = connection.channel()

# 开始连接exchange
channel.exchange_declare(exchange='mydirect', exchange_type='direct')

log_level = sys.argv[1] if len(sys.argv) > 1 else "info"

message = ' '.join(sys.argv[1:]) or "helloworld!"

channel.basic_publish(exchange='mydirect',  # exchange绑定
                      routing_key=log_level,  # 传输的参数
                      body=message)  # body展示数据

# 打印信息
print("publish  %s to %s" % (message, log_level))

# 关闭缓存
connection.close()

consumer 消费者

import pika
import sys

# 创建用户和密码
credentials = pika.PlainCredentials('user', 'password')

# 远程连接rabbitmq服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('172.17.0.77', credentials=credentials))

# 创建管道
channel = connection.channel()

# 开始连接exchange
channel.exchange_declare(exchange='mydirect', exchange_type='direct')

queue_obj = channel.queue_declare('', exclusive=True) 
queue_name = queue_obj.method.queue

print('queue name', queue_name, queue_obj)

log_levels = sys.argv[1:]

if not log_levels:
    sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
    sys.exit(1)

for level in log_levels:
    channel.queue_bind(exchange='mydirect', queue=queue_name, routing_key=level)  # 绑定队列到Exchange

print(' [*] Waiting for logs. To exit press CTRL+C')


def callback(ch, method, properties, body):
    print(" [x] %r" % body)


channel.basic_consume(on_message_callback=callback, queue=queue_name)
channel.start_consuming()

fount广播类型

produrce 生产者

import pika
import sys

credentials = pika.PlainCredentials('user', 'password')
parameters = pika.ConnectionParameters(host='172.17.0.77', credentials=credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

# 开始连接exchange
channel.exchange_declare(exchange='myfanout', exchange_type='fanout')
message = sys.argv[1] if (len(sys.argv[1]) > 1) else "info"

channel.basic_publish(exchange='myfanout',
                      routing_key='',
                      body=message)

print("publish done %s" % message)
connection.close()

consumer 消费者

import pika

credentials = pika.PlainCredentials('admin', 'admin')
parameters = pika.ConnectionParameters(host='172.17.0.77', credentials=credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

channel.exchange_declare(exchange='myfanout', exchange_type='fanout')

queue_obj = channel.queue_declare('', exclusive=True)  # 不指定queue名字,rabbit会随机分配一个名字,exclusive=True会在使用此queue的消费者断开后,自动将queue删除
queue_name = queue_obj.method.queue
print('queue name', queue_name, queue_obj)

channel.queue_bind(exchange='myfanout', queue=queue_name)  # 绑定队列到Exchange
print(' [*] Waiting for logs. To exit press CTRL+C')


def callback(ch, method, properties, body):
    print(" [x] %r" % body)


channel.basic_consume(on_message_callback=callback, queue=queue_name)

channel.start_consuming()

topic 规则播类型

produrce 生产者

import pika
import sys

credentials = pika.PlainCredentials('user', 'password')
parameters = pika.ConnectionParameters(host='172.17.0.77', credentials=credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()  # 队列连接通道

channel.exchange_declare(exchange='topic_log', exchange_type='topic')

log_level = sys.argv[1] if len(sys.argv) > 1 else 'all.info'
message = ' '.join(sys.argv[1:]) or "Hello World!"

channel.basic_publish(exchange='topic_log',
                      routing_key=log_level,
                      body=message)
print(" [x] Sent %r" % message)
connection.close()

consumer 消费者

import pika, sys

credentials = pika.PlainCredentials('user', 'password')
parameters = pika.ConnectionParameters(host='172.17.0.77', credentials=credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

queue_obj = channel.queue_declare('', exclusive=True)  # 不指定queue名字,rabbit会随机分配一个名字,exclusive=True会在使用此queue的消费者断开后,自动将queue删除
queue_name = queue_obj.method.queue

log_levels = sys.argv[1:]  # info warning errr

if not log_levels:
    sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
    sys.exit(1)

for level in log_levels:
    channel.queue_bind(exchange='topic_log',
                       queue=queue_name,
                       routing_key=level)

print(' [*] Waiting for logs. To exit press CTRL+C')


def callback(ch, method, properties, body):
    print(" [x] %r" % body)


channel.basic_consume(on_message_callback=callback, queue=queue_name)
channel.start_consuming()
posted @ 2022-02-16 17:42  沈忻凯  阅读(56)  评论(0)    收藏  举报