栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

集信达项目总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

集信达项目总结

1.0 大纲 1.1 项目背景

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

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)
    https://nodejs.org/en/download

    1.4.1 项目中用了哪些技术?
      SpringBoot,Nacos,mybaties,mysql,redis
    
1 .5 功能清单

1.6 项目中的几个服务
应用端口说明启动命令
pd-sms-manage8770后台管理服务java -jar pd-sms-manage.jar &
pd-sms-api8771短信接收服务java -jar pd-sms-api.jar &
pd-sms-server8772短信发送服务java -jar pd-sms-server.jar &
pd-sms-entity实体对象
pd-sms-sdk客户端sdk
2.0 api 项目难点 2.1 findByTemplateSignature方法
    
        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的区别

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的对应

2.3 为什么config(通道)与 Template(模板)Signature(签名)是多对多的关系?

因为一个通道所可以选择的模板和签名都可以有多个。

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 自定义注解
  1. 注解分为2种,元注解和自定义注解
    元注解 :一般理解为描述注解的注解。
    自定义注解:除了游戏那的几个固定的描述注解的注解以外,所有的注解都是自定义注解

  2. 四个元注解:@Target @Retention @documented @Inherited

  3. 注解@interface相当于一种记号
    注解本省没有任何功能
    在解析注解的时候可用添加一些功能
    注解的底层是通过反射来实现的

  4. spring oop :面向对象编程将程序抽象成各个层次的对象。
    spring AOP:AOP 是一种变成思想是oop的补充,向切面编程是将程序抽象成各个切面。
    需求条件:多个类中出席那重复的代码,就应该考虑定义一个共同的抽象类,将这些共通的代码抽取的抽象类,将这些共同的代码抽取到抽象类中,这种情况称为纵向抽取。

通知:
@Before 前置通知
@After 后置通知
@AfterReturning 返回通知
@Around 环绕i通知(封装)
@AfterThrawing 异常通知

4.1 反射

反射就是把java 中的各种成分映射成一个Java对象。
我们通过反射可以获得一个类的所有内容。

5.0 项目中redis队列的使用
  1. 发布订阅模式 redis的发布订阅模式 发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis
    客户端可以订阅任意数量的频道。 SUBSCRIBE,用于订阅信道 PUBLISH,向信道发送消息 UNSUBSCRIBE,取消订阅
    用于退订给定的一个或多个频道的信息。 语法: UNSUBSCRIBE channel
  2. 我们为什么不选择这种方式来作为api服务和server服务间的通信
    原因:在分布式环境下,一旦发送者(pub)发送了消息,所有的订阅者能同时接收到消息,如果采用这样的方式
    api服务作为数据的发送者pub,而server服务作为订阅者,存在多个server同时接收到请求的情况,会造成重复发送短信的情况
    这是一种广播的模式,并不适用于我们的系统
  3. 于是我们使用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 SDK

SDK 是 Software Development Kit 的缩写,即软件开发工具包。SDK被开发出来是为了减少程序员工作量的,
比如公司开发出某种软件的某一功能,把它封装成SDK,提供给其他公司和个人使用。
本小节需要开发短信接收服务SDK,通过SDK可以使应用系统更加方便的调用短信接收服务。
通过SDK方式调用短信接收服务,本质上还是调用的短信接收服务提供的HTTP接口(Controller),只不过是调用的过程在SDK中进行了封装。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/342888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号