电子商务网站建设实训报告主要内容,wordpress 相关插件,个人如何注册公司代理,大华天途建设集团网站1.消息队列
消息#xff1a; 在应用间传送的数据队列#xff0c;先进先出
1.2. 作用
好处#xff1a;解耦#xff0c; 容错#xff0c;削峰坏处#xff1a;降低系统可用性#xff0c;系统复杂度提高#xff0c;一致性问题#xff1b;
RabbitMQ组成部分#xff1a…1.消息队列
消息 在应用间传送的数据队列先进先出
1.2. 作用
好处解耦 容错削峰坏处降低系统可用性系统复杂度提高一致性问题
RabbitMQ组成部分生产者消费者队列交换机
2. 安装部署rabbitmq
---
apiVersion: v1
kind: Secret
metadata:name: rabbitmq-secretnamespace: rabbitmq
data:username: YWRtaW4Kpassword: MTIzNDU2Cg
type: Opaque
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: rabbitmqnamespace: rabbitmqlabels:app: rabbitmq
spec:replicas: 1selector:matchLabels:app: rabbitmqserviceName: rabbitmq-headlesstemplate:metadata:labels:app: rabbitmqspec:containers:- name: rabbitmqimage: registry.cn-hangzhou.aliyuncs.com/yuanli123/rabbitmq:3.9.22-managementports:- name: tcp-5672containerPort: 5672protocol: TCP- name: tcp-15672containerPort: 15672protocol: TCP
# 不知道为什么自己使用的username会多出一个回车字符导致rabbitmq无法识别到
# env:
# - name: RABBITMQ_DEFAULT_USER
# valueFrom:
# secretKeyRef:
# name: rabbitmq-secret
# key: username
# - name: RABBITMQ_DEFAULT_PASS
# valueFrom:
# secretKeyRef:
# name: rabbitmq-secret
# key: passwordresources:limits:cpu: 1memory: 2Girequests:cpu: 200mmemory: 500MiimagePullSecrets:- name: regcred---
apiVersion: v1
kind: Service
metadata:name: rabbitmq-headlessnamespace: rabbitmqlabels:app: rabbitmq
spec:ports:- name: tcp-rabbitmq-5672port: 5672targetPort: 5672nodePort: 32672selector:app: rabbitmqtype: NodePort
---
apiVersion: v1
kind: Service
metadata:name: rabbitmq-externalnamespace: rabbitmqlabels:app: rabbitmq-external
spec:ports:- name: http-rabbitmq-externalprotocol: TCPport: 15672targetPort: 15672selector:app: rabbitmqtype: ClusterIP---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: rabbitmq-ingressnamespace: rabbitmqannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:ingressClassName: nginxrules:- host: rabbitmq.liyuan.comhttp:paths:- backend:service:name: rabbitmq-externalport:number: 15672pathType: Prefixpath: /根据上述yaml再结合修改 /etc/hosts 文件 通过 http://rabbitmq.liyuan.com:30001/#/exchanges 访问 并暴露了 192,168.31.175:32672 用于发消息
2.1.名词解释
Broker: 接收和分发消息的应用Virtual Host: 虚拟主机一个Broker可以有多个Virtual Host 每个Virtual Host都有自己一套的Exchange和QueueConnection: 生产者/消费者和Broker之间的TCP链接Channel: 发送消息的通道channel是在connection内部建立逻辑链接AMQP method包含了channel id帮助客户端和message Broker识别Broker减少建立TCP Connection的开销Exchangemessage到达broker的第一站根据分发规则查询表中的routing key分发消息到queue中去常用类型有direct, topic, fanout(multicast)Queue: 存放消息的队列BindingExchange和Queue之间的虚拟链接binding中可以包含routing keyBinding信息被保存到exchange中的查询表中用于message的分发依据
3.使用测试
rabbitmq-test 源码参考
3.1.pom.xml
# pom.yaml
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdrqbbitmq-test/artifactIdversion1.0-SNAPSHOT/versionpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependenciesdependencygroupIdcom.rabbitmq/groupIdartifactIdamqp-client/artifactIdversion5.16.0/version/dependency/dependencies
/project3.2.生产者Producer
// Producer.java
package com.liyuan.rabbitmq;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Producer {public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory connectionFactory new ConnectionFactory();connectionFactory.setHost(192.168.31.175);connectionFactory.setUsername(guest);connectionFactory.setPassword(guest);connectionFactory.setPort(32672);try (Connection connection connectionFactory.newConnection()) {Channel channel connection.createChannel();String exchangeName xc_exchange_name;AMQP.Exchange.DeclareOk exchangeDeclare channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT, true, false, null);String queueName xc_queue_name;AMQP.Queue.DeclareOk queueDeclare channel.queueDeclare(queueName, false, false, false, null);channel.queueBind(queueName, exchangeName, queueName);String message Hello, my name is liyuan.;channel.basicPublish(exchangeName, queueName, null, message.getBytes());channel.close();}}
}3.3.消费者Consumer
package com.liyuan.rabbitmq;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer {public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory connectionFactory new ConnectionFactory();connectionFactory.setHost(192.168.31.175);connectionFactory.setUsername(guest);connectionFactory.setPassword(guest);connectionFactory.setPort(32672);try (Connection connection connectionFactory.newConnection()) {Channel channel connection.createChannel();String exchangeName xc_exchange_name;String queueName xc_queue_name;DeliverCallback deliverCallback new DeliverCallback() {Overridepublic void handle(String consumerTag, Delivery message) throws IOException {System.out.println(Delivered consuming: consumerTag new String(message.getBody()));}};CancelCallback cancelCallback new CancelCallback() {Overridepublic void handle(String consumerTag) throws IOException {System.out.println(Canceled: consumerTag);}};channel.basicConsume(queueName, true, deliverCallback, cancelCallback);channel.close();}}
}4.rabbitmq交换机类型
4.1. BuiltinExchangeType.DIRECT
路由键与队列完全匹配交换机通过routingKey路由键将交换机和队列进行绑定消息被发送到exchange时根据消息的routingKey来进行匹配只将消息发送到完全匹配此routingKey的队列 且同一个key可以绑定多个queue因此会同时将消息发给多个queue
queueNameroutingKeyqueue01“direct_key01”queue02“direct_key02”
根据上述表格的规则来发送消息当发送消息时的routingKey为以下值时以下队列会收到消息
routingKeyqueueName“direct_key01”queue01 will receive“direct_key02”queue02 will receive
4.2. BuiltinExchangeType.FANOUT
将消息分发给所有绑定了此交换机的队列
queueNameroutingKeyqueue01“fanout_key01”queue02“fanout_key01”queue03“fanout_key01”
根据上述表格的规则来发送消息当发送消息时的routingKey为以下值时以下队列会收到消息
routingKeyqueueName“fanout_key01”queue01, queue02, queue03 will receive
4.3. BuiltinExchangeType.TOPIC
类似于direct方式但是topic可以模糊匹配routingKey通过此种方式我们可以使得一个队列模糊绑定多个routingKey
queueNameroutingKeyqueue01key1.key2.key3.*queue02key1.#queue03*.key2.*.key4queue04#.key3.key4
#代表0个或多个部分* 代表一个部分. : 用于分隔不同的routingKey
根据上述表格的规则来发送消息当发送消息时的routingKey为以下值时以下队列会收到消息
routingKeyqueueName“key1”queue02 will receive“key3”no queue will receive“key1.key2.key3”queue02 will receive“key1.key2.key3.key4”queue01, queue02, queue03, queue04 will receive
4.3.BuiltinExchangeType.HEADERS
headers 匹配AMQP消息的header而不是路由键此外headers交换器和direct交换器完全一致但性能差了很多 消费方要求指定的headers中必须包含一个x-match的键
x-match all表示所有的键值对都匹配才能接收到消息x-match any表示只要有键值对匹配就能接收到消息
生产者按照 x-match 配置的规则发送消息到指定的queue上
queueNamex-matchqueue01{name:“liyuan01”, sex:“male”, x-match: all}queue02{name:“liyuan02”, sex:“male”, x-match: any}
通过上述规则按照指定的消息头发送消息时
x-matchqueueName{name: “liyuan01”}no queue will receive{name: “liyuan02”}queue02 will receive{name: “liyuan01”, sex:“male”}queue02, queue01 will receive