1.2 项目核心随着企业业务扩张、应用成倍的增加、短信规模化使用,传统短信平台的接入方式和单一的信息发送功能,已经不能完全满足现代企业管理的需求,所以统一入口、减少对接成本、同时兼顾多种短信业务、简单易行的操作与维护、高稳定、高可靠的移动信息化应用成为短信平台发展趋势。
1.3 项目架构 1.4 环境要求本项目(集信达短信平台)的核心在于保证短信高效、准确的送达、简单易操作的对接方式。通过对服务的解耦、通讯方式的升级来提升系统的吞吐量。同时在多通道的加持下,通过智能动态的通道评级、选举、降级、热插拔,增强了系统的健壮性,摆脱对单一通道的依赖。并且提供多种对接方式,满足企业内部的各种需求。
-
JDK : 1.8 +
-
Maven: 3.3 +
http://maven.apache.org/download.cgi -
Mysql: 5.7.0 +
https://downloads.mysql.com/archives/community -
Redis: 4.0 +
https://redis.io/downloa -
Nacos: 1.1.4
https://github.com/alibaba/nacos/releases -
Node: 11.3+(集成npm)
1.4.1 项目中用了哪些技术?
https://nodejs.org/en/downloadSpringBoot,Nacos,mybaties,mysql,redis
| 应用 | 端口 | 说明 | 启动命令 |
|---|---|---|---|
| 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 & |
| pd-sms-entity | 实体对象 | ||
| pd-sms-sdk | 客户端sdk |
select c.* from config c left join config_template ct on c.id = ct.config_id left join config_signature cs on c.id = cs.config_id where c.is_active = 1 and c.is_enable = 1 and c.is_delete = 1 and ct.template_id = #{template} and cs.signature_id = #{signature} order by c.level asc
根据传入的模板ID和通道ID和条件未被删除的未被禁用的和正在使用的可用的进行根据config(通道)ID的左外连接查询查出config表的内容,如若为null则代表未找到支持当前签名和模板的通道
2.2 VO、DTO、Entity的区别2.3 为什么config(通道)与 Template(模板)Signature(签名)是多对多的关系?1、entity是实体,会在数据库中存在的实际的表,包括它的每一个字段,entity 里的每一个字段,与数据库相对应,
2、vo 里的每一个字段,是和你前台 html 页面相对应,
3、DTO是凡是要通过网络传输的对象,都当做是DTO对象,dto 这是用来转换从 entity 到 vo,或者从 vo 到 entity
的中间的东西 。(DTO中拥有的字段应该是entity中或者是vo中的一个子集) DTO转化:
DTO为系统与外界交互的模型对象,那么肯定会有一个步骤是将DTO对象转化为BO对象或者是普通的entity对象,让service层去处理。
凡是具有entity实体的都是从数据表到数据库到entity的对应
因为一个通道所可以选择的模板和签名都可以有多个。
3.0 SDK 项目难点 3.1 什么是自动装配@autowired是自动装配的一个注解,如果一个类的属性在容器中存在,就自动装配。
Spring是一个容器,里面保存了你所需要的对象和对象之间的依赖关系。当我们需要对象A时,不用从头开始new,只需要告诉Spring把A给我,Spring就会把对象A给你,即IOC。
属性自动装配后,可以直接拿来用,而不用自己重新new
3.2 Spring Boot自动装配的原理Spring Boot自动装配是怎么实现的呢?
实现的大概步骤
引入spring-boot-autoconfigure依赖
在meta-INF/spring.factories文件中配置需要注入的类,注意key的名字为
org.springframework.boot.autoconfigure.EnableAutoConfiguration
在配置类中往容器中注入starter需要的bean
众所周知,所有的Spring Boot启动类上都有一个@SpringBootApplication注解。@SpringBootApplication是一个复合注解,它包含的其中一个注解为@EnableAutoConfiguration,而@EnableAutoConfiguration会导入AutoConfigurationimportSelector这个类,这个类会加载jar包里面meta-INF/spring.factories配置文件里面填写的配置类,配置类会注册需要的bean到容器中
4.0 自定义注解-
注解分为2种,元注解和自定义注解
元注解 :一般理解为描述注解的注解。
自定义注解:除了游戏那的几个固定的描述注解的注解以外,所有的注解都是自定义注解 -
四个元注解:@Target @Retention @documented @Inherited
-
注解@interface相当于一种记号
注解本省没有任何功能
在解析注解的时候可用添加一些功能
注解的底层是通过反射来实现的 -
spring oop :面向对象编程将程序抽象成各个层次的对象。
spring AOP:AOP 是一种变成思想是oop的补充,向切面编程是将程序抽象成各个切面。
需求条件:多个类中出席那重复的代码,就应该考虑定义一个共同的抽象类,将这些共通的代码抽取的抽象类,将这些共同的代码抽取到抽象类中,这种情况称为纵向抽取。
通知:
@Before 前置通知
@After 后置通知
@AfterReturning 返回通知
@Around 环绕i通知(封装)
@AfterThrawing 异常通知
反射就是把java 中的各种成分映射成一个Java对象。
我们通过反射可以获得一个类的所有内容。
- 发布订阅模式 redis的发布订阅模式 发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis
客户端可以订阅任意数量的频道。 SUBSCRIBE,用于订阅信道 PUBLISH,向信道发送消息 UNSUBSCRIBE,取消订阅
用于退订给定的一个或多个频道的信息。 语法: UNSUBSCRIBE channel - 我们为什么不选择这种方式来作为api服务和server服务间的通信
原因:在分布式环境下,一旦发送者(pub)发送了消息,所有的订阅者能同时接收到消息,如果采用这样的方式
api服务作为数据的发送者pub,而server服务作为订阅者,存在多个server同时接收到请求的情况,会造成重复发送短信的情况
这是一种广播的模式,并不适用于我们的系统 - 于是我们使用lpush、lpop、rpush、rpop、lrange这几组命令 Lpush 命令将数据插入到队列头部 格式:
LPUSH key “数据” Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。 格式:
Rpush key “数据” Lpop 命令用于移除并返回列表的第一个元素 格式:
Lpop key Rpop 命令用于移除列表的最后一个元素,返回值为移除的元素 格式:
RPOP key
Lrange 返回列表中指定区间内的元素,可以指定一个区间以偏移量 START 和 END 指定。
其中 0 表示列表的第一个元素, 1表示列表的第二个元素,以此类推
也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
格式:LRANGE key START END
1. 为什么我们不使用lpush、lpop、rpush、rpop作为我们api服务和server服务通信的模式
原因:在服务的接收方并不知道什么时候会有数据,因为需要通过死循环的方式重复去redis里获取数据,然后判断读取到的==null
这样存在一直空转的情况,会造成资源的浪费,但是对于api服务来说,通过lpush或rpush命令添加数据是没有问题的
2. blpop、brpop:相比于rpop和lpop多了b(b代表blocking)及阻塞的意思 Blpop:移出并获取列表的第一个元素,
如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 格式:相比于lpop我们需要指定超时时间
blpop heima 3 从左侧获取key为heima的数据 如果超过3秒则超时 brpop:移出并获取列表的最后一个元素,
如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 brpop heima 3 从右侧获取key为heima的数据
如果超过3秒则超时
最终我们选择 lpush 、 rpush 、 blpop 、 brpop 这组命令作为我们api服务和server服务之间的数据交互方式
6.0 SDKSDK 是 Software Development Kit 的缩写,即软件开发工具包。SDK被开发出来是为了减少程序员工作量的,
比如公司开发出某种软件的某一功能,把它封装成SDK,提供给其他公司和个人使用。
本小节需要开发短信接收服务SDK,通过SDK可以使应用系统更加方便的调用短信接收服务。
通过SDK方式调用短信接收服务,本质上还是调用的短信接收服务提供的HTTP接口(Controller),只不过是调用的过程在SDK中进行了封装。



