1同步调用
按照123的顺序依次执行
如果每个业务都用50ms,呢么整个支付服务完成,则需要的时间是几个小demo的时间加和
所以同步调用会出现 扩展性差 性能下降 级联失败(一个小demo失效了,整个业务都失效了)的问题,但是某些业务只能使用同步调用
2异步调用
这里的消息代理类比于外卖柜,消息发送者类比于外卖员,消息接受者类比于点外卖的人
更改为异步调用就如下
3RabbitMQ介绍
使用docker安装
docker run
-e RABBITMQ DEFAULT USER=itheima\ 这里设置用户名和密码
-e RABBITMO DEFAULT PASS=123321\
-v mq-plugins:/plugins
--name mq\
--hostname mq\
-p15672:15672\
-p5672:56721
--network hmall\
-d\
rabbitmq:3.8-management
安装完成后 访问192.168.150.101:15672
基本模型
4入门
创建队列
交换机负责路由转发
此时再看queue里边 已经和交换机绑定
1数据隔离
通过virtual host
创建一个用户
不同的virtual host对数据隔离
2 spring amqp
5 hello word 案例
没有交换机
** 1引入spring-amgp依赖**
<!--AMQP依赖包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot/groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2配置RabbitMQ服务端信息
3发送消息
@SpringBootTest
public class SpringAmqpTest
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
void testSendMessage2Queue(){
String queueName "simple.queue";
String msg "hello,amqp!";
rabbitTemplate.convertAndSend (queueName,msg);
}
4接收消息
@Slf4j
@Component
public class MqListener
@RabbitListener (queues "simple.queue")
public void listensimpleQueue(string msg){
System.out.println("消费者收到了simple.queuel的消息:【"+msg+"】r);
}
6 Work Queues
收消息
@RabbitListener(queues "work.queue")
public void listenworkQueuel(String msg){
System.out.println("消费者1收到了work.queue的消息:【"+msg+"】");
}
@RabbitListener (queues "work,queue")
public void listenworkQueue2(String msg){
System.out.println("消费者2收到了work.queue的消息:【"+msg+"】");
}
发消息
@Test
void testworkQueue(){
String queueName "work.queue";
for (int i 1;i <50;i++){
String msg hello,worker,message_+i;
rabbitTemplate.convertAndSend(queueName,msg);
}
}
实现能者多劳
7交换机
1Fanout交换机
** 广播模式**
创建队列
可以使用默认的交换机也可以自己创建交换机
交换机与队列进行绑定
2Direct交换机
绑定key
接收
发送
@Test
void testSendDirect(){
String exchangeName ="hmall direct";
string msg="红色警报";
rabbitTemplate.convertAndSend(exchangeName,routingKey:"red",msg);
}
3Topic交换机
4Topic交换机
topic能干的事direct也能干,但是topic更加方便
5申明队列和交换机
代码实现 不使用可视化
基于代码
基于注解(这个更好用 更便利 更能适合于场景)
6消息转换器
Spring的对消息对象的处理是由org.springframework.amqp.support.converter.MessageConverter来处理的。而
默认实现是SimpleMessageConverter,基于JDK的ObjectOutputStream完成序列化。
存在下列问题:
·JDK的序列化有安全风险
·DK序列化的消息太大
·JDK序列化的消息可读性差
解决方案:
版权归原作者 先生先生393 所有, 如有侵权,请联系我们删除。