RocketMQ与SpringBoot整合进行生产级二次封装

前置掌握:SpringBoot基础使用、RocketMQ和SpringBoot的整合使用
源码地址:gitee.com/tianxincode… 文章只会说明核心代码,其他的基础整合配置和多环境自动隔离参考源码即可

RocketMQ与SpringBoot整合进行生产级二次封装

文章插图
 
一、为什么要二次封装
为了不产生歧义,文章中提到的二次封装均是基于原始使用方式的封装,而非源码级别的二次封装
换句话说:如果都需要对源码进行封装了,那么说明公司业务规模都到一定程度了,二次封装这种东西已经不需要讨论了,封装已经是一个共识
  1. 首先明确一点:不进行二次封装完全不影响RocketMQ的使用,可以选择二次封装和不选择二次封装 二次封装可以提供更多的功能和更简洁的使用方式 如果一个封装搞得比原始使用方式更复杂,那么就失去了二次封装的意义 Q1:二次封装可不可以不要?完全可以,完全不影响正常使用 Q2:二次封装有没有必要?仁者见仁智者见智的问题,如果觉得没有必要那么这篇文章可以跳过~
  2. ORM框架中典型的一个二次封装框架就是MyBatisPlus(简称MP),后者是对MyBatis原生使用的增加,不使用MP直接使用MyBatis可不可以?完全可以,那为什么要用二次封装后的MP? 场景:大部分的数据库操作,无外乎CRUD,那么最常用的比如(根据名称就可以知道这个方法做什么用,就没有必要再二次说明了):updateById、batchUpdate、deleteById、saveOrUpdate、batchInsert 。对于上面这5个操作,变化的只是表字段和表名,剩下的语法都是一样 不封装:直接使用MyBatis完全可以自己实现上面方法的功能,但是每个表都需要写一遍自己上面的方法,假设有100张表,那么就会多出495个(下面说明)重复功能代码,而且所有代码都是冗余的 封装后:由封装者提供上面5个方法的公共实现,然后所有需要使用上面功能的Service只需要继承封装好的类就自然的拥有了上面的5大功能,那么代码的冗余量就从100张表*5个方法==500,去掉封装的5个,节省了495的代码冗余量
  3. 所以二次封装是为了更方便用、更简洁、更加适用于系统,量身打造可以大大提升开发效率 。就如上面的5个方法,完全重复性的东西为什么要浪费开发时间来做这些冗余的事情呢?
1.1 二次封装不同观点
让我们以一个生活中的蛋炒饭开个头
原始框架好比提供了原材料:厨具、鸡蛋,米饭等食材、菜谱
  1. 对于框架的使用通常有以下两种方式
  • 第一种:根据菜谱来进行做饭(使用原生的方法调用),洗菜、做饭、刷碗、打扫不管啥入参自己管
  • 第二种:找一个人来学会这道菜(负责二次封装的人)的多种做法(封装大部分业务场景)并做成一种点餐式的服务,谁想吃哪种类型的蛋炒饭直接点餐(调用封装好的方法)就可以吃上香喷喷的蛋炒饭
问题:哪种方案更好? 答案:两种各有各的优势(在说废话,哈哈~)
  1. 第一种:原生方式 优点:可以按照各种方式灵活调用,比如每个人都使用RocketMQTemplate原生send发送消息,想要发送什么类型的消息就发送什么类型的消息,比较随意 缺点:代码大量冗余,从构建参数对象、发送消息、消费消息、异常处理、日志记录、异常重试啥啥的都是自己搞,每个消费队列就会出现上面所有的步骤 。比如现在有一个订单处理中心A接收来自各种类型订单,此时如B、C两个原始订单来源想让A处理订单,那么B和C都需要按照A的要求进行调用,代码会冗余
  2. 第二种:点餐式服务 优点:封装了大部分统一的方法调用,比如 发送消息、异常处理、日志记录等等都是重复的,封装后点餐的人不需要再关系这一部分要怎么处理,只需要告诉点餐服务要不要进行异常、要不异常重试等等,那么此时对于点餐人来说只需要 付钱(调用服务)、吃饭(消费消息),除此之外啥也不用管,全部由点餐服务提供者完成所有上述两个步骤外的其它操作 缺点:无法满足所有点餐人的要求,有的人喜欢味道重一点,有的喜欢味道淡一点 。但是这个缺点完全可以处理,比如点餐服务提供了自定义厨房(返回原始发送对象),此时调用者可以按照第一种方式进行使用


    推荐阅读