如何在springcloud项目中调用阿里短信功能(下)

目录

为什么要引入redis

1.引入依赖

2.修改配置文件

3.新增redis测试类

4.引入工具类

5.编写发送短信方法

6.测试


为什么要引入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

什么?你的手机没有收到短信?因为你没有充值。发送短信业务是收费的,你充点钱再试试哈

不信?哎,只能让你看控制台它打印的语句了......

发布了352 篇原创文章 · 获赞 163 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/Delicious_Life/article/details/104440618
今日推荐