短信发送+实现高并发下高可用(HTTP连接池+异步)

这篇具有很好参考价值的文章主要介绍了短信发送+实现高并发下高可用(HTTP连接池+异步)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

依赖注入

 <properties>
        <spring.boot.version>2.5.5</spring.boot.version>
        <lombok.version>1.18.16</lombok.version>
    </properties>

    
    <dependencies>
        <!--springBoot初始化-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>
        <!--springBootWeb-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
            <version>${spring.boot.version}</version>
        </dependency>


        <!--lombok工具-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <!-- OSS各个项目单独加依赖,根据需要进行添加-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>

        <!--测试相关-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.26-SNAPSHOT</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
            <version>${spring.boot.version}</version>
            <scope>test</scope>
        </dependency>
        <!--guava-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1-jre</version>
        </dependency>
    </dependencies>

application.properties

server.port=8001

spring.application.name=Sms-service

#----sms 短信配置-------
sms.app-code=8b620f10437441f5889d91caa0267a06
sms.template-id=JM1000372

SmsComponent

import com.xtw.config.SmsConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
@Slf4j
public class SmsComponent {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private SmsConfig smsConfig;

    /**
     * 短信发送api接口
     */
    private static final String URL_TEMPLATE = "https://jmsms.market.alicloudapi.com/sms/send?mobile=%s&templateId=%s&value=%s";

    /**
     * 发送验证码
     */
    public void send(String to,String template,String value){

        String url = String.format(URL_TEMPLATE, to, template, value);

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Authorization","APPCODE "+smsConfig.getAppCode());

        HttpEntity<Object> entity = new HttpEntity<>(httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);

        if(responseEntity.getStatusCode().is2xxSuccessful()){
            log.info("验证码发送成功");
        }else {
            log.error("发送短信验证码失败:{}",responseEntity.getBody());
        }

    }

}

SmsConfig

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@ConfigurationProperties(prefix = "sms")
@Configuration
@Data
public class SmsConfig {
    /**
     * 短信验证码发送 appcode
     */
    private String appCode;

    /**
     * 短信内容模板
     */
    private String templateId;

}

RestTemplateConfig(使用HTTP协议请求)

import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory httpRequestFactory){
        return new RestTemplate(httpRequestFactory);
    }

    @Bean
    public ClientHttpRequestFactory httpRequestFactory(){
        return new HttpComponentsClientHttpRequestFactory();
    }
    @Bean
    public HttpClient httpClient(){
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);


        //设置连接池最大是500个连接
        connectionManager.setMaxTotal(500);
        //MaxPerRoute是对maxtotal的细分,每个主机的并发最大是300,route是指域名
        connectionManager.setDefaultMaxPerRoute(300);


        RequestConfig requestConfig = RequestConfig.custom()
                //返回数据的超时时间
                .setSocketTimeout(20000)
                //连接上服务器的超时时间
                .setConnectTimeout(10000)
                //从连接池中获取连接的超时时间
                .setConnectionRequestTimeout(1000)
                .build();


        return HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .build();
    }

}

测试

import com.xtw.SmsApplication;
import com.xtw.component.SmsComponent;
import com.xtw.config.SmsConfig;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes= SmsApplication.class)
@Slf4j
public class SmsTest {

    @Autowired
    private SmsConfig smsConfig;
    @Autowired
    private SmsComponent smsComponent;


    @Test
    public void testProperties(){
        System.out.println(smsConfig.getAppCode());
    }

    @Test
    public void testSend(){
        smsComponent.send("15070159890",smsConfig.getTemplateId(),"652421");
    }
}

异步配置

@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {

    @Bean("threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        //核心线程数
        executor.setCorePoolSize(16);

        //阻塞队列容量
        executor.setQueueCapacity(3000);

        //最大线程数
        executor.setMaxPoolSize(300);

        //非核心线程空闲时,30s后被释放
        executor.setKeepAliveSeconds(30);
        //如果allowCoreThreadTimeout=true,核心线程也会被释放
        executor.setAllowCoreThreadTimeOut(false);

        //线程名前缀
        executor.setThreadNamePrefix("自定义线程池-");

        //线程溢出,处理方案
        //CallerRunsPolicy():交由调用方线程运行,比如 main 线程;如果添加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行
        //AbortPolicy():该策略是线程池的默认策略,如果线程池队列满了丢掉这个任务并且抛出RejectedExecutionException异常。
        //DiscardPolicy():如果线程池队列满了,会直接丢掉这个任务并且不会有任何异常
        //DiscardOldestPolicy():丢弃队列中最老的任务,队列满了,会将最早进入队列的任务删掉腾出空间,再尝试加入队列
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());

        //初始化
        executor.initialize();

        return executor;
    }

}

使用异步

 @Async("threadPoolTaskExecutor")
    public void send(String to,String template,String value) {

        String url = String.format(URL_TEMPLATE, to, template, value);

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Authorization","APPCODE "+smsConfig.getAppCode());

        HttpEntity<Object> entity = new HttpEntity<>(httpHeaders);
//        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
        ResponseEntity<String> responseEntity = restTemplate.exchange("http://localhost:8002/api/visit_stats/v1/str", HttpMethod.POST, entity, String.class);

        if(responseEntity.getStatusCode().is2xxSuccessful()){
            log.info("验证码发送成功");
        }else {
            log.error("发送短信验证码失败:{}",responseEntity.getBody());
        }

    }

文章来源地址https://www.toymoban.com/news/detail-697798.html

到了这里,关于短信发送+实现高并发下高可用(HTTP连接池+异步)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • java 阿里云 发送短信功能实现

    java 阿里云 发送短信功能实现

            常用短信服务平台:阿里云、华为云、腾讯云、京东、梦网、乐信等         AccessKey 是访问阿里云 API 的密钥,具有账户的完全权限,我们要想在后面通过API调用阿里云短信服务的接口发送短信,那么就必须要设置AccessKey。         控制台页面---点击右上

    2024年02月02日
    浏览(13)
  • Android发送短信最简单代码实现

    Android发送短信最简单代码实现

    实现效果如下:(为了尽量使用最少的代码实现功能,界面十分简单,方便理解原理) 这边我输入短信内容为\\\"252525\\\"                                                                                           图一  输入发送号码和指定内容                    

    2024年02月04日
    浏览(26)
  • (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码

    (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码

    阿里云官网: https://www.aliyun.com/ 点击官网首页注册按钮。 注册成功后,点击登录按钮进行登录。登录后进入短信服务管理页面,选择国内消息菜单: 短信签名是短信发送者的署名,表示发送方的身份。 切换到【模板管理】标签页: 短信模板包含短信发送内容、场景、变量信息

    2024年02月02日
    浏览(20)
  • 使用阿里云实现短信发送服务(测试版)

    使用阿里云实现短信发送服务(测试版)

    官网发送测试短信步骤 官网短信测试注册步骤 注册阿里云账号 注册成功之后 获取AK 阿里云官网提供的原生API(验证码发送) 使用的时候需要完善API,代码如下

    2024年02月11日
    浏览(10)
  • STM32学习记录——SIM900A实现中英文短信发送

    STM32学习记录——SIM900A实现中英文短信发送

    目录 调试 32控制 硬件连接 百度网盘源码  发短信失败大概率跟你的模块供电有关系,由于GSM模块发射信号功率较大,电脑的USB供电电流较小,板子供电不足问题需要外接充电宝供电。(充电宝比电脑USB电流大) 首先用串转USB模块调试。 TEST(UCS2)模式下发送中英文短息,短消

    2023年04月12日
    浏览(48)
  • 前端Vue自定义发送短信验证码弹框popup 实现剩余秒数计数 重发短信验证码

    前端Vue自定义发送短信验证码弹框popup 实现剩余秒数计数 重发短信验证码

    前端Vue自定义发送短信验证码弹框popup 实现剩余秒数计数 重发短信验证码, 阅读全文下载完整代码请关注微信公众号: 前端组件开发 效果图如下: 实现代码如下: 使用方法 HTML代码实现部分 组件实现代码

    2024年02月11日
    浏览(10)
  • 腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)

    腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)

    前置:需要腾讯云的账号,后期授权需要,不需要买云服务器,有需要的可以购买短信套餐(几块钱) 搜索框输入短信,可以买一个短信套餐包,便宜不贵,进入短信服务的控制台 发送短信有频率限制,企业用户可以修改设置 之后我们需要对短信内容进行设置      类型有网站

    2024年02月09日
    浏览(11)
  • 如何通过腾讯云短信实现发送验证码并校验验证码以实现登录功能

    验证码相关的10种技术 图像处理技术:生成、识别、验证验证码的图像。 机器学习技术:让计算机自动学习并识别验证码。 文字识别技术:将图像中的文字转换成计算机可读的文本。 模式识别技术:识别验证码中的模式及规律。 图像噪声处理技术:去除图像中的噪声干扰。

    2024年02月10日
    浏览(12)
  • 项目7:(aliyun)实现短信的发送和验证微服务和上传文件删除文件微服务

    项目7:(aliyun)实现短信的发送和验证微服务和上传文件删除文件微服务

    ①gulimall-common和service-base放什么? gulimall-common写全局用的工具包 全局异常处理 全局返回值 工具包(生成随机数,校验手机号) service-base写服务的配置 redis配置类序列化的方式 swagger文档生成分组 ②生成四位或六位随机数 ③校验手机号码正确 ④补充错误代码-501阿里云响应失

    2023年04月19日
    浏览(17)
  • 【script】15行Python代码实现免费发送手机短信推送消息功能(twilio)

    【script】15行Python代码实现免费发送手机短信推送消息功能(twilio)

    通过代码定时给手机推送短信,短信内容可以自定义文字,当然你也可以去别的网站爬取每日心灵鸡汤,天气预报或其它信息进行推送。 本文主要讲如何实现发送短信的功能,全部代码只用15行。 首先贴出实现的效果图,后面再分两步详细描述实现过程,第一步免费注册ap

    2023年04月09日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包