python使用pika操作rabbitmq

一、概述

python 連接操作rabbitMQ 主要是使用pika庫

pip3 install pika==1.1.0

 

官方對於pika有如下介紹

Since threads aren’t appropriate to every situation, it doesn’t require threads. 
Pika core takes care not to forbid them, either. 
The same goes for greenlets, callbacks, continuations, and generators.
 An instance of Pika’s built-in  connection adapters isn’t thread-safe, however.

線程並不適用於每種場景, 因此並不要求使用線程。 但是pika並不禁用線程, 對於

greenlets, callbacks也一樣。 一個pika建立的連接並不是線程安全的

因此在多線程中共享一個pika連接不是線程安全的, 當然也有一種使用:

with one exception: you may call the connection method add_callback_threadsafe from
 another thread to schedule a callback within an active pika connection.

使用add_callback_threadsafe方法callback 一個pika連接從另外一個線程中

pika提供建立連接方式:

pika.adapters.asyncio_connection.AsyncioConnection - 用於python 3 AsyncIO的I/O異步模式
pika.BlockingConnection - 同步模式, 簡單易用
pika.SelectConnection - 沒有第三方依賴包的異步模式
pika.adapters.tornado_connection.TornadoConnection - 基於Tornado 的異步IO請求模式
pika.adapters.twisted_connection.TwistedProtocolConnection - 基於Twisted’的異步IO請求模式

 

二、普通版rabbitmq

環境說明

操作系統 ip 主機名 配置 rabbitmq版本
centos 6.9 192.168.31.7 mq_01 1核2g 3.8.2
centos 6.9 192.168.31.216 mq_02 1核2g 3.8.2
centos 6.9 192.168.31.214 mq_03 1核2g 3.8.2
ubuntu 16.04 192.168.31.229 mq_client 1核2g N/A

 

 

 

 

 

 

 

注意:3臺mq服務器,已經開啓ssl。開啓ssl之後,使用明文傳輸和使用ssl傳輸,都是可以的。

 

最經典的hello world

生產者

producer.py

import pika

auth = pika.PlainCredentials('admin', 'admin123')
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.31.7', '5672', '/', auth))
channel = connection.channel()

channel.queue_declare(queue='TEST01')

channel.basic_publish(exchange='',
                      routing_key='TEST01',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

 

執行腳本

# python3 produce.py 
 [x] Sent 'Hello World!'

 

消費者

consumer.py

import pika

auth = pika.PlainCredentials('admin', 'admin123')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.31.7',port=5672,virtual_host= '/', credentials=auth))
channel = connection.channel()

channel.queue_declare(queue='TEST01')

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

channel.basic_consume(on_message_callback=callback,
                      queue='TEST01',
                      auto_ack=True)

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

 

執行腳本

# python3 consumer.py 
 [*] Waiting for messages. To exit press CTRL+C
 [x] Received b'Hello World!'

使用CTRL+C 結束腳本

 

三、SSL版rabbitmq

客戶端採用的是ubuntu 16.04,因爲發現centos 7.6編譯python 3.7時,導入ssl報錯,無法解決。

ubuntu 16.04可以解決導入ssl模塊問題。

 

ubuntu 16.04安裝python3-openssl

apt-get install -y python3-openssl

 

生產者

下載github示例代碼,編輯配置文件

git clone https://github.com/Nepitwin/RabbitSSL
cd RabbitSSL-master/Python
vi configuration.py

修改紅色部分

import pika
import ssl


ssl_opts = {
    "ca_certificate": "ca_certificate.pem",
    "client_certificate": "client_certificate.pem",
    "client_key": "client_key.pem",
    "cert_reqs": ssl.CERT_REQUIRED,
    "ssl_version": ssl.PROTOCOL_TLSv1_2
}

rabbit_opts = {
    "host": "192.168.31.7",
    "port": 5671,
    "user": "admin",
    "password": "admin123",
}

rabbit_queue_opts = {
    "queue": "python_ssl",
    "message": "Hello SSL World :)"
}

context = ssl.create_default_context(cafile=ssl_opts["ca_certificate"])
# 忽略證書驗證
context = ssl._create_unverified_context()

context.load_cert_chain(ssl_opts["client_certificate"], ssl_opts["client_key"])
ssl_options = pika.SSLOptions(context, rabbit_opts["host"])
parameters = pika.ConnectionParameters(host=rabbit_opts["host"],
                                       port=rabbit_opts["port"],
                                       credentials=pika.PlainCredentials(rabbit_opts["user"], rabbit_opts["password"]),
                                       ssl_options=ssl_options)

注意:由於證書是不受信任的,因此必須要關閉證書驗證,否則會運行報錯,提示證書驗證失敗!

 

執行腳本

# python3 rabbitssl_send.py 
 [x] Sent 'Hello SSL World :)!'

 

消費者

執行腳本

# python3 rabbitssl_consume.py 
 [*] Waiting for messages. To exit press CTRL+C
 [x] Received b'Hello SSL World :)'

使用CTRL+C 結束腳本

 

備註:

這個github項目也提供了java測試代碼,但是裏面提供的p12和jks證書文件不對。

需要使用python文件的3個文件,轉換一下才行。

在線轉換連接:

https://www.chinassl.net/ssltools/convert-ssl.html

 

轉換p12,證書密碼填:rabbitstore

 

 下載之後,會得到一個 DESKTOP-T8LNPRN.pfx。

由於pfx和p12是同一類型文件,將後綴重名的爲p12即可。

 

轉換jks

 

 下載之後,會得到一個 DESKTOP-T8LNPRN.jks

 

 

本文參考鏈接:

https://blog.csdn.net/comprel/article/details/93788782

https://blog.csdn.net/yixieling4397/article/details/79861379

https://github.com/Nepitwin/RabbitSSL

 

發佈了287 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章