HM-SpringCloud微服务系列4.3.4【消息转换器】

1 引言

image
image

  • Spring会把你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象。
  • 只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:
    • 数据体积过大
    • 有安全漏洞
    • 可读性差

2 案例:测试默认转换器

image

    @Bean
    public Queue objectQueue() {
        return new Queue("object.queue");
    }
    @Test
    public void testSendObjectQueue() {
        Map<String, Object> msg = new HashMap<>();
        msg.put("name", "黄晓明");
        msg.put("age", 35);
        rabbitTemplate.convertAndSend("object.queue", msg);
    }

image
image
image
image
image
image

3 消息转换器

  • 显然JDK序列化方式并不合适。我们希望消息体的体积更小、可读性更高,因此可以使用JSON方式来做序列化和反序列化。

3.1 课件

  • 发送消息
    image
  • 接收消息
    image

3.2 引入依赖

  • 在publisher和consumer两个服务中都引入依赖(直接放到父工程中即可):
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.10</version>
</dependency>

image

3.3 发送消息

3.3.1 配置消息转换器

  • 在服务publisher的启动类中添加一个Bean即可:
    @Bean
    public MessageConverter messageConverter() { //注意MessageConverter来自amqp包
        return new Jackson2JsonMessageConverter();
    }

image

3.3.2 测试

image
image
image
image
image

3.4 接收消息

3.4.1 配置消息转换器

  • 在服务consumer的启动类中添加一个Bean即可(同publisher):
    @Bean
    public MessageConverter messageConverter() { 
        return new Jackson2JsonMessageConverter();
    }

image

3.4.2 定义消费者用于监听消息

    @RabbitListener(queues = "object.queue")
    public void listenObjectQueue(Map<String, Object> msg) {
        System.out.println("接收到object.queue的消息:【" + msg + "】");
    }

image

3.4.3 测试

image

4 小结

image

posted @ 2022-01-28 15:10  yub4by  阅读(55)  评论(0编辑  收藏  举报