目录
为什么要引入redis
这篇我们从消费者的角度讲如何调用阿里短信服务。首先我们给用户发送的验证码需要存在一个地方进行核验,像这种价值密度低,持久性若的数据我们保持在redis中最为合适。
1.引入依赖
我们第一步是在消费者项目中引入springdata提供的redis启动器依赖,我的消费者名为user-service,我是在这个项目的pom文件下填写。除了redis,本篇用到的所有依赖也一并进行了引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.leyou.common</groupId>
<artifactId>leyou-common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.修改配置文件
我们要在yml文件中添加redis的地址以及rabbitmq的连接路径
3.新增redis测试类
我们给他放到这个目录下
这里封装好了redis提供的测试类
package com.leyou.user.test;
import com.leyou.LeyouUserApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = LeyouUserApplication.class)
public class RedisTest {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void testRedis() {
// 存储数据
this.redisTemplate.opsForValue().set("key1", "value1");
// 获取数据
String val = this.redisTemplate.opsForValue().get("key1");
System.out.println("val = " + val);
}
@Test
public void testRedis2() {
// 存储数据,并指定剩余生命时间,5小时
this.redisTemplate.opsForValue().set("key2", "value2",
5, TimeUnit.HOURS);
}
@Test
public void testHash() {
BoundHashOperations<String, Object, Object> hashOps =
this.redisTemplate.boundHashOps("user");
// 操作hash数据
hashOps.put("name", "jack");
hashOps.put("age", "21");
// 获取单个数据
Object name = hashOps.get("name");
System.out.println("name = " + name);
// 获取所有数据
Map<Object, Object> map = hashOps.entries();
for (Map.Entry<Object, Object> me : map.entrySet()) {
System.out.println(me.getKey() + " : " + me.getValue());
}
}
}
我们可以尝试玩玩这个测试类,我们在第一个测试方法中,添加一个key11和一个value11,然后运行这个测试方法
再看看redis客户端
4.引入工具类
我们要生成验证码,这里用到了几个工具类。我们给它引入进来。首先我把工具类单独作为一个微服务,这5个文件引入位置如下
引入之后我们还需要在pom文件中导入依赖
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
5.编写发送短信方法
编写controller
我们在UserController中新增一个方法
/**
* 发送短信验证码
* @param phone
* @return
*/
@PostMapping("code")
public ResponseEntity<Void> sendVerifyCode(@RequestParam("phone")String phone) {
this.userService.sendVerifyCode(phone);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
编写service
我们先注入消息队列模板,redis提供的模板以及redis中读取的前缀
编写service方法
public void sendVerifyCode(String phone) {
if(StringUtils.isBlank(phone)) {
return;
}
//生成验证码
String code = NumberUtils.generateCode(6);
//发送消息到rabbitMQ
Map<String,String> msg = new HashMap<>();
msg.put("phone", phone);
msg.put("code", code);
this.amqpTemplate.convertAndSend("LEYOU.SMS.EXCHANGE","verifycode.sms",msg);
//把验证码保存到redis
this.redisTemplate.opsForValue().set(KEY_PREFIX + phone, code, 5, TimeUnit.MINUTES);
}
6.测试
重启短信微服务和用户微服务
我们通过postman发送一条post请求,参数拼上手机号
可以看到,请求发送成功了,我们再从redis里面看看。可以看到验证码是660810
什么?你的手机没有收到短信?因为你没有充值。发送短信业务是收费的,你充点钱再试试哈
不信?哎,只能让你看控制台它打印的语句了......