rabbitmq 短信验证码

news/2024/9/28 21:20:03/

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分钟内校验");}
}

测试


http://www.ppmy.cn/news/1530722.html

相关文章

ARM/Linux嵌入式面经(三九):中科驭数

文章目录 一个报文怎么从主机A的应用传到主机B的应用?回答面试官可能的追问及回答学过哪些课程回答示例面试官追问示例为什么使用滑动窗口为什么使用滑动窗口面试官可能的追问TCP传输数据会传送到接收方的什么地方完整且有深度的回答面试官可能追问的相关有深度问题如何提高网…

Remotion:使用前端技术开发视频

前言 最近做文章突然想到很多文章其实也可以用视频的方式来展现,以现在短视频的火爆程度,肯定能让更多的人看到。 恰巧最近看了很多关于动画的前端 js 库,那如果将这些动画帧连续起来,岂不是就成了一个视频吗? 而且…

DNS正向解析和反向解析的区别

在网络世界中,域名系统(DNS)起着至关重要的作用,它就如同网络世界的导航地图,帮助我们在浩瀚的数字海洋中准确找到目标。而在DNS中,正向解析和反向解析是两个重要的概念,它们有着明显的区别。 …

复制他人 CSDN 文章到自己的博客

文章目录 0.前言步骤 0.前言 在复制别人文章发布时,记得表明转载哦 步骤 在需要复制的csdn 文章页面,打开浏览器开发者工具(F12)Ctrl F 查找"article_content"标签头 右键“Copy”->“Copy element”新建一个 tx…

组合模式

组合模式 把一组相似的对象当作一个单一的对象。如&#xff1a;树形菜单 public class Menu {String name;List<Menu> child;public Menu(String name){this.name name;child new ArrayList<>();}public void addChild(Menu menu){child.add(menu);}public void …

K8s 之微服务的定义及详细资源调用案例

什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f; 需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。借助Service&#xff0c;应用可以实现服务发现和负载均衡。service默认只支持4层负载均衡能力&…

IT技术之电脑黑屏处理

秋天到了&#xff0c;电脑出问题的高发季节也到了&#xff0c;因为秋天天气开始转冷且天气干燥&#xff0c;加上咱们身上秋天非常愿意产生静电&#xff0c;所以在拿电脑去使用的过程中&#xff0c;身上的静电就会随着的电脑的使用&#xff0c;进入电池里&#xff0c;导致出现黑…

中伟视界:AI算法如何精准识别井下与传送带上堆料,提升矿山安全生产效率,减少事故风险

传送带堆料分为两种情况&#xff0c;一种是传送带的井下堆料检测AI算法&#xff0c;一种是传送带上面的堆料检测AI算法&#xff0c;传送带井下堆料检测AI算法是在带式输送机的漏煤下方井下安装摄像仪&#xff0c;通过视频分析检测井下堆煤情况&#xff0c;当洒煤堆积到一定程度…