基於springBoot的短信微服務架構

基於SpringBoot的短信微服務架構

3.1需求分析

構建一個通用的短信發送服務(獨立於品優購的單獨工程),接收activeMQ的消息(MAP類型)  消息包括手機號(mobile)、短信模板號(template_code)、簽名(sign_name)、參數字符串(param

3.2代碼實現

3.2.1工程搭建

(1)創建工程itcast_sms_service (JAR工程),POM文件引入依賴  

  <properties>   

    <java.version>1.7</java.version>

  </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>

    </dependency>

    <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-activemq</artifactId>

</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>

(2)創建引導類

package cn.itcast.sms;

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);

}

}

(3)創建配置文件application.properties

server.port=9003

spring.activemq.broker-url=tcp://192.168.25.135:61616

accessKeyId=不告訴你

accessKeySecret=不告訴你

3.2.2短信工具類

參照之前的短信demo創建短信工具類

package cn.itcast.sms;

import com.aliyuncs.DefaultAcsClient;

import com.aliyuncs.IAcsClient;

import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;

import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;

import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;

import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;

import com.aliyuncs.exceptions.ClientException;

import com.aliyuncs.profile.DefaultProfile;

import com.aliyuncs.profile.IClientProfile;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.core.env.Environment;

import org.springframework.stereotype.Component;

/**

 * 短信工具類

 * @author Administrator

 *

 */

@Component

public class SmsUtil {

 

    //產品名稱:雲通信短信API產品,開發者無需替換

    static final String product = "Dysmsapi";

    //產品域名,開發者無需替換

    static final String domain = "dysmsapi.aliyuncs.com";

    

    @Autowired

    private Environment env;

 

    // TODO 此處需要替換成開發者自己的AK(在阿里雲訪問控制檯尋找)

    

    /**

     * 發送短信

     * @param mobile 手機號

     * @param template_code 模板號

     * @param sign_name 簽名

     * @param param 參數

     * @return

     * @throws ClientException

     */

    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;

    }

 

    public  QuerySendDetailsResponse querySendDetails(String mobile,String bizId) 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);

        //組裝請求對象

        QuerySendDetailsRequest request = new QuerySendDetailsRequest();

        //必填-號碼

        request.setPhoneNumber(mobile);

        //可選-流水號

        request.setBizId(bizId);

        //必填-發送日期 支持30天內記錄查詢,格式yyyyMMdd

        SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");

        request.setSendDate(ft.format(new Date()));

        //必填-頁大小

        request.setPageSize(10L);

        //必填-當前頁碼從1開始計數

        request.setCurrentPage(1L);

        //hint 此處可能會拋出異常,注意catch

        QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);

        return querySendDetailsResponse;

    }

}

3.2.3消息監聽類

創建SmsListener.java

package cn.itcast.sms;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jms.annotation.JmsListener;

import org.springframework.stereotype.Component;

import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;

import com.aliyuncs.exceptions.ClientException;

/**

 * 消息監聽類

 * @author Administrator

 */

@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());

        System.out.println("RequestId=" + response.getRequestId());

        System.out.println("BizId=" + response.getBizId());

} catch (ClientException e) {

e.printStackTrace();

}

}

}

3.3代碼測試

修改springboot-demo  的QueueController.java

@RequestMapping("/sendsms")

public void sendSms(){

Map map=new HashMap<>();

map.put("mobile", "13900001111");

map.put("template_code", "SMS_85735065");

map.put("sign_name", "黑馬");

map.put("param", "{\"number\":\"102931\"}");

jmsMessagingTemplate.convertAndSend("sms",map);

}

啓動itcast_sms_service

啓動springboot-demo

地址欄輸入:http://localhost:8088/sendsms.do 

觀察控制檯輸出

隨後短信也成功發送到你的手機上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章