SpringBoot面试题
为什么SpringBoot的 jar可以直接运行?
详细参见:SpringBoot的 jar可以直接运行。
SpringBoot自动装配过程及实现原理?
SpringBoot如何防止表单重复提交?
幂等性,通俗的说就是一个接口,多次发起同一个请求,必须保证操作只能执行一次。
需要幂等性的场景:
- 订单接口,不能多次创建订单
- 支付接口,重复支付同一笔订单只能扣一次钱
- 支付宝回调接口,可能会多次回调,必须处理重复回调
- 普通表单提交接口,因为网络超时、卡顿等原因多次点击提交,只能成功一次等等
常见的方案:
从数据库方面考虑,数据设计的时候,如果有唯一性,考虑建立唯一索引
从应用层面考虑,首先判断是单机服务还是分布式服务
- 单机服务:考虑一些缓存Cache,利用缓存,来保证数据的重复提交
- 分布式服务:考虑将用户的信息,例如token和请求的url进行组装在一起形成令牌,存储到缓存中,例如redis,并设置超时时间为**秒,如此来保证数据的唯一性(利用了redis的分布式锁)
解决方案大致总结如下:
- 唯一索引:防止新增脏数据
- token机制:防止页面重复提交,实现接口的幂等性校验
- 分布式锁:redis(jredis、redisson)或zookeeper实现
- 悲观锁:获取数据的时候加锁(锁表或锁行)
- 乐观锁:基于版本号version实现,在更新数据那一刻校验数据
- 状态机:状态变更,更新数据时判断状态
其中,前三种最为常见,更多内容可以参考:SpringBoot/Web项目防止表单/请求重复提交(单体和分布式)
如何自己写一个SpringBoot Starter?
参见:手把手教你写一个 Starter。