当前位置: 首页 > wzjs >正文

中小型企业 公司网站建设万网的怎么做网站地图

中小型企业 公司网站建设,万网的怎么做网站地图,外贸企业招聘,驾校一点通网站怎么做1.初识MQ 1.同步调用 概念: 同步调用是一种程序执行方式,在调用一个函数或服务时,调用方会一直等待被调用方执行完成并返回结果,才会继续执行后续代码 ,期间调用线程处于阻塞状态。 同步调用的优势: 时…

1.初识MQ

1.同步调用

概念:
同步调用是一种程序执行方式,在调用一个函数或服务时,调用方会一直等待被调用方执行完成并返回结果,才会继续执行后续代码 ,期间调用线程处于阻塞状态。

同步调用的优势:

  • 时效性强,等待到结果后才返回。

同步调用的问题:

  • 拓展性差
  • 性能下降
  • 级联失败问题

2.异步调用

概念:
异步调用是一种程序执行机制,调用方发出请求后,无需等待被调用方处理完成并返回结果,就能继续执行后续代码 。它基于消息通知的方式,涉及消息发送者、消息接收者和消息代理三个角色。

异步调用通常是基于消息通知的方式,包含三个角色:

  • 消息发送者:投递消息的人,就是原来的调用者
  • 消息接收者:接收和处理消息的人,就是原来的服务提供者
  • 消息代理:管理、暂存、转发消息,你可以把它理解成微信服务器
    在这里插入图片描述
    异步调用的优势:
  • 耦合度低,拓展性强
  • 异步调用,无需等待,性能好
  • 故障隔离,下游服务故障不影响上游业务
  • 缓存消息,流量削峰填谷

异步调用的问题:

  • 不能立即得到调用结果,时效性差
  • 不确定下游业务执行是否成功
  • 业务安全依赖于Broker的可靠性

3.MQ技术选型

MQ(MessageQueue),中文是消息队列,字面来看就是存放消息的队列。也就是异步调用中的Broker。

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫秒以内
消息可靠性一般一般

Broker:核心组件,在生产者和消费者间起中介作用,负责接收、存储和转发消息

2.RabbitMQ

安装部署

docker run \-e RABBITMQ_DEFAULT_USER=wang \-e RABBITMQ_DEFAULT_PASS=123 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network hm-net\-d \rabbitmq:3.8-management

在这里插入图片描述

消息发送的注意事项有哪些?

  • 交换机只能路由消息,无法存储消息
  • 交换机只会路由消息给与其绑定的队列,因此队列必须与交换机绑定

3.Java客户端

1.快速入门

① 引入spring-boot-starter-amqp依赖

<!--AMQP依赖,包含RabbitMQ-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

② 配置rabbitmq服务端信息

spring:rabbitmq:host: 192.168.88.130 # 你的虚拟机IPport: 5672 # 端口virtual-host: /hmall # 虚拟主机username: hmall # 用户名password: 123 # 密码

③ 利用RabbitTemplate发送消息

@SpringBootTest
class SpringAmqpTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testSimpleQueue() {//1.队列名String queueName = "simple.queue";//2.消息String message = "hello,spring amqp!";//3.发送消息rabbitTemplate.convertAndSend(queueName, message);}}

④ 利用@RabbitListener注解声明要监听的队列,监听消息

@Slf4j
@Component
public class SpringRabbitListener {@RabbitListener(queues = "simple.queue")public void listenSimpleQueue(String message) {log.info("Simple queue: {}", message);}
}

2.WorkQueue

实现一个队列绑定多个消费者

Work模型的使用:

  • 多个消费者绑定到一个队列,可以加快消息处理速度
  • 同一条消息只会被一个消费者处理
  • 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳
@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String message) {System.out.println("消费者1接收到消息:" + message + "," + LocalDateTime.now());
}@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String message) {System.err.println("消费者2接收到消息:" + message + "," + LocalDateTime.now());
}
@Test
public void testWorkQueue() {//1.队列名String queueName = "work.queue";for(int i=1;i<=50;i++){//2.消息String message = "hello,spring amqp!"+i;//3.发送消息rabbitTemplate.convertAndSend(queueName, message);}
}
listener:simple:prefetch: 1

3.Fanout交换机

交换机的作用:

  • 接收publisher发送的消息
  • 将消息按照规则路由到与之绑定的队列
  • FanoutExchange的会将消息路由到每个绑定的队列

发送消息到交换机的API:

@Test
public void testFanoutExchange() {// 交换机名称String exchangeName = "itcast.fanout";// 消息String message = "hello, everyone!";// 发送消息,参数分别是:交换机名称、RoutingKey(暂时为空)、消息rabbitTemplate.convertAndSend(exchangeName, "", message);
}

Fanout Exchange 会将接收到的消息路由到每一个跟其绑定的queue,所以也叫广播模式
在这里插入图片描述

@RabbitListener(queues = "fanout.queue1")
public void listenFanoutQueue1(String message) {log.info("消费者1监听到 fanout.queue1的消息: {}", message);
}
@RabbitListener(queues = "fanout.queue2")
public void listenFanoutQueue2(String message) {log.info("消费者2监听到 fanout.queue2的消息: {}", message);
}
@Test
public void testFanoutQueue() {//1.交换机名String exchangeName = "hmall.fanout";//2.消息String message = "hello,everyone!";//3.发送消息rabbitTemplate.convertAndSend(exchangeName,"", message);
}

4.Direct交换机

在这里插入图片描述
Direct交换机与Fanout交换机的差异:

  • Fanout交换机将消息路由给每一个与之绑定的队列
  • Direct交换机根据RoutingKey判断路由给哪个队列
  • 如果多个队列具有相同RoutingKey,则与Fanout功能类似
@RabbitListener(queues = "direct.queue1")
public void listenDirectQueue1(String message) {log.info("消费者1监听到 direct.queue1的消息: {}", message);
}
@RabbitListener(queues = "direct.queue2")
public void listenDirectQueue2(String message) {log.info("消费者2监听到 direct.queue2的消息: {}", message);
}
@Test
public void testDirectQueue() {//1.交换机名String exchangeName = "hmall.direct";//2.消息String message = "hello,blue!";//3.发送消息rabbitTemplate.convertAndSend(exchangeName, "blue", message);
}

5.Topic交换机

在这里插入图片描述
Topic交换机相比Direct交换机的差异:

  • Topic的RoutingKey和bindingKey可以是多个单词,以 . 分割
  • Topic交换机与队列绑定时的bindingKey可以指定通配符
  • #: 代表0个或多个词
  • *: 代表1个词
@RabbitListener(queues = "topic.queue1")
public void listenTopicQueue1(String message) {log.info("消费者1监听到 topic.queue1的消息: {}", message);
}
@RabbitListener(queues = "topic.queue2")
public void listenTopicQueue2(String message) {log.info("消费者2监听到 topic.queue2的消息: {}", message);
}
@Test
public void testTopicQueue() {//1.交换机名String exchangeName = "hmall.topic";//2.消息String message = "hello,blue!";//3.发送消息rabbitTemplate.convertAndSend(exchangeName, "china.news", message);
}

6.声明队列交换机

@Configuration
public class FanoutConfiguration {@Beanpublic FanoutExchange fanoutExchange() {
//        return new FanoutExchange("hmall.fanout");return ExchangeBuilder.fanoutExchange("hamll.fanout").build();}@Beanpublic Queue fanoutQueue1() {
//        return new Queue("fanout.queue1");return QueueBuilder.durable("fanout.queue1").build();}@Beanpublic Binding fanoutQueueBinding1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}@Beanpublic Queue fanoutQueue2() {
//        return new Queue("fanout.queue1");return QueueBuilder.durable("fanout.queue2").build();}@Beanpublic Binding fanoutQueueBinding2(Queue fanoutQueue2, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}
}
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1", durable = "true"),exchange = @Exchange(name = "hmall.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}
))
public void listenDirectQueue1(String message) {log.info("消费者1监听到 direct.queue1的消息: {}", message);
}

7.消息转换器

建议采用JSON序列化代替默认的JDK序列化,要做两件事情:

在publisher和consumer中都要引入jackson依赖:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

在publisher和consumer中都要配置MessageConverter:

@Bean
public MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();
}
@Test
public void testSendObject() {//1.准备消息Map<String, Object> msg=new HashMap<>(2);msg.put("name","Jack");msg.put("age",18);//3.发送消息rabbitTemplate.convertAndSend("object.queue",msg);
}

文章转载自:

http://wgfd8KFS.bpncd.cn
http://GfRZgBYE.bpncd.cn
http://hJpDhd4Q.bpncd.cn
http://PYPS1FHv.bpncd.cn
http://x7DT3mHn.bpncd.cn
http://Q77I5fkc.bpncd.cn
http://GZHCVn7m.bpncd.cn
http://X6fX4neR.bpncd.cn
http://GXgwWBNm.bpncd.cn
http://URrCnhJd.bpncd.cn
http://7PtR6wSW.bpncd.cn
http://xtoZUmyj.bpncd.cn
http://ZmVjBhli.bpncd.cn
http://VC6mTg4U.bpncd.cn
http://mVJJz4lQ.bpncd.cn
http://WIKShnr3.bpncd.cn
http://TFIyah3b.bpncd.cn
http://uagwksq8.bpncd.cn
http://dLpO4kNz.bpncd.cn
http://AuHDL0nl.bpncd.cn
http://2Eu4OxdJ.bpncd.cn
http://dnxBmuNn.bpncd.cn
http://EJ9Eu1jN.bpncd.cn
http://VCqcSnFI.bpncd.cn
http://7ZwqzuYl.bpncd.cn
http://TQYXWR0a.bpncd.cn
http://Oph28Duk.bpncd.cn
http://wj0rVVxq.bpncd.cn
http://ULZOLbxQ.bpncd.cn
http://mF15iiM2.bpncd.cn
http://www.dtcms.com/wzjs/763685.html

相关文章:

  • 做搜狗网站优化点软件开发发布平台
  • 公司免费网站it运维外包费用标准
  • 手机p2p网站开发seo案例分析
  • 怎么制作网站软件失信人被执行人查询
  • 每天网站外链做几条最好wamp在网站建设中的功能及协作关系
  • 如何用本地视频做网站卡一卡二卡四老狼
  • 好孩子官方网站王建设重庆南川网站制作公司电话
  • 1+官网商城模板网站建设乐云seo效果好
  • 沃然建站平台官网物流网站素材
  • 学生心理健康网站建设论文凡科做的网站百度不到
  • 如何设置网站标题免费申请电子邮箱
  • 设计参考图哪个网站好版面设计图
  • 成都网站推广哪家专业如何在阿里巴巴上建设公司网站
  • 怎么看网站是什么语言做的后台html5经典网站
  • 北京建设企业协会网站国外电商平台排名
  • 邢台网站建设公司排名wordpress不显示引用图片
  • 国内优秀企业网站设计做外贸登录国外网站
  • 东莞网站建设营销平台的公司seo是什么职位
  • 小男生和大人做的网站巢湖seo推广
  • 企业网站 源码百度指数如何分析
  • 开源网站下载福步论坛
  • 做鞋设备网站wordpress 淘宝客单页
  • 提供零基础网站建设教学学院网站群建设的目标
  • 视频生成链接在线工具共享门店新增跑腿距离计算优化
  • 公司建网站多少钱一个河南省住房和城乡建设部网站
  • 设计logo网站是平面设计不网站默认中文字体
  • 南昌建设工程质量监督网站浙江省住房建设厅网站
  • 成都网站app开发广州品牌设计公司
  • 怎么样推广网站专做视频和ppt的网站
  • 案例模板我的网站珠海住建网站