Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开源项目推荐系列(短信网关)

开源项目推荐系列(短信网关)

作者头像
用户9927510
发布于 2022-07-29 01:10:59
发布于 2022-07-29 01:10:59
2.8K00
代码可运行
举报
运行总次数:0
代码可运行

前言

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger 种一棵树最好的时间是十年前,其次是现在

Tips

开源项目推荐系列是,小六六平时不是会逛逛开源平台嘛!然后就想着把一些项目分享给到大家,给大家说说我对这个开源项目的一些看法,当然,在写的过程中,也可以让自己的知识面更广,希望能给大家带来不一样的东西。

短信网关

今天分享的项目是短信网关,这个项目呢?是某马在B站上放出来的项目,我也称之它为开源项目吧!哈哈

image.png

image.png

为啥要用短信网关

随着企业业务扩张、应用成倍的增加、短信规模化使用,传统短信平台的接入方式和单一的信息发送功能,已经不能完全满足现代企业管理的需求,所以统一入口、减少对接成本、同时兼顾多种短信业务、简单易行的操作与维护、高稳定、高可靠的移动信息化应用成为短信平台发展趋势。

image.png

  • 服务越来越多,每个服务都有可能发送短信,是否每个服务都需要对接一遍?
  • 多应用对接短信,如何做到短信发送服务高效、稳定?
  • 短信通道出现异常时,如何快速切换通道?
  • 切换通道时,如何做到应用服务无感知?
  • 如何统计各服务短信发送情况,以便进行后续营销分析?

本项目(集信达短信平台)的核心在于保证短信高效、准确的送达、简单易操作的对接方式。通过对服务的解耦、通讯方式的升级来提升系统的吞吐量。同时在多通道的加持下,通过智能动态的通道评级、选举、降级、热插拔,增强了系统的健壮性,摆脱对单一通道的依赖。并且提供多种对接方式,满足企业内部的各种需求。

平台架构

集信达短信平台的整体架构如下:

image.png

主要有以下几个服务

  • pd-sms-api 给业务用
  • pd-sms-manage 后台管理
  • pd-sms-server 真正发送短信

业务架构

image.png

通过上面的业务架构可以看到,短信接收服务(pd-sms-api)提供3种方式供业务系统调用:

  • HTTP接口
  • TCP
  • SDK形式

短信接收服务通过资质验证(可开关)、短信内容校验后将短信信息发送到对应中间件中(Redis、MySQL)。

短信发送方式分为两种类型:

  • 定时发送短信:将短信内容存储到MySQL数据库中,由短信发送服务通过定时任务获取并发送
  • 普通短信:将短信内容推送到Redis队列中,由短信发送服务异步接收并发送

项目结构

image.png

集信达短信平台,项目整体工程结构和模块功能如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

pd-sms-backend       # 集信达 短信平台父工程
 ├── pd-sms-entity   # 短信平台实体
 ├── pd-sms-manage   # 系统管理服务
 ├── pa-sms-api    # 短信接收服务,应用系统调用接口、发送短信
 ├── pd-sms-server   # 短信发送服务,调用短信通道、发送短信
 └── pd-sms-sdk    # 短信SDK,应用系统引入、发送短信

集信达短信服务有三个:后台管理服务,短信接收服务,短信发送服务:

应用

端口

说明

启动命令

pd-sms-manage

8770

后台管理服务

java -jar pd-sms-manage.jar &

pd-sms-api

8771

短信接收服务

java -jar pd-sms-api.jar &

pd-sms-server

8772

短信发送服务

java -jar pd-sms-server.jar &

业务方调用处理流程

调用方式:

  • 业务统调用短信接收服务提供的接口,由短信接收服务将信息保存到消息缓冲区(Mysql、Redis)
  • 调用方式:HTTP、TCP(Netty)、SDK

处理流程:

短信接收服务接收到应用系统请求后,会进行相关的校验处理,校验通过则将信息保存到消息缓存区,具体处理流程如下:

image.png

短信发送服务的发送过程

相关功能:

  • 和具体的短信通道对接(例如:阿里云短信、梦网短信等),发送短信
  • 短信定时发送
  • 短信实时发送
  • 服务注册,保证短信发送服务高可用
  • 通道自动选举、降级

处理过程:

image.png

项目亮点

架构的设计

架构的设计和耦合性还是很好的,代码的风格也很优雅,代码通俗易懂,我随机截取一个类给大家看看

image.png

短信发送服务核心类

  • ServerRegister:服务注册器,用于将短信发送服务注册到Redis中,定时服务上报,定时服务检查
  • ConfigServiceImpl:通道配置器,用于查询可用通道(阿里短信、华为短信等),通道选举、降级
  • AbstractSmsService:短信发送器抽象父类,子类需要和具体的短信通道对接来完成发送短信的工作
  • SmsConnectLoader:通道实例加载器,根据通道配置,初始化每个通道的Bean对象
  • SmsFactory:短信发送工厂,获取具体的通道实例Bean对象(例如AliyunSmsService)来发送短信, 如果发送出现异常,触发通道选举和通道降级策略
  • SendTimingSmsImpl:定时短信业务处理器,具体负责定时短信的发送
  • SendSmsJob:短信发送定时任务,用于定时短信的发送,调用SendTimingSmsImpl发送定时短信
  • GeneralSmsListener、HighSmsListener:短信接收器,Redis队列的消费者,监听队列中的消息,如果有消息则调用SmsFactory发送实时短信
  • HighServerReceiver:通道消息监听器,通过Redis的发布订阅模式监听通道相关消息,调用SmsConnectLoader初始化通道和更新通道
  • SubscriberConfig:订阅发布模式的容器配置,创建消息监听容器,并将HighServerReceiver加入容器中

服务注册器

大家知道这个是干嘛的吧?哈哈往下看,保证让你觉得有点东西

其实这块的概念和我们服务的注册于发现其实差不多的,但是作用确是不同,为啥这里我们要服务注册呢?原因如下

短信发送服务支持分布式集群部署,可以是多个实例,实例越多,发送短信的能力越强。但是对于通道选举、持久化通道等操作,只能有一个服务实例执行,其他服务实例通过redis的广播机制获得通道变化。

如果要实现这一功能,需要将所有短信发送服务实例注册到某个地方,当前实现是将所有服务实例注册到Redis中。并且为了能够监控每个服务实例运行状态,需要每个服务实例定时上报并且定时进行服务检查。

业务逻辑

  • 服务注册,项目启动时将当前服务实例id注册到redis
  • 服务上报,每三分钟报告一次,并传入当前时间戳
  • 服务检查,每十分钟检查一次服务列表,清空超过五分钟没有报告的服务

通道实例加载器

通道实例加载器对应的为SmsConnectLoader类。

短信发送服务存在多个通道(例如阿里云短信、梦网短信等),这些通道是通过后台管理系统设置的,包括通道的名称、签名、模板、连接方式等信息。当短信发送服务启动时,或者后台管理系统设置通道时,将会初始化短信通道。

image.png

通道实例加载器的作用就是根据通道配置,初始化每个通道的Bean对象(例如AliyunSmsService、MengWangSmsService等)。

真正发送流程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

/**
 * 短信发送工厂
     1. 获取构建好的短信通道
     2. 调用通道方法,发送短信
     3. 如果发送出现异常,触发通道选举和通道降级策略
     4. 当通道选举被触发时:smsConnectLoader.buildNewConnect()
     5. 当通道降级被触发时:smsConnectLoader.changeNewConnectMessage()
     6. 记录短信发送日志
 */

image.png

采用do while的模式,直到遍历所有的通道把短信成功发送

异步通道降级选举

再真正下发短信的流程中

image.png

在一次真正向第三方发送短信的时候,如果发送失败,就会走进到这个重新排序通道逻辑,判断是否需要重排序

在这逻辑中有2个很关键的点

  • 固定阈值 (具体数值)
  • 固定因子 (按比例)

image.png

里面呢?有2个核心逻辑

  • 降级
  • 选举

异步通道选举流程

image.png

通道选择,只能再一台通道中选举,所以用分布式锁。

listForNewConnect 选择策略

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 通道选举,选举策略:
* 1、剔除掉第一级通道
* 2、查询最近一小时内通道发送短信数量,按数量排序通道
* 3、如果最近一小时没有发送短信,按最后发送成功排序

具体的逻辑还是有点东西的,哈哈。大家自己去看源码吧

结束

我觉得,这个项目的设计,技术,架构都是非常不错的,而且又全是crud,对于个人的帮助还是很不错的,如果有时间大家花点时间去吃透它,对于之后的架构设计,面试等都有很大的帮助,并且这个项目很小,代码量也少,花的时间也不多,我是非常推进的拉。好了,就到这了 我是小六六 三天打鱼,两天晒网,项目自己大家去B站找吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 六脉神剑的程序人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊如何在Java应用中发送短信
很多业务场景里,我们都需要发送短信,比如登陆验证码、告警、营销通知、节日祝福等等。
勇哥java实战
2023/11/07
8350
个人开发者短信验证码接入方案技术分析与实践
在开发个人项目时,短信验证码是用户注册、登录验证等场景的必需功能。然而,传统短信服务提供商大多要求企业资质,给个人开发者造成了技术实现上的困难。本文将从技术角度分析这一问题,并分享一些实用的解决方案。
外滩首席运维
2025/06/09
970
一次短信验证码“撞库”,发生的惨案!!!
故事要从一天中午开始说起,同事小张正在午休,睡的正酣,突然被产品经理给叫醒。运营反馈,大量用户打客服电话,说到没有注册平台却收到成功注册平台账号的短信内容。
兔云小新LM
2021/12/27
2.6K0
一次短信验证码“撞库”,发生的惨案!!!
51单片机+SIM800C(GSM模块)实现短信发送功能
本项目利用51单片机和SIM800C GSM模块实现短信发送功能。短信作为一种广泛应用的通信方式,在许多领域具有重要的作用,如物联网、安防系统、远程监控等。通过将51单片机与SIM800C GSM模块相结合,可以实现在各种应用场景下的短信通信功能。
DS小龙哥
2023/11/08
1.4K0
51单片机+SIM800C(GSM模块)实现短信发送功能
thinkPHP框架实现的短信接口验证码功能示例
本文实例讲述了thinkPHP框架实现的短信接口验证码功能。分享给大家供大家参考,具体如下:
PHP开发工程师
2021/06/03
3.4K0
三个月写了个短信平台,开源出来!
大家好,我是勇哥。花了三个月的时间,我手写了个短信平台服务 platform-sms,今天开源出来 Beta 版本。
勇哥java实战
2023/11/26
1.6K1
Rocketmq--消息驱动
MQ(Message Queue)是一种跨进程的通信机制,用于传递消息。通俗点说,就是一个先进先出的数
IT小马哥
2021/06/03
7260
Rocketmq--消息驱动
MySQL数据库基础练习系列48、短信发送系统
很多学生或者说是初学者在学习完成数据库的基础增删改查后就自认为在数据库这里就很熟悉了,但是不接触项目根本部知道需求,我这里准备了50个项目的基本需求来让大家来熟练各类项目的列信息,让大家更好的深入项目进行实战式的练习,可以让大家在后面面试的时候有更多更丰富的资历让大家可以与面试官侃侃而谈。
红目香薰
2024/06/16
1190
MySQL数据库基础练习系列48、短信发送系统
【愚公系列】2022年01月 Django商城项目08-注册界面-短信验证码
Celery由以下三部分构成:消息中间件(Broker)、任务执行单元Worker、结果存储(Backend)
愚公搬代码
2022/01/14
8750
【愚公系列】2022年01月 Django商城项目08-注册界面-短信验证码
【笔记整理】SpringBoot集成腾讯云短信
前言 记录一下最近使用SpringBoot基础腾讯云里的短信产品功能的体验。 1、腾讯云申请开通短信服务。 2、配置短信内容:分别创建签名、模板和群发短信。 3、使用SpringBoot工程集成测试。
pbinlog
2022/04/18
8.3K0
SpringBoot项目中快速集成腾讯云短信SDK实现手机验证码功能
大家春节好!我是程序员阿福,今天过年的日子祝大家在新的一年里健康平安、步步高升、虎年大吉大利、财源滚滚! 今天分享一篇简短一点的文章,希望在将来工作中需要的时候能够用得到,如果将来工作中需要实现短信验证码功能时可以打开我的公众号并翻到这篇文章再仔细参考我的实现思路,那么笔者分享这篇文章的用意也就达到了。
用户3587585
2022/03/09
4.6K1
SpringBoot项目中快速集成腾讯云短信SDK实现手机验证码功能
Python项目49-用户验证短信接口(可劲撸)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1.9K0
cat监控实现腾讯云短信告警
CAT(Central Application Tracking),是基于 Java 开发的分布式实时监控系统。CAT在基础存储、高性能通信、大规模在线访问、服务治理、实时监控、容器化及集群智能调度等领域提供业界领先的、统一的解决方案。CAT 目前在美团的产品定位是应用层的统一监控组件。
GavinWang
2020/05/28
10.9K0
Django实战-信息资讯-短信验证码
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/07/18
1.4K0
Django实战-信息资讯-短信验证码
rabbitMq实现系统内的短信发送设计&动态获取BEAN
1.短信非系统的重要节点操作,可以在任务完成之后,比如下单成功,发送下单成功的mq消息,短信服务接收到mq消息, 动态的判断该短信的code,通过全局公共的父类(调用中台等接口获取全部所有需要的对象参数),获取短信中的{mobile}等参数来替换短信模板中的可变量。 这样系统中的所有的发送短信,都可以继承该父类,获取参数,从而实现方便快捷的扩展短信接入和对原来的短信模板内容的修改或新增短信中的可变量。
oktokeep
2024/10/09
1740
rabbitMq实现系统内的短信发送设计&动态获取BEAN
了解短信的实现原理以及验证码短信API
短信作为一种便捷、快速的通信方式,已经在我们的日常生活中得到广泛应用。无论是个人通信、企业沟通还是身份验证等场景,短信都发挥着重要的作用。而实现短信功能的核心是短信实现原理和验证码短信API。
用户10428865
2023/07/11
1.8K0
了解短信的实现原理以及验证码短信API
Django项目第一天
1.在给用户授权的时候,用到了一个%,表示的是任何ip都可以连接这个数据库。换句话说,如果你换了电脑,你也是可以进行连接数据库继续开发的。
小闫同学啊
2019/07/18
7400
发送短信
发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。在下面的代码中我们使用了互亿无线短信平台(该平台为注册用户提供了50条免费短信以及常用开发语言发送短信的demo,可以登录该网站并在用户自服务页面中对短信进行配置)提供的API接口实现了发送短信的服务,当然国内的短信平台很多,读者可以根据自己的需要进行选择(通常会考虑费用预算、短信达到率、使用的难易程度等指标),如果需要在商业项目中使用短信服务建议购买短信平台提供的套餐服务。
用户8442333
2021/05/20
19.4K0
Python项目48-插播短信接口(使劲撸)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1.9K0
Python项目48-插播短信接口(使劲撸)
开源短信项目 platform-sms 发布了新版本 0.5.0
短信服务 platform-sms 0.5.0 发布 ,新的版本做了非常多的优化和改进。
勇哥java实战
2024/03/05
6150
相关推荐
聊聊如何在Java应用中发送短信
更多 >
LV.2
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验