1 需求分析
注册账号,用手机号注册,填写后发送短信验证码,填写短信验证码正确方可注册成
功。
我们这里所做的实际上就是消息生产者。
2 新建子项目zhao588_user
1,新建项目
2.新建启动类和配置文件
启动类
package com.zhao588.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import util.IdWorker;
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
@Bean
public IdWorker idWorkker(){
return new IdWorker(1, 1);
}
}
配置文件,application.yml
server:
port: 9008
spring:
application:
name: zhao588-user #指定服务名
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.63.131:3306/tensquare_user?characterEncoding=UTF8
username: root
password: root
jpa:
database: MySQL
show-sql: true
3 发送短信验证码
实现思路: 在用户微服务编写
API ,
生成手机验证码,存入
Redis
并发送到
RabbitMQ
3.1
准备工作
(
1
)因为要用到缓存和消息队列,所以在用户微服务(zhao588_user)引入依赖
redis
和
amqp
的起步依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
(2)修改
application.yml ,
在
spring
节点下添加配置如下
server:
port: 9008
spring:
application:
name: zhao588-user #指定服务名
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.63.131:3306/tensquare_user?characterEncoding=UTF8
username: root
password: root
jpa:
database: MySQL
show-sql: true
redis:
host: 192.168.63.131
rabbitmq:
host: 192.168.63.131
3.2
代码实现
(
1
)在
UserService
中新增方法,用于发送短信验证码
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendSms(String mobile) {
//生成六位随机数
String checkcode = RandomStringUtils.randomNumeric(6);
//向缓存中放一份 六小时过期
redisTemplate.opsForValue().set("checkcode_"+mobile,checkcode,6,TimeUnit.HOURS);
//给用户发一份
Map<String,String> map = new HashMap<String, String>();
map.put("mobile",mobile);
map.put("checkcode",checkcode);
rabbitTemplate.convertAndSend("sms",map);
//在控制台显示一份,方便测试
System.out.println("验证码:"+checkcode);
}
这里随机数 RandomStringUtils需要引入一个依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
(2)
UserController
新增方法
/*
* 发送短信验证码
* */
@RequestMapping(value = "/sendsms/{mobile}", method = RequestMethod.POST)
public Result sendSms(@PathVariable String mobile){
userService.sendSms(mobile);
return new Result(true,StatusCode.OK,"发送成功");
}
(3)启动微服务(启动docker中的rabbitmq,Redis,最后启动启动类
UserApplication),在rabbitMQ中创建名为sms的队列,测试
a,启动docker中的rabbitmq
docker start rabbitmq
b,启动docker中的Redis
docker start Redis
c,在rabbitMQ中创建名为sms的队列
d,测试
得到验证码
4 用户注册
(
1)UserController增加方法
/*
* 注册用户
* */
@RequestMapping(value = "/register/{code}", method = RequestMethod.POST)
public Result register(@PathVariable String code,@RequestBody User user){
//得着缓存中的验证码
String checkcodeRedis = (String) redisTemplate.opsForValue().get("checkcode_"+user.getMobile());
if(checkcodeRedis.isEmpty()){
return new Result(true,StatusCode.ERROR,"请先获取验证码输入");
}
if(!checkcodeRedis.equals(code)){
return new Result(true,StatusCode.ERROR,"请先输入正确的验证码");
}
userService.add(user);
return new Result(true,StatusCode.OK,"注册成功");
}
(2)UserService
增加方法
/**
* 增加
* @param user
*/
public void add(User user) {
user.setId( idWorker.nextId()+"" );
user.setFollowcount(0);
user.setFanscount(0);
user.setOnline(0L);
user.setRegdate(new Date());
user.setUpdatedate(new Date());
user.setLastdate(new Date());
userDao.save(user);
}
(3)重启启动类测试
注册成功。