编程语言
首页 > 编程语言> > 从0-1 的java 后端工程项目设计及其反思

从0-1 的java 后端工程项目设计及其反思

作者:互联网

工程项目分层架构回顾

 项目启动前的模块划分设计

 

项目实践后,相关的模块划分还是相对比较合理的,但有些细化和优化,通过idea 的模块依赖图,生成的组件依赖图为

举例其 实现细节处,如 assignmentImpl,classroomimpl,userimpl 模块        

 

 

 

自动生成的依赖图,可能显得不是很明显, 在之前没有预想到的,是 baseconstants 这块,这块有些内容校验和安全校验的基本接口,和基本 enum ,action 变量, 因为把内容校验,合理性校验,前置到 DTO层,这样的话,对于前端来的内容就可以统一控制。

通过业务模块,划分模块的方式还是相对合理,如果后面模块拓展,单独拆成微服务也就是很快的事情,因为前期已经做了代码隔离。

 

 

 

项目中可待优化点思考

 

  1.  关于 外部信息注入的思考,这里的外部信息 指的是通过 cookie 或者 header 带过来的用户注册信息, 比如说用户信息吧 ,之前 抽象出 LoginInfoHolder ,并且把依赖下沉到底层依赖,这样的话, 各个模块需要当前用户信息的时候就可以简单注入当前的用户信息。 用户信息拦截在 前端流量接入层,也就是web controller 层,加interceptor 来进行拦截,并将用户或者其他信息 注入 LoginInfoHolder. 后来思考了一下, 如果 不把 这个LoginInfoHolder 放到底层依赖,只放到前端流量接入层,也就是 web controller 层,这样的话,每次从 controller 层 到 业务 buiness service层,需要传递用户 参数, 但是这样的好处是,能给我们的单测接口带来极大的便利, 因为单测的时候,我们可以通过业务接口调用,来模拟网络层的接入,而且信息完备, 不用费力模拟 cookie 和 header 带的一些加密信息, 虽然看起来 业务 buiness 层,好像每个方法都需要传递当前用户参数 uid ,好像是麻烦了一些,但是 数据流的流向却变得很清晰(相当于不要全局数据当前访问用户信息这个概念),易于模拟和测试。这个理念可以在后期 实现的时候进行优化思考 实施。

       照着1中的实施的话,为保证完善,可以先通过大服务接口的单元测试,就能测出较多的明显幼稚的问题。

   

      2.  列表的查询,没有用到缓存优化, 当qps大的时候,单查数据库带来很大的压力。而且作业,班级列表,这两块大部分时候可能变化不大, 在业务列表的 Cache使用这块, 可以考虑用一个 统一的标志 方式(声明式的方式) 声明特定的返回结构,重点在于,列表可缓存不容易遗忘的方式,在列表内容改变的时候,又要注意能及时删除缓存,不会造成缓存污染,这其中的代码实现方式还需要思索一下,最好能进行 强约束,用隐藏式约束,在团队配合的情况下,总会有人没有思考到缓存过期,失效的问题,所以这就要求设计者,做出强制性要求的设计,而不只是字面或者口头约束,要让缓存真正成为利器,而不只是辅助。在首页或者调用量大的地方,缓存的使用很有必要,不然导致db压力激增。

      3. 权限校验前置的思考也是较为合理的,内容安全,和参数合理性校验前置比较合适,前置到 web 接入层,利用好aop的能力

      4.  关于删除操作,要删除关联的数据思考,防止没有完全数据的删除,也就是删除欠缺。

      5. 微服务 可以通过路径,子路径来区分 微服务里面的微服务,完全服务gateway 的predicate

     

 

项目中的坑点和解决分析

  1. 前端的跨域问题, 刚开始往 网关去查 发现 gateway 没有流量进入,这时候就应该怀疑是 LB层(nginx) 自行处理了 跨域问题,去 nginx 配置文件一查,果然就是,解决。
  2.  跨域允许header 也需要单独配置,需要注意。如果nginx 处理了跨域,就不用在 api网关层或者微服务层去允许跨域了。
  3. 外部依赖调用的时候,要注意 超时问题, 不能默认三方依赖服务稳定,要处理好异常状态。 例如 腾讯的内容校验接口, 当图片大小较大,安全校验时长就很长,这时候多张图片统一校验的时长就不可接受,就要考虑内容校验时机,应该考虑的是

       分而治之的策略,把调用时机分摊到每张图片上传的时候,如果校验失败,告知前端,校验失败,前端不会显,这样不会给用户用时很久的感觉,也能带来较好体验,因为用户当即能知道哪个图片内容违规

    4.  不要乱删账号,删了测试账号,没有删除关联关系的时候,后面又要花些没有必要的时间去排查异常,这些异常还是自己不合规操作造成的。

    

    

  

 

 

标签:缓存,java,跨域,校验,信息,用户,工程项目,模块,反思
来源: https://blog.csdn.net/dongjijiaoxiangqu/article/details/113259274