一、项目背景
消息类型
通知类(开播了)、营销类(大促商品)、验证码类、警告类(系统挂了)
下发渠道
短信、邮件、微信小程序、公众号、企业微信等等
二、项目架构
三、技术栈
中间件
核心技术
Maven项目管理工具、依赖包管理工具
SpringBoot 约定大于配置、各种starter方便接入中间件、组件
Mysql 关系型数据库,存储模板、短信发送记录等信息
SpringData JPA orm框架
XXL-JOB 分布式定时任务框架 刷新token、下发短信指定时间的消息、次日发送消息
Kafka 消息队列:消峰、异步、解耦、下发日志、接入层和逻辑层的解耦
Redis 缓存:存储Token、业务去重
Apoollo 分布式配置中心 限流值、流量配置值、账号信息
Flink 实时计算引擎:清洗日志
Graylog 分布式日志框架:业务监控、日志检索
prometheus(普罗米修斯)+Grafna 系统监控
docker+docker-compose 方便搭建部署环境
四、项目模块
common 枚举、公共类等
API 接入层接口
APIImpl 接入层接口实现(和API区分开的原因是 后续接入RPC远程调用。业务方不关心业务实现,减少接入方的依赖项)
support 中间件的接入(大Util包)
stream flink的实时清洗
cron 定时任务逻辑
handler 逻辑层
web 后台管理接口
项目分模块的原因
1、职责分明 为了以后扩展和部署。2、模块管理 可针对某个模块,编译、测试、打包等。3、代码复用 将不同模块在不同机器上部署,他们所依赖的common包、support包可以通过jar方式引入
五、工具开发包
日常开发中需要用到许多Utils 自己写的往往没有一些开源包好用,国外:guava和common(apache) 国内:Hutool(糊涂)
我自己常用common的包 比如集合判空 字符创判空等等。json字符处理理 常用的是 fastjson
六、接入Java日志框架
日志,可以记录时间、位置、并持久化
Java日志框架:log4j、logback、log4j2等等
这么多的日志框架实现都有自己的api接口
slf4j 可以分别适配这些日志框架实现,从而代用api
在输出日志时 使用lombok的@Slf4j注解 直接使用log.info打印信息
在资源文件添加logback.xml来配置日志信息
七、短信的发送
我方平台 对接 短信服务商(阿里、腾信)
要做的工作:签名(安全验证)、短信模板的维护模板、调用发送短信api)
【注】:对接第三方时,一般使用其提供的sdk(不用发送http请求),鉴权复杂。
短信服务商会对接联通、移动等等发送短信
MySQL和SpringData JPA
开源好用、低成本快速插入、国内公司大部分数据库使用的MySQL
java链接MySQL的方式
DButil、Hibernate、Spring JDBC、MyBatis、SpringData JPA他们都是通过jdbc实现的
工作上用的更多的是使用MyBatis,SpringData JPA 适合单表操作
文章地址:https://gitee.com/zhongfucheng/austin