(3)编写启动类
package com.leyou;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LySmsApplication {
public static void main(String[] args) {
SpringApplication.run(LySmsApplication.class,args);
}
}
(4)编写配置文件
server:
port: 8087
spring:
application:
name: sms-service
rabbitmq:
host: 192.168.58.101
username: leyou
password: leyou
virtual-host: /leyou
2、编写短信工具类
(1)属性抽取
我们首先把一些常量抽取到application.yml中:
ly:
sms:
accessKeyId: JWffwFJIwada #你自己的accessKeyid
accessKeySecret: aySRliswq8fe7rF9gQyy1Izz4MQ #你自己的AccessKeySecret
signName: 乐优商城 #签名名称
verifyCodeTemplate: SMS_133976814 #模板名称
编写SmsProperties类去读取配置文件
package com.leyou.sms.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = “ly.sms”)
@Data
public class SmsProperties {
String accessKeyId;
String accessKeySecret;
String signName;
String verifyCodeTemplate;
}
(2)编写工具类
package com.leyou.sms.utils;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.leyou.sms.config.SmsProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import sun.rmi.runtime.Log;
@Slf4j
@Component
@EnableConfigurationProperties(SmsProperties.class)
public class SmsUtils {
@Autowired
private SmsProperties prop;
//产品名称:云通信短信API产品,开发者无需替换
static final String product = “Dysmsapi”;
//产品域名,开发者无需替换
static final String domain = “dysmsapi.aliyuncs.com”;
public SendSmsResponse sendSms(String phoneNumber, String signName, String templateCode, String templateParam) throws ClientException {
//可自助调整超时时间
System.setProperty(“sun.net.client.defaultConnectTimeout”, “10000”);
System.setProperty(“sun.net.client.defaultReadTimeout”, “10000”);
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile(“cn-hangzhou”, prop.getAccessKeyId(), prop.getAccessKeySecret());
DefaultProfile.addEndpoint(“cn-hangzhou”, “cn-hangzhou”, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
request.setMethod(MethodType.POST);
//必填:待发送手机号
request.setPhoneNumbers(phoneNumber);
//必填:短信签名-可在短信控制台中找到
request.setSignName(signName);
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templateCode);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的 n a m e , 您的验证码为 {name},您的验证码为 name,您的验证码为{code}"时,此处的值为
request.setTemplateParam(templateParam);
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if (!“OK”.equals(sendSmsResponse.getCode())) {
log.info(“[短信服务]发送短信失败,phoneNumber:{} , 失败原因 {}”, phoneNumber, sendSmsResponse.getMessage());
}
return sendSmsResponse;
}
}
3、编写消息监听器
接下来,编写消息监听器,当接收到消息后,我们发送短信。
package com.leyou.sms.mq;
import com.leyou.common.utils.JsonUtils;
import com.leyou.sms.config.SmsProperties;
import com.leyou.sms.utils.SmsUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Map;
@Component
@EnableConfigurationProperties(SmsProperties.class)
@Slf4j
public class SmsListener {
@Autowired
private SmsProperties prop;
@Autowired
private SmsUtils smsUtils;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = “sms.verify.code.queue”, durable = “true”),
exchange = @Exchange(name = “ly.sms.exchange”, type = ExchangeTypes.TOPIC),
key = “sms.verify.code”
))
public void listenInsertOrUpdate(Map<String,String> msg) {
if(CollectionUtils.isEmpty(msg)){
return;
}
String phone = msg.remove(“phone”);//remove方法删除并且获取
if(StringUtils.isBlank(phone)){
return;
}
//发送信息
try {
smsUtils.sendSms(phone,prop.getSignName(),prop.getVerifyCodeTemplate(), JsonUtils.toString(msg));
}catch (Exception e){
log.error(“[短信服务]发送短信异常 手机号码{}”,phone,e);
}
}
}
5、编写测试方法
package com.leyou.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SmsTest {
@Autowired
private AmqpTemplate amqpTemplate;
@Test
public void testSend(){
Map<String,String > msg = new HashMap<>();
msg.put(“phone”,“15245621456”);
msg.put(“code”,“54321”);
amqpTemplate.convertAndSend(“ly.sms.exchange”,“sms.verify.code”,msg);
}
}
运行测试
发送成功
手机收到短信
6、通过Redis做短信的限流
(1)设置Redis的配置文件
(2)修改SmsUtils工具类
package com.leyou.sms.utils;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.leyou.sms.config.SmsProperties;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
核心竞争力,怎么才能提高呢?
成年人想要改变生活,逆转状态?那就开始学习吧~
万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。
为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。
前端面试题汇总
JavaScript
性能
linux
前端资料汇总
完整版PDF资料免费分享,只需你点赞支持,动动手指点击此处就可免费领取了。
前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。
😕/img-blog.csdnimg.cn/img_convert/42728594459506983a38ca2b86545fc6.png)
JavaScript
性能
linux
前端资料汇总
完整版PDF资料免费分享,只需你点赞支持,动动手指点击此处就可免费领取了。
前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。