首先我们先了解一下传统方式的注册方式,从图中可以看到我们的代码是逐步执行的,上一步未完成下一步无法进行的,该流程非常的耗时,当前注册模块只有一个验证码功能,若以后增加更多模块以后服务会越来越耗时间
当我们加入RabbitMQ中间件后,我们可以将其它的功能放入中间件中,注册功能只进行单独的注册即可,这样做可以为我们的模块大大减少了消耗时间
一般的注册流程耗时6s+,加入RabbitMQ后的注册流程耗时1s+。
二、代码实践【数据库脚本】
create database rabbitmqdb; use rabbitmqdb; create table `user`( uid int primary key auto_increment, uemail varchar(50), uname varchar(50), upwd varchar(50), rname varchar(20) );
1、搭建SpringBoot项目,导入以下依赖内容
org.mybatis.spring.boot mybatis-spring-boot-starter2.2.2 mysql mysql-connector-java5.1.48 org.projectlombok lombokorg.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-mailorg.springframework spring-context-supportorg.springframework.boot spring-boot-starter-amqporg.springframework.boot spring-boot-starter-testtest org.springframework.amqp spring-rabbit-testtest
2、搭建项目基础架构
【配置文件】
server.port=8210
#邮箱发送配置
spring.mail.host=smtp.qq.com
spring.mail.username=1650457693@qq.com
spring.mail.password=这里填写你的邮箱授权码
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
#RabbitMQ配置
spring.rabbitmq.host=192.168.171.134
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123
spring.rabbitmq.virtual-host=/
#mysql配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/rabbitmqdb
spring.datasource.username=root
spring.datasource.password=ok
#mybatis配置
mybatis.type-aliases-package=com.jiabin.pojo
mybatis.mapper-locations=classpath:mapper
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User implements Serializable {
private Integer uid;
private String uemail;
private String uname;
private String upwd;
private String rname;
}
【mapper接口】
@Mapper
public interface UserMapper {
Integer addUser(User user);
}
【mapper映射】
insert `user` value('0',#{uemail},#{uname},#{upwd},#{rname});
【service】
public interface UserService {
Integer register(User user);
}
【serviceImpl】
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public Integer register(User user) {
return userMapper.addUser(user);
}
}
3、创建发送验证码业务类
@Service
public class MailService {
private static final String SENDER = "1650457693@qq.com";
@Autowired
private JavaMailSender mailSender;
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(SENDER);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
} catch (Exception e) {
System.out.println("发送普通邮件时发生异常!" + e);
}
}
public void sendFileMail(String to, String subject, String content, List fileList) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
if (fileList != null && fileList.size() > 0) {
for (File file : fileList) {
FileSystemResource fileSystemResource = new FileSystemResource(file);
String fileName = fileSystemResource.getFilename();
helper.addAttachment(fileName, fileSystemResource);
}
}
mailSender.send(message);
} catch (MessagingException e) {
System.out.println("发送带附件的邮件时发生异常!" + e);
}
}
public void sendHtmlMail(String to, String subject, String content, Map srcIdMap) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
//true指的是html邮件
helper.setText(content, true);
if (srcIdMap != null) {
for (Map.Entry entry : srcIdMap.entrySet()) {
FileSystemResource file = new FileSystemResource(new File(entry.getValue()));
helper.addInline(entry.getKey(), file);
}
}
mailSender.send(message);
} catch (MessagingException e) {
System.out.println("发送HTML静态文件的邮件时发生异常!" + e);
}
}
}
4、创建Controller,实现我们具体的业务,发送验证码工作交给中间件
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RabbitTemplate rabbitTemplate;
@PostMapping("/register")
public String register(@RequestBody User user){
// 数据库入库
userService.register(user);
// 发送验证码
rabbitTemplate.convertAndSend("mailExchange","user.mail",user.getUemail());
// 以后更多的业务放入中间件即可...
// 返回结果
return "用户注册成功!";
}
}
5、创建队列消费者进行短信发送
@Component
public class RabbitMQReciveA {
@Autowired
private MailService mailService;
@RabbitListener(bindings =
@QueueBinding(
value = @Queue, //临时队列
exchange = @Exchange(name = "mailExchange",type = "topic"), //指定交换机名称与类型
key = {"user.*"}
)
)
private void sendEMail(String uemail){
String subject = "用户信息注册成功!";
String content = "恭喜你注册成功!";
mailService.sendSimpleMail(uemail, subject, content);
//发送邮件
System.out.println("已发送邮件");
}
}
6、至此,编写完毕,我们启动项目通过postman测试即可!



