微服务学习(5):消息转换器由JDK序列化——JSON序列化

在企业应用中,将消息转换器从JDK序列化改为JSON序列化提升了系统间通信的效率与安全性。JSON作为轻量级数据交换格式,增强了跨平台兼容性,简化了开发与维护。相比JDK序列化,JSON序列化减少了潜在的安全风险,提供了更紧凑的数据表示,有助于降低带宽占用和提高响应速度,从而优化了整体性能,特别适用于分布式系统的数据交换场景。

JDK序列化的缺点

代码呈现缺点

解决方案

结论


JDK序列化的缺点

性能问题:JDK序列化的过程相对比较慢,因为它涉及复杂的算法来处理对象图的序列化和反序列化。

安全性问题:JDK序列化没有内置的安全措施来防止反序列化过程中执行恶意代码。这意味着如果攻击者能够控制输入流,则可能通过精心构造的对象来执行任意代码,这被称为反序列化漏洞。

兼容性问题:随着类定义的变化,旧版本的对象可能无法被正确地反序列化,除非开发者明确地处理了这些变化。这是因为JDK序列化依赖于类的详细结构信息。

数据冗余:JDK序列化不仅保存对象的数据,还会保存很多关于类的元数据,导致生成的序列化内容通常比实际需要的大得多。

不可跨语言:JDK序列化是Java特有的,不能直接用于与其他编程语言编写的组件之间进行通信。

代码呈现缺点

我们在consumer服务中创建一个配置类,然后基于@Bean的方式创建一个队列。

java 复制代码
 @Bean
    public Queue messageQueue(){
        return QueueBuilder.durable("message.queue").build();
    }

RabbitMQ控制台队列:(成功创建)

接下来就在publisher模块的SpringAmqpTest中新增发送消息的测试类,

发送一个复杂对象(这里使用Map对象):

java 复制代码
    @Test
    public void testSendMap() {
        // 准备消息
        Map<String, Object> msg = new HashMap<>();
        msg.put("name", "张三");
        msg.put("age", 18);
        // 发送消息
        rabbitTemplate.convertAndSend("message.queue", msg);
    }
}

RabbitMQ控制台队列获取消息:

我们糟糕的发现消息格式似乎不尽人意,并且占据资源较多。

解决方案

我们使用JSON方式来做序列化和反序列化,代替默认的JDK的实现。

在**publisher** 和**consumer**两个服务中都引入依赖:

java 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.10</version>
</dependency>

配置消息转换器,在**publisher** 和**consumer**两个服务的启动类中添加一个Bean即可:

java 复制代码
    @Bean
    public MessageConverter messageConverter(){
        // 1.定义消息转换器
        Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
        // 2.配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息
        jackson2JsonMessageConverter.setCreateMessageIds(true);
        return jackson2JsonMessageConverter;
    }

RabbitMQ控制台队列获取消息:

我们可以在consumer服务中定义一个新的消费者,publisher是用Map发送,那么消费者也一定要用Map接收,格式如下:

java 复制代码
  @RabbitListener(queues = "message.queue")
    public void listenSimpleQueueMessage(Map<String, Object> msg) {
        System.out.println("消费者接收到object.queue消息:【" + msg + "】");
    }

idea控制台接收消息:

结论

将消息转换器从JDK序列化改为JSON序列化显著提升了系统的互操作性和安全性。JSON作为一种轻量级的数据交换格式,不仅易于人类阅读和编写,也便于不同编程语言之间的数据交换,这使得你的应用能够更轻松地与使用其他技术栈的服务进行通信。同时,此举有效避免了JDK序列化中存在的反序列化漏洞风险,增强了系统的安全性。

此外,这一改动还改善了系统性能和可维护性。相较于JDK序列化,JSON序列化通常提供更快的处理速度和更小的数据体积,特别是在网络传输方面表现更为突出。而且,由于JSON格式清晰、工具支持广泛,简化了开发过程中的调试和日志记录工作,有助于减少维护成本并加快问题解决速度。这是一个符合现代软件开发最佳实践的积极改进。

相关推荐
-Springer-2 分钟前
STM32 学习 —— 个人学习笔记2-1(软件安装)
笔记·stm32·学习
半聋半瞎2 分钟前
Flowable快速入门(Spring Boot整合版)
java·spring boot·后端·flowable
I'mChloe8 分钟前
机器学习核心分支:深入解析非监督学习
人工智能·学习·机器学习
散峰而望11 分钟前
【算法竞赛】树
java·数据结构·c++·算法·leetcode·贪心算法·推荐算法
鱼很腾apoc14 分钟前
【实战篇】 第14期 算法竞赛_数据结构超详解(下)
c语言·开发语言·数据结构·学习·算法·青少年编程
Gain_chance16 分钟前
32-学习笔记尚硅谷数仓搭建-DWD层首日数据装载脚本及每日数据装载脚本
大数据·数据仓库·hive·笔记·学习
毕设源码-邱学长18 分钟前
【开题答辩全过程】以 基于SpringBoot的理工学院学术档案管理系统为例,包含答辩的问题和答案
java·spring boot·后端
shejizuopin22 分钟前
基于SSM的高校旧书交易系统的设计与实现(毕业论文)
java·mysql·毕业设计·论文·ssm·毕业论文·高校旧书交易系统的设计与实现
修己xj27 分钟前
SpringBoot解析.mdb文件实战指南
java·spring boot·后端
中二病码农不会遇见C++学姐29 分钟前
.env 文件是干啥的?为什么不能提交到 Git?
git·学习