开源系统推荐短信网关

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 开源系统推荐短信网关

前言

文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…

种一棵树最好的时间是十年前,其次是现在

Tips

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

短信网关

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

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

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等)。

真正发送流程

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

image.png

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

异步通道降级选举

再真正下发短信的流程中

image.png

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

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

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

image.png

里面呢?有2个核心逻辑

  • 降级
  • 选举

异步通道选举流程

image.png

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

listForNewConnect 选择策略

* 通道选举,选举策略:
* 1、剔除掉第一级通道
* 2、查询最近一小时内通道发送短信数量,按数量排序通道
* 3、如果最近一小时没有发送短信,按最后发送成功排序

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

结束

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

相关文章
|
4月前
|
数据采集 人工智能 BI
MyEMS能源管理系统后台配置-网关管理
MyEMS开源能源管理系统支持建筑、工厂等场景的电、水、气数据采集与分析,具备光伏、储能、充电桩等扩展功能。本文介绍系统后台配置中的网关管理模块,包括查看、添加、编辑、删除、导入、导出及克隆网关的操作步骤,帮助用户高效管理能源数据采集设备。
62 0
|
3月前
|
数据采集 人工智能 监控
MyEMS 开源能源管理系统后台配置指南 —— 网关管理模块详解
开源能源管控系统面向建筑、工厂等场景的开源能源管理系统,支持电、水、气等数据采集与智能分析,并提供光伏监控、储能管理等功能模块。系统具备完善的网关管理功能,包括网关查看、添加、编辑、删除及批量操作,助力用户高效实现全链路能源管理。
175 1
|
5月前
|
人工智能 API 开发者
狂揽7.5k星!这款开源API网关彻底解放开发者:一键聚合GPT-4、Suno、Midjourney,还能在线充值!
New API 是一款基于 One API 二次开发的 AI 模型接口管理与分发系统,支持多种大模型(如 GPT-4、Suno、Midjourney 等)统一封装为 OpenAI 格式接口调用。其核心功能包括多模型统一网关、企业级权限管控、“推理力度”分级、无魔法访问全球 AI 服务、灵活计费体系及开发者友好设计。技术架构采用 Golang + Gin 框架,支持高并发低延迟,适用于企业内部 AI 中台、多模型 SaaS 平台、学术研究协作及个人开发者工具等场景。项目开源地址:https://github.com/kingbug/new-api。
1313 6
|
7月前
|
Kubernetes Cloud Native 开发者
alibaba-load-balancer-controller v1.2.0:开启云原生网关开源新篇章!敬请探索!
alibaba-load-balancer-controller v1.2.0:开启云原生网关开源新篇章!敬请探索!
203 61
|
4月前
|
数据采集 边缘计算 JSON
MyEMS开源能源管理系统4G网关EG200
MyEMS是一款基于Python的开源能源管理系统,支持工厂、建筑等场景的能源数据采集与分析,具备设备管理、故障诊断等功能,助力碳中和目标。其EG200 4G网关支持全网通4G LTE,兼容Modbus RTU协议,提供RS232/RS485接口,可采集100+数据点,支持MQTT通信与边缘计算功能,配合MyEMS系统实现云边端协同,适用于电表、水表等数据采集场景。网关工作温度范围广(-35℃~75℃),支持远程参数配置与线性换算,需搭配MyEMS MQTT软件使用。
144 0
|
XML JSON 前端开发
基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(支持并行网关)
基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(支持并行网关)
940 3
|
人工智能 缓存 安全
什么是AI网关?AI网关在企业系统中承担什么角色?
AI大模型的快速发展正推动各行业增长,预计未来十年年均增长率达37.3%,2027年前全球企业在AI领域的投资将达8000亿美元。这促使企业进行战略转型,调整AI应用构建与保护方式。为应对AI创新需求,AI网关概念应运而生,它帮助企业随时随地控制和管理应用流量,提供更高的安全性。AI网关不仅支持多AI模型集成,还提供统一端点、应用程序配置与部署、安全与访问管理等核心功能。面对未来挑战,AI网关需支持模型故障转移、语义缓存等功能,确保AI应用的可靠性和效率。开源项目APIPark.COM为企业提供了一站式AI网关解决方案,简化大型语言模型的调用过程,保障企业数据安全。
624 1
|
前端开发 关系型数据库 MySQL
ThingsGateway:一款基于.NET8开源的跨平台高性能边缘采集网关
ThingsGateway:一款基于.NET8开源的跨平台高性能边缘采集网关
311 2
|
监控 Cloud Native 容灾
核心系统转型问题之API网关在云原生分布式核心系统中的功能如何解决
核心系统转型问题之API网关在云原生分布式核心系统中的功能如何解决
|
Kubernetes Cloud Native 开发者
阿里云网络发布 alibaba-load-balancer-controller v1.2.0:开启云原生网关开源新篇章!敬请探索!
**阿里云发布开源版ALB控制器v1.2.0,对齐商业版ALB Ingress Controller v2.10.0。新版本增强了功能特性,提升了用户体验,并提供了最佳实践。功能更新包括自定义标签、QUIC协议支持、转发规则和安全策略等。此外,还引入了ReadinessGate实现滚动升级时的平滑上线和Prestop钩子确保平滑下线。用户可从GitHub获取开源代码,通过Docker Hub拉取镜像,开始使用alibaba-load-balancer-controller v1.2.0。**
652 3
阿里云网络发布 alibaba-load-balancer-controller v1.2.0:开启云原生网关开源新篇章!敬请探索!