python使用pika操作rabbitmq

  • 2020 年 3 月 27 日
  • 筆記

一、概述

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