短信微服务

短信微服务开发 SpringBoot + ActiveMQ + 阿里大于短信API 1、项目简介        短信微服务开发,其应用场景一般是注册时短信验证码的接收、提示用户注册成功等场景。在短信微服务开发中,本文主要使用技术为:SpringBoot ,快速搭建web应用,即:消息的生产者,消息的消费者; ActiveMQ,消息的中间件,消息的异步接收及异步发送;调用第三方短信服务接口,阿里大于短信API,使用阿里云提供的短信服务。 2、项目架构图 3、生产者项目构建... 阅读详情

发送短信测试

创建aldy_demo的jar工程
导入依赖信息

<dependencies>
	<dependency>
		<groupId>com.aliyun</groupId>
		<artifactId>aliyun-java-sdk-core</artifactId>
		<version>3.7.1</version>
	</dependency>
	<dependency>
		<groupId>com.aliyun</groupId>
		<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
		<version>1.1.0</version>
	</dependency>
</dependencies>

参考阿里云短信服务的api短信服务api
创建demo类测试发送短信

public class SmsDemo {

    //产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";

    //此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    static final String accessKeyId = "";
    static final String accessKeySecret = "";

    public static SendSmsResponse sendSms() throws ClientException {

        //可自助调整超时时间
        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("");
        //必填:短信签名-可在短信控制台中找到
        request.setSignName("");
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode("");
        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
        request.setTemplateParam("{\"code\":\"666888\"}");

        //hint 此处可能会抛出异常,注意catch
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        return sendSmsResponse;
    }

    public static void main(String[] args) throws ClientException, InterruptedException {
        //发短信
        SendSmsResponse response = sendSms();
        System.out.println("短信接口返回的数据----------------");
        System.out.println("Code=" + response.getCode());
        System.out.println("Message=" + response.getMessage());
        System.out.println("RequestId=" + response.getRequestId());
        System.out.println("BizId=" + response.getBizId());

    }

}

运行测试类向自己手机上发送一条验证码
在这里插入图片描述

微服务搭建

构建一个通用的短信发送服务(spring boot),接收activeMQ的消息(MAP类型)消息包括手机号(mobile)、短信模板号(template_code)、签名(sign_name)、参数字符串(param)
AcitiveMQ的消息类型是点对点的队列消息
创建一个jar工程youlexuan_sms
pom依赖信息

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.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-core</artifactId>
        <version>3.7.1</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
        <version>1.1.0</version>
    </dependency>

</dependencies>

创建引导类,放在包的根目录下

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

创建配置文件application.properties

server.port = 8888
spring.activemq.broker-url=tcp://192.168.2.123:61616
accessKeyId = *********
accessKeySecret = ********

抽取短信工具类(原来短信测试类的静态方法改成非静态的,因为是工具类,所以会通过工具类调用方法,所以没必要是静态方法;抽取出来的param字段要求是json格式的)

@Component
public class SmsUtil {

    @Value("${accessKeyId}")
    private String accessKeyId;
    @Value("${accessKeySecret}")
    private String accessKeySecret;

    //产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";

    public SendSmsResponse sendSms(String phone, String sign, String templateId, String param) throws ClientException {

        //可自助调整超时时间
        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(phone);
        //必填:短信签名-可在短信控制台中找到
        request.setSignName(sign);
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode(templateId);
        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
        request.setTemplateParam(param);

        //hint 此处可能会抛出异常,注意catch
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        return sendSmsResponse;
    }
}

创建SmsListener类:

@Component
public class SmsListener {
    @Autowired
    private SmsUtil smsUtil;
    @JmsListener(destination = "smsDestination")
    public void sendSms(Map<String, String> map) {
        try {
            String phone = map.get("phone");
            String sign = map.get("sign");
            String templateId = map.get("templateId");
            String param = map.get("param");

            System.out.println(">>>>>receive msg: phone" + phone + ", sign: " + sign + ", templateId: " + templateId + ",param: " + param);

            SendSmsResponse sendSmsResponse = smsUtil.sendSms(phone, sign, templateId, param);

            System.out.println(">>>>>sms_service send sms result: " + sendSmsResponse.getCode());

        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

这样发送短信的微服务我们就搭建好了,下面只需要在用户controller层以及service层进行生成验证码以及发送AcitiveMQ的消息
配置user_service工程下的spring-jms-producer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    		http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context
    		http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.weilinyang" />

    <!-- 产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
    <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://192.168.2.123:61616" />
    </bean>

    <!-- Spring用于管理ConnectionFactory的ConnectionFactory -->
    <bean id="connectionFactory"
          class="org.springframework.jms.connection.SingleConnectionFactory">
        <property name="targetConnectionFactory" ref="targetConnectionFactory" />
    </bean>

    <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
    </bean>

    <!-- 队列目的地,点对点信息 -->
    <bean id="smsDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="sms_queue" />
    </bean>

</beans>

@Reference
private UserService userService;

@RequestMapping("/sendCode")
public Result sendCode(String phone){
    if (!PhoneFormatCheckUtils.isChinaPhoneLegal(phone)){
        return new Result(false,"手机号非法!");
    }
    try {
        userService.createSmsCode(phone);
        return new Result(false,"短信发送成功!");
    } catch (Exception e) {
        e.printStackTrace();
        return new Result(false,"短信发送异常!");
    }
}
@Value("${sign}")
private String sign;
@Value("${templateId}")
private String templateId;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private JmsTemplate jmsTemplate;

@Override
public void createSmsCode(String phone) {
    //Math.random()  范围[0,1)
    //1、生成6位验证码 100000-999999
    int num = (int)(Math.random() * 900000 + 100000);
    System.out.println("生成的验证码为"+num);
    Map<String,String> map = new HashMap<>();
    map.put("param","{\"code\":\"" + num + "\"}");
    map.put("phone",phone);
    map.put("sign",sign);
    map.put("templateId",templateId);

    // 2. 将验证码在 redis 中保存起来,以便注册时候校验
    redisTemplate.boundHashOps("register_code").put("code",num);
    System.out.println("存入redis");
    // 3. 发送验证码:通过向消息中间件发送消息,来驱动 sms_service 短信服务帮你发验证码
    jmsTemplate.convertAndSend("smsDestination",map);
    System.out.println("已发送actMQ");
}

验证码的校验

验证码的保存
验证码保存在redis数据库中,当用户点击注册时,我们再去redis库中查询与前端提交的进行比对

@RequestMapping("/add")
public Result addUser(@RequestBody TbUser user, String code){
    //校验验证码
    Integer redisCode = (Integer) redisTemplate.boundHashOps("register_code").get("code");
    try {
        if (Integer.parseInt(code)!=redisCode){
            return new Result(false,"验证码错误!");
        }
        // 设置注册时的一些默认信息
        user.setCreated(new Date());
        user.setUpdated(new Date());

        // 密码加密 md5
        user.setPassword(DigestUtils.md5Hex(user.getPassword()));
        userService.addUser(user);
        return new Result(true,"注册成功!");

    } catch (Exception e) {
        e.printStackTrace();
        return new Result(false,"注册失败!");
    }
}
短信微服务 —activeMQ 短信微服务 pom文件 添加依赖(阿里云通信) <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.1.0</version... 阅读详情

相关推荐

DVWA靶场实战:从搭建到渗透测试的完整指南

本文详细介绍了DVWA靶场的搭建与渗透测试全流程,涵盖LAMP环境搭建、Docker部署及集成环境安装三种方式。通过SQL注入、文件上传漏洞等实战案例,帮助读者掌握Web安全测试技巧,并提供防御方案与进阶调优建议,是网络安全学习的实用指南。

weixin_28312391的博客 488

C#报错提醒:“对象引用对于非静态字段、方法或属性是必需的”

C#报错提醒:“对象引用对于非静态字段、方法或属性是必需的” 原因:类中静态的方法、成员函数只能访问静态的数据成员或者静态的方法。 所以当静态函数调用非静态函数时,会提醒报错。 解决方法: 1、把调用的函数变成静态的,在它定义前加static 2,通过实例化一个对象来调用那个非静态函数 ...

weixin_43041350的博客 2万+

OnePose++: Keypoint-Free One-Shot Object Pose Estimation without CAD Models

算法:首先采用LoFTR的细匹配模块,将粗匹配点周围的小窗口内,通过对比特征找到最相似的位置,细化当前特征点的位置。算法:PnP算法,利用3D点和2D投影点的对应关系,计算相机相对于物体的6D姿态(位置朝向)。算法:使用COLMAP,对2D粗匹配对(不依赖传统关键点匹配)进行特征轨迹计算并生成半稠密点云,每个3D点包含坐标和对应的2D投影点。算法:LoFTR粗匹配模块,将每一个像素点视为伪关键点,生成半稠密的2D匹配对。输入:优化后的3D、当前视图的2D特征点。输出:粗半稠密点云以及物体的特征轨迹。

雨落倾城的博客 884

手把手教你如何使用阿里云短信API

1、官方提供的短信功能APIpublic class SmsUtils { public static void main(String[] args) throws ClientException { sendSms(); } //产品名称:云通信短信API产品,开发者无需替换 static final String product = "Dysmsa

m0_37556124的博客 1万+

一文看懂—Agent多智能体协作

多智能体协作已成为AI应对复杂任务的关键范式,通过模拟人类团队分工,实现专业化、高效化和纠错能力。本文系统阐述了多智能体协作的核心概念(智能体分工、工作流编排、工具使用)、与产品规划的关联(任务拆解、错误处理、组织架构设计),以及典型应用场景(报告生成、客服工单、学习规划)。同时剖析了常见陷阱(循环卡死、信息失真、成本失控)及解决方案,并提供了实用工具模板(角色定义卡、工作流画布、成本仪表盘)。最后通过市场竞品分析和旅行规划两个实战案例,展示了多智能体协作的实际价值。该技术正推动AI从单点智能迈向系统智能,

lee006006的博客 1033

电荷灵敏前置放大器噪声优化策略:从理论到实践

本文深入探讨了电荷灵敏前置放大器的噪声优化策略,从理论分析到实践应用。文章系统解析了并联电流噪声与串联电压噪声的来源,并引入噪声等效原理与“冷电容”模型作为统一分析工具。通过详解a、b、c三类噪声的频谱特性,为实战优化提供了清晰指导。核心策略包括选用高跨导、低漏电流FET,优化静态工作点,采用共源-共基结构,精心设计反馈网络,以及实施严格的PCB布局、屏蔽与接地,旨在全面提升微弱信号检测系统的信噪比。

weixin_29292431的博客 466

阿里云短信使用总结

阿里云短信官方文档地址单条短信发送1、官方api2、实例使用3、注意事项1)、addEndpoint方法过时批量短信发送api官网api实例使用注意事项1)、传入短信模板参数设置2)、短信签名参数设置3)、批量参数一一对应4)、短信的发送号码问题短信日志1)、设置Http消息回执推送的接口 官方文档地址 阿里云短信服务官方帮助文档:https://help.aliyun.com/product/44282.html?spm=5176.12207334.0.0.37941cbeBR3aFY 打开阿里云官网注册

空圆小生的博客 2126

Vue 实现华视身份证读卡器功能

在www.downcc.com下载“华视cvr100驱动”安装程序; 华视电子官网有相应的文档说明和程序下载 一、服务安装 选择安装目录: 启动读卡服务: 安装成功会有如图所示: 注意事项: 安装开发包必须使用管理员权限,因为windows服务和读卡器设备驱动程序均需要管理员权限,否则会安装失败。 win10需要修改组策略才有管理员权限。 二、服务的使用 打开浏览器,输入地址http://127.0.0.1:19196/mainpage,回车 点击openDevice: 点.

zyqgt960812的博客 6500

阿里云短信服务(完整指南),短信发送功能实现。

本篇文章是根据阿里云短信接口,为什么选择阿里呢,首先,名气大,然后,对其他云不熟,最后,阿里云短信开通后只需要充十块钱,就够你用好久,一条四分钱,其他短信不太清楚,不过有的必须要你一次性买多少万条才能用。我是看下面的链接在阿里云上开通短信接口的,大家也可以看看。  https://yq.aliyun.com/articles/252987 然后就是阿里云提供的api,由于只对Java熟,用的J...

风云无忌的博客 1万+

MATLAB小白也能搞定!BCT脑网络分析工具箱安装与入门指南

本文为零基础用户提供了一份详尽的BCT脑网络分析工具箱安装与入门指南。从MATLAB环境配置、BCT工具箱下载与路径添加,到连接矩阵构建、节点度与聚类系数等基础指标计算,手把手带领神经科学研究者跨越编程门槛,快速掌握脑影像数据分析的核心流程。

threejs5artist的博客 1089

[27] cuda 应用之 核函数实现图像通道变换

[27] cuda 应用之 核函数实现图像通道变换

yohnyang的博客 201

C#关于报错对象引用非静态的字段、方法或属性的解决方法

关于C#对象引用非静态字段、方法或属性报错的解决方法

weixin_49708032的博客 6205

6、线性时序逻辑到确定性自动机的翻译

本博文详细介绍了将线性时序逻辑(LTL)转化为确定性自动机的理论基础、技术方法和实际应用。内容涵盖LTL的基本运算符、确定性自动机的特点及其在模型检测中的作用,以及具体的翻译步骤与优化策略。通过实际案例展示了如何利用这一技术进行系统属性验证,并探讨了翻译过程中可能遇到的挑战及解决方案。

gpu4optimizer的博客 149

微服务开发之注册发送短信验证码

前期工作: docker环境下安装mysql容器,redis容器,rabbitmq容器 MySql: 一、安装docker 1、按着教程 https://docs.docker.com/install/linux/docker-ce/centos/#uninstall-old-versions 当前安装的dockeer版本是一个稳定版 sudo yum install docker-ce-17.0...

L__MY的博客 1833

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

实现短信验证微服务

大致的业务:通过rabbitmq,接收消息异步发送验证短信(非常简单) 工具:IEDA,springCloud、rabbitmq、阿里云鼎信短信API 实现(很简单): 创建发送短信的微服务 在调用端将消息发送给交换机(调用端,不是短信微服务端) @Override public void sendCode(String phone) { HashMap<Strin...

私は悪い人ですか的博客 333

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

阿里大于发送短信(用户微服务--消息微服务)

接入阿里大云发送短信

xiao-啸 1737

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

乐优商城笔记八:短信微服务

完成短信微服务,主要负责全站各种短信的发送。 搭建短信微服务 创建子工程 GroupId:com.leyou.service ArtifactId:ly-sms 编写pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" ...

Bbb的博客 552

SpringBoot整合ActiveMQ搭建短信微服务

SpringBoot搭建短信微服务 SpringBoot快速搭建Spring工程,所以非常适合进行搭建微服务,本片中主要介绍的是使用阿里大于进行短信为服务的搭建。 SpringBoot和activeMQ的整合 MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka。ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J...

hax1435501085的博客 514

实战:1 小时上线 Flask 短信微服务

点击上方“编程派”,选择设为“设为星标”优质文章,第一时间送达!作者:火眼君@掘金前言Flask 是 Python 开发的轻量 Web 框架,有多轻量呢?10 行以内就可以开发一个 We...

codingpy的博客 374

微服务中的短信服务如何设计?

发送短信功能,在开发过程中是最常见的需求。用户登录验证码的发送,活动促销短信的发送等。本 Chat 将带领你深入地去学习如何设计和实现一个通用的基础短信服务,采用 Spring Boot 开发短信服务,最终会注册到 Spring Cloud 微服务体系中,方便其他服务使用。 主要内容如下: 短信服务的需求; 阿里云短信的接入; 短信服务的设计; 短信 API 的管理; 短信的安全防护;...

GitChat 1964

C++GO语言微服务之图片、短信验证码生成及存储②

C++GO语言微服务之图片、短信验证码生成及存储②

qq_27302885的博客 836

1 小时上线之用 Flask 开发一个短信微服务

前言 Flask 是 Python 开发的轻量 Web 框架,有多轻量呢?10 行以内就可以开发一个 Web 服务,不过这只能用来做演示,今天我就用 1 个小时来开发一个用于生产环境的短信微服务。以下是生产环境直接可用的服务代码,绝非示例教程。 为什么要开发短信微服务? 短信服务我们都是依赖公有云的实现,通过公有云的 API 直接调用,那为什么还要自己封装呢? 因为微服务环境下我们要减少代码的重复量,如果有多个微服务需要使用短信服务,那就要复制多遍代码,把公有云的 API 包装成我们自己的微服务 A

ludongguoa的博客 490

SpringBoot(21) 基于阿里大于的短信验证微服务

SpringBoot(21) 基于阿里大于的短信验证微服务 阿里大于其实就是阿里云下提供的一个服务,有开放API及SDK,用起来很方便,至于怎么去注册,开启服务,申请签名,生成短信模板,获取AccessKey,下载SDK和Demo等等操作就不详细介绍了,网上有很多的教程很详细,可以参考这篇博客: https://blog.youkuaiyun.com/qq1031893936/article/details/...

WilsonSong1024的博客 1497

基于微服务的用户注册时的手机短信验证码

基于微服务的用户注册时的手机短信验证码,这里将短信验证码的第三方接口(阿里云提供)封装成一个工具类 截图: 示例 1.工程结构: 2.crowd-common子模块中: (1).RedisProviderService.java: import com.kmu.util.ResultEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.anno

weixin_46007404的博客 1644

Spring boot 实战阿里云短信服务 微服务

前提工作: 1、注册阿里云账号 2、开通短信服务 3、账号需要充值一点金额, 短信服务是收费的 4、学习官方文档 一、注册阿里云账号 自己注册, 略 二、开通短信服务 1、登陆阿里云控制台, 搜索短信服务 2、开通短信服务 我这里已经开通过了, 第一次进入会提示开通服务, 点击开通即可。 3、学习官方文档 官方文档是我们学习新技术最好的参考资料, 这里会给出所有的样例, 以及向我们详细的介绍这项技术。 (好多技术文档都是英文的, 阅读起来比较费劲, 直接就把一部分同学劝退了, 好在阿里云是国产。。。)

cyt 495

用户微服务-用户注册 发送短信验证码

1 需求分析 注册账号,用手机号注册,填写后发送短信验证码, 填写短信验证码正确方可注册成功。 2 实现思路 1)用户微服务生成6位的短信验证码,存入redis (以code_手机号为key),再发送给rabbitmq . 2)短信微服务从rabbitmq中提取消息,调用阿里云通信api发送短信 3)用户注册,从redis提取验证码,与用户在界面上填写的验证码进行比较,只有填写正确才能注册。 3...

L-李俊漩的博客 2007
上一篇: ActiveMQ在分布式项目中的解耦应用
下一篇: 开源单点登录系统CAS
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值