学习的过程就是接触新事物,然后不断的了解它,了解它的使用场景,每个场景的基本使用方法,每个方法的优化部分,然后了解它的边界条件,知道它的最大负荷下的使用条件。最终,讲这些内容进行总结就是自己学习的内容了。
从2017年的11月上旬到今天2019年12月22日晚,整整两年时间。
前六个月,主要指2017年11月份到2018年5月份这一段时间,学习了java的基本语法、前段基础知识。后端框架内容。通过时候用springframework和mybaties两个框架可以进行增删改查操作,例如餐饮点单结算系统、CRM系统、电商的商品管理系统.
这一个阶段,主要是需要学习如何灵活利用java语言特性,去实现增删改查操作。理解springframework中IOC和AOP框架。如何利用这两个特性帮助我们快速开发应用。其学习的核心内容有以下这些内容:
- spring bean 生命周期及其管理。一个bean对象是如何诞生的。在spring中,我们可以通过配置文件配置bean,bean的新建,可以使用默认的无参构造方法加上属性注入的方式构造对象,也可以通过有参构造方法直接构造出bean对象,还可以通过先构造一个工厂类BeanFactory对象,然后再通过工厂类对象获取对象。bean对象时构造是可以设置成懒加载你的,因为存在这样的场景,在项目启动的时候,并不需要将对象够生成,然后等待程序去获取。而可以变更为当程序需要调用对象时才去new指定的对象。对象的构造可以通过beans配置文件去配置,也可以通过注解Serviice和Component生成。
- Java的基本语法(基础数据类型,逻辑控制语句、类、抽象类、接口、注解)
- spring 的事务管理机制。
- Mybaties 的基本原理和使用方法。
- Mysql 的数据库知识,包括mysql的安装、数据库的创建、数据库表的定义、主键、外键、唯一键、索引、自增键的使用。数据类型的区别。
- SQL的基础知识
- 权限控制的基本逻辑和方法
- 用户口令的创建和维护
- 学会使用eclipse开发基于tomcat的servlet容器应用
以上就是第一阶段的学习,基本上就是学会了如何增删改查、控制权限、完成用户的登录注册这些非常常用的功能。
2018年7月份到2018年8月份,一个人使用了接近一个月的时间开发了基于开源项目bootdo的支付管理系统。我刚到公司的时候,支付系统已经上线了,但是没有后台管理系统,入职后就专门处理这个项目。当时刚刚开始接触springboot项目,由于之前都有接触过,所以基于bootdo项目进行改造时,并没有太大阻力。各种对spring的配置文件都从xml文件转移到了yaml文件中配置,以及通过项目的Configuration注解来配置。主要内容以及涉及到的技术如下:
- 权限整理。支付系统是面向多商户的模式,因此设计到不同的用户登陆的系统。需要将商户和用户进行绑定,同时又需要将系统管理用户进行区分。
- 数据统计的设计和优化。支付系统需要进行时间段的数据汇总和导出。这里才真正开始体会到使用索引的优势。数据统计都是比较费时的操作,系统需要抱枕数据统计出来的更快,就需要更加优化的sql。这里面的优化包括从原来单独分开执行的sql进行梳理后,尽量在同一条sql中执行。
- theamleaf的使用。既然它是一个视图渲染模板引擎,就只需要学习它的标签以及是否有视图缓存。这样既本就可以解决模板渲染问题。
- echars图表。因为需要涉及不实时的首页数据统计。
根据上面这些内容,就可以完成了管理后台的查询功能。以及用户管理、商户的增删功能,不包括商户充值功能。
9月份之后,对系统进行了升级,要完成支付系统的支付路由功能,对三方面进行路由,商户池、IP、金额、时间段、通过四方面进行路由。优先级次序从左往右。系统后天做了相应的功能,数据表采用一对多的形式。同时在这个月里,和多个扫码支付渠道进行对接。主要提升部分是对md5签名、RSA签名和验签、RSA非对称加密与解密、DES对称加密、3DES对称加密,进行了系统的学习。熟悉如何使用java自带的安全组件。
10月份之后,系统引入了代付功能,全部功能由我一人开发。代付功能的开发时不断优化的过程。从最开始的三秒处理时间到最后的三十毫秒的处理时间,经历了三个星期。这三个星期的工作内容主要包括了以下内容:
第一阶段
- 代付核心服务作为独立项目运行。项目初始化,从service层从新写过。
- 结合java的线程安全集合和多线程实现生产者和消费这模型。
- 使用POI工具包实现批量代付功能。
- 这个时候,一直存在一个问题,商户订单是没有问题,但是余额和订单始终对不上,或者刚开始对的上,后来就对不上了。出现消费不足,余额多出的情况。
第二阶段 - 接入多个不同的代付渠道
- 解决余额问题,使用Mysql的自带行级锁特性,结合Innodb的事务管理,保证数据的ACID,防止脏读。实现方法是在事务内使用for update 对商户账户数据进行行锁。每次执行一条。
- 存在的问题:1、使用不同渠道代付时,因为某一个代付渠道的处理速度慢,导致其他渠道的消费一直阻塞。2、由于代付订单都需要对商户账户数据进行锁定,处理时间非常慢,长达三秒。
第三阶段: - 对订单状态进行了修改,从请求三方的代付接口前以及商户余额操作为界线,增加了多个订单状态,使得多个订单可以同时处理,不会阻塞。流程的控制改为使用消息队列加线程池进行处理。
- 同时,引入ActiveMQ消息队列。采用生产者和消费者模型,将订单按照不同的代付渠道分类出不同的生产者,同时定义相应的消费者。多个渠道同时进行,互不干扰。
- 消息确认模式改为手动确认模式。
- 为了防止商户充值时对程序造成干扰,将充值模块也放入了上述流程中。
三个阶段后,代付功能稳定运行。
而后的三个月基本上就是维护工作了。
2019年的开发工作主要是和APP段的对接工作。完成了如下工作:
- 对用户模块进行优化,优化内容包括使用redis管理在线用户,同时使用redis过期功能用户的异常行为进行管理,防止用户恶意刷接口。
- 对接一些第三方的认证服务,人脸、运营商、身份证。
- 对接支付。
- 多用户的权限管理重写
- 独立完成几个小应用的服务端工作。
在这两年的空余时间里,除了上述的内容外学习了python(主要爬虫)、深度学习的一些基本概念、方法以及核心的算法、安卓开发、centos系统下的服务运维管理。看的书籍包括《高性能MySql》、《分布式消息中间件实战》、《apache kafaka 消息队列》、《java 开发手册》、《redis原理和应用 》《鸟叔的私房菜 基础篇》