1、项目简介
短信微服务开发,其应用场景一般是注册时短信验证码的接收、提示用户注册成功等场景。在短信微服务开发中,本文主要使用技术为:SpringBoot ,快速搭建web应用,即:消息的生产者,消息的消费者; ActiveMQ,消息的中间件,消息的异步接收及异步发送;调用第三方短信服务接口,阿里大于短信API,使用阿里云提供的短信服务。
2、项目架构图
3、生产者项目构建
(1)建立maven工程,注意是jar工程
(2)引入pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.test.demo</groupId> <artifactId>SpringBootDemo</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>1.7</java.version> // jdk 版本号 </properties>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> // springBoot 起步依赖 </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> // springBoot 热部署 </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> // activeMQ 起步依赖 </dependency> </dependencies>
</project> |
(3)src/main/java 工程文件
程序入口文件 Application
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); } } |
生产者
*/ @RestController public class QueueController {
@Autowired private JmsMessagingTemplate jmsMessagingTemplate;
@RequestMapping("/sendmap") public void sendMap(){ Map map = new HashMap<>(); map.put("mobile", "18800000000"); // 消息消费方的手机号 map.put("template_code", "SMS_100000000"); // 消息内容模板, 在阿里大于服务上编辑 map.put("sign_name", "aaa"); // 消息签名, 在阿里大于服务上申请 map.put("param", "{\"name\":\"bbb\"}"); // 消息模板中使用的参数,例如${name}
jmsMessagingTemplate.convertAndSend("sms", map); } } |
(4)src/main/resources 下
application.properties
server.port=8088 // tomcat 端口号 spring.activemq.broker-url=tcp://192.168.25.131:61616 //activeMQ 客户端地址 |
4、消费者项目构建
(1)建立maven工程,注意是jar工程
(2)引入pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.test.sms</groupId> <artifactId>test_sms_service</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>1.7</java.version> // jdk 版本号 </properties>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> // springBoot 起步依赖 </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> // springBoot 热部署 </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> // activeMQ 起步依赖 </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> // 阿里短信服务依赖 <version>1.0.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> // 阿里短信服务依赖 <version>3.2.5</version> </dependency> </dependencies> </project> |
(3)src/main/java 工程文件
程序入口文件 Application, 同生产者的,copy就好
SmsUtil.java
@Component public class SmsUtil {
//产品名称:云通信短信API产品,开发者无需替换 static final String product = "Dysmsapi"; //产品域名,开发者无需替换 static final String domain = "dysmsapi.aliyuncs.com"; @Autowired private Environment env;
public SendSmsResponse sendSms(String mobile,String template_code,String sign_name,String param) throws ClientException {
String accessKeyId = env.getProperty("accessKeyId"); String accessKeySecret = env.getProperty("accessKeySecret"); //可自助调整超时时间 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暂不支持region化 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容 SendSmsRequest request = new SendSmsRequest(); //必填:待发送手机号 request.setPhoneNumbers(mobile); //必填:短信签名-可在短信控制台中找到 request.setSignName(sign_name); //必填:短信模板-可在短信控制台中找到 request.setTemplateCode(template_code); //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 request.setTemplateParam(param);
//选填-上行短信扩展码(无特殊需求用户请忽略此字段) //request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 request.setOutId("yourOutId");
//hint 此处可能会抛出异常,注意catch SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse; } |
消费者
@Component public class SmsListener {
@Autowired private SmsUtil smsUtil;
@JmsListener(destination="sms") public void sendSms(Map<String,String> map){
try { SendSmsResponse response = smsUtil.sendSms(map.get("mobile"), map.get("template_code"), map.get("sign_name"), map.get("param")); System.out.println("code: " + response.getCode()); System.out.println("message: " + response.getMessage());
} catch (ClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
(4)src/main/resources 下
application.properties
server.port=9003 // 服务端口号 spring.activemq.broker-url=tcp://192.168.25.131:61616 //activeMQ 客户端 accessKeyId= ******** // 阿里大于服务上申请 accessKeySecret= ******** // 阿里大于服务上申请 |
5、项目启动
(1) 生产者在浏览器中:
http://localhost:8088/sendmap 回车
产生消息,并推送给activeMQ。
(2) 将生产者和消费者中的application.java 均启动, 消费者监听消息,接收activeMQ的消息,消费它!
(3) 稍等一会,在手机号为:18800000000 , 发送内容为:SMS_100000000 对应的模板内容的短信
短信微服务搭建成功!