接口开发时注意点:
1、 从接口获取数据时,需要注意数据模型的定义
为了便于开发,避免数据混淆,需要注意分层模型规范
DO(Data Object): 与数据库表接口一一对应,通过DAO层向上级传输数据源对象
DTO(Data Transfer Object): 数据传输对象,Service或Manager向外界传输对象
BO(Business Object): 业务对象,由Service层输出的封装业务逻辑的对象
AO(Application Object): 在web层和service层之间抽象的复用对象模型,极为贴近展示层,复用度不高
VO(View Object): 显示层对象,通常是web向模板渲染引擎层传输的对象
POJO(Plain Ordinary Java Object):在阿里java开发手册中,POJO专指只有setter/getter/String的简单类,包括DO/DTO/BO/VO等。也就是说只要这些类一旦内部除了参数只由setter/getter/String方法时,都认为是POJO类
Query:数据查询对象,各层接受上层的查询请求。注意超过2个参数的查询需要封装,而且禁止使用MAP类进行传输
2、目前接触的代码层级是del(数据库操作)–manager(通用业务处理层)–core(ioc容器,定义网络层)–biz层(接口业务实现类)–service层(接口)
按照项目模块结构,从低到高:
del模块
提供数据库增删查改方法
不依赖其他模块
数据库表models类名以DO结尾
每一个SQL的前面都需要加上块注释
manager模块
提供业务封装、异常处理
依赖del模块
业务models类名以DTO结尾
service模块
组装业务实现,事务控制,所有异常捕获和处理
依赖manager模块
web模块
https协议接口处理入口,配置集中管理,所有单元测试
依赖service模块
common模块
公共工具类模块
3、要多注意注解。实际开发过程中使用注解较多,便于减少代码的重复编写
4、数据库查询语句一定一定一定要使用关键词来缩小搜索范围,一般格式是"WHERE 列 运算符 值",而且切记如果搜索表中的某某信息,能按照日期–自定义范围的最好,通过日期删选一大部分,再通过自定义范围进一步收缩范围。这样能够大幅度减少搜索耗时
5、注意使用@Test来进行测试,需要列举可能的传参等来尝试测试
6、拿到接口开发时,需要按照自己理解的含义将需求重新写一遍,对照后没有问题再列出自己开发所需要的表、入参出参、开发逻辑(所影响的module,以及业务层级的递进逻辑)、疑问点一一列举出来。随后进行二次确认以及疑问问答。
7、开发时千万不要立刻开始写,需要将接口底层功能进行拆分,底层方法无非是增删查改的组合,除非是特定操作不单独写数据库语句会很耗时,否则尽量使用基础增删查改语句
8、数据库操作后千万记得一定要将更新后的数据刷新Redis,避免一直获取脏数据
9、开发时切记,相应的类中只能写对应的方法。例如manager模块是组合控制数据库以及Redis数据的,那么接口在这一层的时候只做相关操作,而具体数据判别,需要在service模块进行操作
10、接口入参Dubbo接口类型的话是可以入参为一个list的,但是如果这个list里面每一项都有相同值的几个参数,那么完全可以吧不同参数给抽取出来单独做个bo,然后请求DTO对象里放一个该BO的list对象。用这个对象来请求接口。
11、接口开发时需要考虑正向场景(成功),黑名单拦截,以及异常场景/系统异常/超时场景/并发测试
12、需要调用其他module的业务放biz层
13、如果需要调用多个biz的话,那么尽可能的整合在一个biz类中,保证service层中一个类最好只调用一个biz
14、编写接口的时候需要注意,如果需要返回前端修改/更新/插入/删除数据成功失败时,最好带上每个操作的状态、错误信息、错误code。这样可以让前端不仅知道更新状态,同时还可以得知更新失败的原因,便于修正
15、项目中使用分布式作业框架elastic-job时,切记elastic-job配置分三个层级,分别是core,type,root。每个层级使用相似与装饰者模式的方式装配
Elastic-Job-Lite采用无中心化设计,如果每个客户端的配置都不一样,不做任何控制的话,最后一个启动的客户端配置将会成为注册中心的最终配置
Elastic-Job-Lite提出了overwrite概念,可以通过JobConfiguratuon或者Spring命名空间配置。overwrite=true表示允许客户端配置覆盖注册中心,反之则不允许。如果注册中心没有相关配置,那么无论overwrite是否配置,都会吧客户端配置写入注册中心
core对应JobCoreConfiguration,用于提供作业核心配置信息,例如作业名称,分片总数,cron表达式等
corn表达式:从左到右(用空格隔开)分别是:秒 分 时 日期 月份 周几 年份
秒:允许值为0~59的整数 允许的特殊字符:, - * /
分:允许值为0~59的整数 允许的特殊字符:, - * /
小时:允许值为0~23的整数 允许的特殊字符:, - * /
日期:允许值为1~31的整数(考虑月份) 允许的特殊字符:, - * / ? L W C
月份:允许值为1~12的整数 允许的特殊字符:, - * /
星期:允许值为1~7的整数 允许的特殊字符:, - * / ? L C #
年分:允许值为1970~2099,可选,可以留空 允许的特殊字符:, - * /
*:表示匹配该域的任意值,加入在分使用*,那么表示每分钟都会进行触发事件
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!切记:用*会导致不停的触发事件,如果放在秒作用域,会每秒都触发!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
?:只能在日期以及星期这两个域,也能匹配域内的人一直,但是实际不会,因为日期和星期是互相影响的。
比如,想每月20号触发,不管20号洲际,只能写成 1 1 1 20 * ? (每20号的1时1分1秒触发事件)。最后一位只能用?,而不能使用*,如果想要*表示不管周几都能触发,但是实际上并没有这样的效果
-:表示范围,比如在分钟使用1-20,那么表示1-20分钟内每分钟都触发一次
/:表示起始时间开始触发,然后每隔固定时间触发一次。比如在分钟域使用3/20,表示3分钟的时候触发一次,然后就是23分钟和43分钟各触发一次(3+20 , 3+20+20)
,:表示列出枚举值,比如在分钟域使用 3,30,表示在3分钟以及30分钟各触发一次
L:表示最后,只能在星期和日期两个域使用,如果在星期域使用5L,那么表示每个月最后一个周五触发
W:表示有效工作日(周一到周五),只能在日期域出现,系统将在离指定日期最近的有效工作日触发事件。比如日期域使用5W,如果5号是周六,就会在最近的工作日:星期五,也就是4号进行触发。如果5号是周日,那么就会在6号(周一)触发,如果5号是在周一到周五中的一天,那么就会在5号触发。
注意!!!W的寻找不会跨月份!!!
LW:L与W可以连用,表示在月中最后一个工作日,比如5LW,表示最后每个月最后一个周五触发
#:用于确定每个月的第几个星期几,只能在星期域出现,比如2#3,表示每个月第二周的第三天
type对应JobTypeConfiguration,分别由三个子类,对应SIMPLE,DATAFLOW,SCRIPT类型作业,提供三种作业需要不同的配置
Root对应JobRootConfiguration,由两个子类分别对应lite,cloud部署类型
Elastic-Job属性详细说明:
id:作业名称
class:作业实现类,需要实现ELasticJob接口,脚本型作业不需要配置
registry-center-ref:注册中心bean的引用,需要引用reg:zookeeper的声明
cron:cron的表达式,用于配置作业触发时间
sharding-total-count:作业分片总数
sharding-item-paramsters:分片序列号和参数用等号分割,多个键值对用逗号分隔,分片序号从0开始,不可大于或等于作业分片总数,如0=a,1=b,2=c等
job-paramrter:作业自定义参数,可配置多个相同的作业,但是用不同的参数作为不同的调度实例
monitor-execution:监控作业运行时状态。
每次作业执行时间和间隔时间均非常短的情况,建议不监控作业运行时状态以提升效率,因为是瞬时状态,所以无必要监控。请用户自行增长数据堆积监控,
并且不能保证数据重复的选取,应在作业中实现幂等性。每次作业执行时间和间隔时间均较长的情况,建议监控作业运行时的状态,可以保证数据不会重复选取
monitor-port:作业监控端口
建议配置作业监控端口,方便开发者dump作业信息
使用方法是echo "dump" |nc 127.0.0.1.9888
max-time-diff-seconds:最大允许的本机与注册中心的时间误差秒数。如果时间误差超过配置秒数,则作业启动讲抛出异常,配置为-1表示不校验时间误差
failover:是否开启失效转移,仅仅monitorException开启,失效转移才有效
misfire:是否开启错过任务重新执行
job-sharding-stratrgy-class:作业分片策略实现类全路径
description:作业描述信息
disabled:作业是否禁止启动。可用于部署作业的时候,先禁止启动后,部署结束后统一启动
overwrite:本地配置是否可覆盖注册中心配置。如果可以覆盖,每次启动作业都以本地配置为准
注意,运行时候需要使用zookeeper注册中心,同时读取相关配置。但是如果没有,却要测试的话,可以尝试在spring-task.xml对应的注册项中进行配置
示例:
等到配置到注册中心时,则spring-task.xml内的配置则是这样:
ZookeeperConfiguration属性详细说明:
serverLists:连接Zookeeper服务器列表,包含IP地址和端口号,多个地址用逗号分隔,如:host1:2181,host2:2181
namespace:zookeeper的命名控件
baseSleepTimeMilliseconds:等待重试的间隔时间的初始值,单位:毫秒
maxSleepTimeMilliseconds:等待重试的间隔时间的最大值,单位:毫秒
digest:连接zookeeper的权限令牌,缺省为不需要权限验证
注意!!!使用3.3.6的zookeeper,在使用Curator 2.10.0的CuratorTransactionFinal的commit时,会导致死锁!!!
为了保证作业在分布式场景下的一致性,一旦作业与注册中心无法通信,那么运行中的作业会立刻停止执行,但是作业的进程不会退出。这样就可以防止作业重分片的时候,把和注册中心失去联系的节点执行的分片分配给另外的节点,导致同一分片在两个节点中同时执行。等到作业节点恢复与注册中心的联系时,将会重新参与分片,并且恢复执行新的分配到的分片
作业在首次运行时将自动添加。Elasti-Jon-Lite将以jar的方式启动,并无作业分发功能。如果需要完全通过运维平台发布作业,需要使用Elastic-Job-Cloud