项目总结

  1. 设计选择分布式架构,选用了dubbo+zookeeper,使用了spring、spring boot、springMVC,数据库选用MySQL,数据库相关的组件选用了mybatis、druid。

  2. 关于异常处理

    1. 为了更好地处理对系统进行监控,创建了全局异常捕获机制,对异常进行处理,返回用户相对友好的提示信息
    2. 使用log4j、logbck进行日志处理、打印,分级别进行打印,其中ERROR日志,增加邮件发送功能,将异常发送给专门人员,对异常进行监控
    3. 编写AOP,采用环绕通知,将信息进行日志打印,关键信息进行数据库存储
  3. 系统文档、测试

    1. 使用swagger进行项目扫描,通过单元测试,生成swagger pdf文档,用于接口对接;
    2. 另外,swagger提供了在线的文档,已经对接测试接口
  4. 账户系统

    1. 单独创建统一账户系统,用于多项目账户统一处理,也便于后期其它系统接入
    2. 账户系统前期:模拟oauth2.0搭建,使用aop+ThreadLocal+注解进行编写
      1. 通过反射机制,编写统一的处理方法
      2. aop切面+自定义注解,对被标注的方法进行aop环绕通知,获取方法的相关数据(eg.注册、登录、登出等),对数据进行相应的处理,另外使用ThreadLocal对数据进行临时处理,其中这里遇到了ThreadLocal因为tomcat线程池复用导致线程不安全情况的发生(season:需要学习下springMVC如何处理)
    3. 账户系统后期:采用spring自带的oauth2.0框架,进行重构
  5. 项目遇到的问题

    1. 项目使用dubbo,provider获取ip,将信息注册到zookeeper中时,因为获取的ip是本地的,无法被consumer访问到,解决方案是将可被consumer访问到的ip写入配置文件
    2. 项目遇到数据库查询慢的情况,经排查,发现是获取mysql查询count执行的时间过长导致问题发生,解决方案是,放弃框架生成sql语句,而是单独写count语句,在xml中华编写采用以"_COUNT"结尾的同名id
    3. 在一个请求中需要查询多次数据库,因为是串行,导致系统响应过慢,解决方案是,采用多线程方法,并行查询数据
    4. 有同事,对于请求的列表数据,进入数据库进行遍历查询,导致系统响应过慢,解决方案有多种:
      1. 使用java8 ParallelStream,并发遍历查询数据库,降低系统响应时间
      2. 将列表中的数据通过mybatis标签全部查出,放入HashMap中,然后编列列表,通过列表数据的id从hashmap获取对应的数据,因为从HashMap中获取数据时间复杂度低,系统效率得到了提高,最终选用这个方法
    5. 项目中遇到了数据时效性差,变化缓慢,但是需要复杂sql查询的数据,选用@Cacheable注解,对数据进行缓存,项目要求全字段进行排序,而缓存在redis中的数据无法进行自定义排序,使用泛型编写排序、分页工具类,用于排序分页,对于这个工具类还是比较满意的,提高了系统的运行速度。另外通过java进行计算总计数据,能够减少MySQL的压力
    6. 项目存在并发问题,为了线程安全可以加锁,但是对于分布式项目来说,加锁只能解决单项目的并发,但是多个项目同时处理一个数据,依旧会造成线程不安全的情况发生,于是选了加Redis锁的方案处理分布式下的并发问题。编写lua脚本,充分利用redis单线程的特性。另外可以使用zookeeper编写线程锁,但是因为系统的zookeeper部署的是伪集群未采用zookeeper锁,因为zookeeper的更好?(season:查询一下为什么)
    7. 项目模块多个,减少开发人员电脑负担,使用同一个zookeeper,通过修改某一模块的com.alibaba.dubbo.config.annotation.Service的version进行区分开发人员,不出现数据乱跑的情况
    8. 系统中的基础数据,全部存储在redis中,在dao与service中间增加redis层,新增时,只增加在mysql中,查询时,先查询redis,redis没有则从mysql查询,并且更新redis,修改数据时,先删除redis数据,然后更新mysql数据
    9. 为方便代码开发,增加了使用freemarker生成代码的小项目,减少开发的时间、工作量
    10. 项目使用jenkins进行自动化部署
    11. season:增加策略模式,增加设计模式的引入
  6. 项目介绍

  7. 其他项目遇到的问题

    1. 寻找了贴牌商,开发了智能手表,只能手表推送实时数据,存在数据变化大的情况,不便于数据分析,采取方案是:将数据存储在redis中,编写定时任务进行处理,将数据存入数据库中,减少对mysql的数据访问
  8. etc

  9. 个人总结

    1. 项目从开发到验收,全程跟踪,但是因为固有的局限性,有许多不足的地方
    2. 这是第一个自己搭建框架+设计的项目,还是比较喜欢的,项目正在平稳运行中
posted @ 2022-02-19 13:02  season-qd  阅读(75)  评论(0编辑  收藏  举报