感謝分享原文-http://bjbsair.com/2020-04-03/tech-info/29908.html
1、RabbitMQ簡介
RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。RabbitMQ服務器是用Erlang語言編寫的,而集群和故障轉移是構建在開放電信平台框架上的。AMQP:Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放標准,為面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言燈條件的限制。AMQP具有如下的特性:
- 可靠性(Reliablity):使用了一些機制來保證可靠性,比如持久化、傳輸確認、發布確認。
- 靈活的路由(Flexible Routing):在消息進入隊列之前,通過Exchange來路由消息。對於典型的路由功能,Rabbit已經提供了一些內置的Exchange來實現。針對更復雜的路由功能,可以將多個Exchange綁定在一起,也通過插件機制實現自己的Exchange。
- 消息集群(Clustering):多個RabbitMQ服務器可以組成一個集群,形成一個邏輯Broker。
- 高可用(Highly Avaliable Queues):隊列可以在集群中的機器上進行鏡像,使得在部分節點出問題的情況下隊列仍然可用。
- 多種協議(Multi-protocol):支持多種消息隊列協議,如STOMP、MQTT等。
- 多種語言客戶端(Many Clients):幾乎支持所有常用語言,比如Java、.NET、Ruby等。
- 管理界面(Management UI):提供了易用的用戶界面,使得用戶可以監控和管理消息Broker的許多方面。
- 跟蹤機制(Tracing):如果消息異常,RabbitMQ提供了消息的跟蹤機制,使用者可以找出發生了什么。
- 插件機制(Plugin System):提供了許多插件,來從多方面進行擴展,也可以編輯自己的插件。
RabbitMQ中的消息都只能存儲在Queue中,生產者(下圖中的P)生產消息並最終投遞到Queue中,消費者(下圖中的C)可以從Queue中獲取消息並消費。

2、RabbitMQ部署
下面是RabbitMQ部署的定義代碼,此代碼由兩部分組成,即RabbitMQ部署的部署以及其代理服務。鏡像使用的是bitnami/rabbitmq:latest。通過NodePort模式對外暴露了15672和5672端口,並通過nfs文件系統對RabbitMQ的數據進行持久化。
#-------------定義RabbitMQ部署-----------------
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: rabbit
spec:
replicas: 1
selector:
matchLabels:
app: rabbit
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: rabbit
spec:
containers:
- image: bitnami/rabbitmq:latest
imagePullPolicy: IfNotPresent
name: rabbit
ports:
- containerPort: 15672
name: rabbit15672
protocol: TCP
- containerPort: 5672
name: rabbit5672
protocol: TCP
resources: {}
volumeMounts:
- mountPath: /bitnami
name: rabbit-persistent-storage
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: rabbit-persistent-storage
nfs:
path: /home/nfs-share/rabbit
server: 10.0.33.201
#-----------------定義rabbit的代理服務--------------
apiVersion: v1
kind: Service
metadata:
name: rabbit-service
spec:
ports:
- name: rabbit15672
nodePort: 31199
port: 15672
protocol: TCP
targetPort: 15672
- name: rabbit15672
nodePort: 305672
port: 5672
protocol: TCP
targetPort: 5672
selector:
app: rabbit
type: NodePort
通過kubectl,執行下面的命令在Kubernetes集群中部署Oracle數據庫。
$ kubectl create -f rabbitmq.yaml --namespace=kube-public
在部署完成后,通過下面的命令可以查看RabbitMQ暴露的端口:
$ kubectl get svc --namespace=kube-public
3、部署驗證
在瀏覽器中輸入:http://10.0.33.203:31199/,訪問部署好的RabbitMQ。在登錄頁面輸入用戶名和密碼(此處初始user/bitnami),系統將會進入RabbitMQ的主頁。

4、運行環境配置
在部署時,可以通過設置下面的環境變量來改變容器的運行時:
- RABBITMQ_USERNAME: 用戶名,默認值為user
- RABBITMQ_PASSWORD: 密碼,默認值為bitnami
- RABBITMQ_HASHED_PASSWORD: 哈希密碼
- RABBITMQ_VHOST: 安裝后啟動創建的虛擬主機,默認值為 /
- RABBITMQ_ERL_COOKIE: Erlang cookie用於確定不同的節點之間是否允許行互相通信。
- RABBITMQ_NODE_TYPE: 節點類型,有限制: stats, queue-ram or queue-disc。 默認值為stats
- RABBITMQ_NODE_NAME: 節點名稱和主機,例如: node@hostname或node 。默認值為rabbit@localhost。
- RABBITMQ_NODE_PORT_NUMBER: 節點端口,默認值為5672
- RABBITMQ_CLUSTER_NODE_NAME: 集群名稱,例如:clusternode@hostname
- RABBITMQ_CLUSTER_PARTITION_HANDLING: 集群分區恢復機制,默認值為: ignore
- RABBITMQ_MANAGER_PORT_NUMBER: 管理端口,默認值為15672
- RABBITMQ_DISK_FREE_LIMIT: Rabbitmq存儲數據的可用空間限制,當低於該值的時候,將觸發流量限制。默認值為 {mem_relative, 1.0}
- RABBITMQ_ULIMIT_NOFILES: 資源限制, 打開文件描述符的最大數目,默認值為65536
