当前位置: 首页 > news >正文

rabbitmq 短信验证码

1.生成的验证码用redis存 减少数据库压力

2.通知运营商发送短信的事情交给rabbitmq的队列去做,无论成功或者是失败,用户那边都不知道。没有收到验证码(监听失败)用户只会觉得是运营商的问题,而不会怀疑是我们的系统有问题。

(ps:如果没有用rabbitmq来监听,通知运营商的业务失败了,用户就直接知道系统爆了,然而发送验证码这个业务失败又能怎么样呢?多发几次能成功就行,但是不能让用户知道我们的系统很垃圾,这就是使用mq实现异步调用的原因)


新建一个springboot项目,引入web,redis,rabbitmq

# 应用服务 WEB 访问端口
server.port=8080# redis配置
spring.data.redis.host=192.168.168.168
spring.data.redis.port=6379
# spring.data.redis.password=123456
spring.data.redis.database=0
# lettuce连接池
# 最大活跃连接数
spring.data.redis.lettuce.pool.max-active=8
# 最大空闲连接数
spring.data.redis.lettuce.pool.max-idle=8
# 最小空闲连接数
spring.data.redis.lettuce.pool.min-idle=0
# 当所有连接都忙时,客户端等待可用连接的最大时间
spring.data.redis.lettuce.pool.max-wait=100ms# rabbitmq配置
# 主机ip
spring.rabbitmq.host=192.168.168.168
# rabbitmq的编程端口,默认5672
spring.rabbitmq.port=5672
# 账号和密码
spring.rabbitmq.username=chen
spring.rabbitmq.password=123456
# 虚拟主机
spring.rabbitmq.virtual-host=/test
# 通过设置prefetch来控制消费者预取的消息数量。这条配置告诉RabbitMQ的消费者一次只从队列中拉取一条消息进行处理。
spring.rabbitmq.listener.simple.prefetch=1

package com.gmgx.demorabbitmqsms.controller;import ch.qos.logback.core.util.TimeUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Random;
import java.util.concurrent.TimeUnit;@Tag(name = "验证码控制器")
@RequestMapping("sms")
@RestController
public class SmsController {@Resourceprivate RabbitTemplate rabbitTemplate;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Operation(summary = "发送短信验证码")@GetMapping("send")public String send() {//生成4位的数字验证码Random rand = new Random();String code = (rand.nextInt(8999) + 1000) + "";//验证码存在redis,设置1分钟过期  校验时查redisstringRedisTemplate.opsForValue().set("smsCode", code, 60, TimeUnit.SECONDS);//发送消息到rabbitmq的sms.exchange  这个队列的任务是通知运营商发送短信给用户(模拟)rabbitTemplate.convertAndSend("sms.exchange", "", code);return "发送成功";//无论怎样都返回发送成功,欺骗用户}@Operation(summary = "验证")@GetMapping("valify/{code}")public String valify(@PathVariable String code) {if (!stringRedisTemplate.hasKey("smsCode")) {return "验证失败";}if (!code.equals(stringRedisTemplate.opsForValue().get("smsCode"))) {return "验证失败";}stringRedisTemplate.delete("smsCode");return "验证成功";}
}

package com.gmgx.demorabbitmqsms.listener;import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class SmsListener {@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "sms.queue"),exchange = @Exchange(name = "sms.exchange", type = ExchangeTypes.DIRECT)))public void listen(String msg) {try {//休眠5秒,模拟通知运营商发送短信给用户Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("【中国移动】 您的验证码为" + msg + " 请在1分钟内校验");}
}

测试

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 控制器、运算器、存储器、I/O设备详解
  • c++常用工具类函数
  • 【sgCreateCallAPIFunctionParam】自定义小工具:敏捷开发→调用接口方法参数生成工具
  • Score-based Generative Models
  • 前端接口报错302 [已解决]
  • 多米诺骨牌游戏
  • Python提供内置正则表达式库
  • 大数据-147 Apache Kudu 常用 Java API 增删改查
  • 回归阅读第一本:《瓦尔纳宝典》
  • 使用电脑当服务器,来组建局域网是否安全
  • mini-lsm通关笔记Week2Overview
  • IT行业的未来:技术变革与创新的持续推动
  • 肺结节检测-目标检测数据集(包括VOC格式、YOLO格式)
  • 复试经验分享《一、问答题自测》(408、相关前沿技术)
  • 【计算机网络篇】电路交换,报文交换,分组交换
  • 网络传输文件的问题
  • ERLANG 网工修炼笔记 ---- UDP
  • FineReport中如何实现自动滚屏效果
  • JavaScript 一些 DOM 的知识点
  • Less 日常用法
  • React-redux的原理以及使用
  • Sequelize 中文文档 v4 - Getting started - 入门
  • ⭐ Unity + OpenCV 实现实时图像识别与叠加效果
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 聚类分析——Kmeans
  • 浏览器缓存机制分析
  • 什么是Javascript函数节流?
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 通过git安装npm私有模块
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 回归生活:清理微信公众号
  • # Apache SeaTunnel 究竟是什么?
  • #window11设置系统变量#
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (ZT)一个美国文科博士的YardLife
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (多级缓存)多级缓存
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (回溯) LeetCode 78. 子集
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (四)Linux Shell编程——输入输出重定向
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (算法二)滑动窗口
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .env.development、.env.production、.env.staging
  • .Net - 类的介绍
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net Core 中间件验签
  • .NET Core跨平台微服务学习资源