微服务架构和实践微服务开发实战Docker · Spring Boot · Kotlin · 微服务

「 从0到1学习微服务SpringCloud 」07 Rabbi

2019-04-18  本文已影响0人  KenDoEverything
系列文章(更新ing):

「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现
「 从0到1学习微服务SpringCloud 」03 Eureka的自我保护机制
「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate
「 从0到1学习微服务SpringCloud 」05消费者Fegin
「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config

在上篇文章中,我们已经用到了MQ,用于实现配置自动刷新。接下来,就具体说说MQ的应用场景以及RabbtMq的基本使用。

MQ应用场景

基本使用

继续使用eureka-client项目
1.添加maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.添加配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

3.Mq接收-发送

有3种接收方式,我这里为了方便,在同一个应用中写的发送和接收,大家可以想象一下它们是在不同应用中,如下

3.1 不自动创建Queue,需要在Mq手动建立对应名字的队列,否则会报"找不到队列"的错误

//接收消息
@Log4j2
@Component
public class MqReceiver {
    //不会自动创建队列
    @RabbitListener(queues = "myQueue1")
    public void receiver1 (String message){
        log.info("MqReceiver1: {}", message);
    }
}
//发送消息
@RunWith(SpringRunner.class)
@SpringBootTest
public class MqSenderTest{
    @Autowired
    private AmqpTemplate amqpTemplate;

    @Test
    public void send1(){
        amqpTemplate.convertAndSend("myQueue1","Hello!Mq Message!");
    }
}

3.2 若Mq中无相应名称的队列,会自动创建Queue

//接收消息
@RabbitListener(queuesToDeclare = @Queue("myQueue2"))
    public void receiver2 (String message){
        log.info("MqReceiver2: {}", message);
    }
//发送消息
@Test
    public void send2(){
        amqpTemplate.convertAndSend("myQueue2","Hello!Mq Message!");
    }

3.3 消息队列分组,将不同的队列归为一组,以不同关键字区分(会自动创建队列)

这里以订单服务为例,假设现有两种订单,一种是数码订单,另一种是水果订单,数码供应商和水果供应商两个服务同时订阅订单服务,但数码供应商只关心数码订单,水果供应商只关心水果订单,这里就需要对订单消息进行分类了

image
//接收消息
   /**
     * 数码供应商服务 接收消息
     * @param message
     */
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange("myOrder"),//相当于分组名
            key = "computer",//相当于分类名
            value = @Queue("computerQueue")
    ))
    public void computerReceiver (String message){
        log.info("computerReceiver: {}", message);
    }


    /**
     * 水果供应商服务 接收消息
     * @param message
     */
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange("myOrder"),//相当于分组名
            key = "fruit",//相当于分类名
            value = @Queue("fruitQueue")
    ))
    public void fruitReceiver (String message){
        log.info("fruitReceiver: {}", message);
    }

//发送消息
  @Test
    public void sen4(){
        amqpTemplate.convertAndSend("myOrder","computer","computer Order!");
    }

    @Test
    public void sen5(){
        amqpTemplate.convertAndSend("myOrder","fruit","fruit Order!");
    }

4.启动eureka-client,eureka-server,config应用,运行刚才写的单元测试

image

发送接收消息成功啦!

如果觉得不错,分享给你的朋友!

image image

THANDKS

一个立志成大腿而每天努力奋斗的年轻人

伴学习伴成长,成长之路你并不孤单!

扫描二维码,关注公众号
上一篇下一篇

猜你喜欢

热点阅读