java项目架构总结

  今年又开始写技术博客了,以后也会定期多写写,这样能让自己的思路更加清晰明了。
  去年一个项目做了一年了,简单点说就是一个用户后台系统,然后配置一个APP和Web页面;包含的技术点是包罗万象,这里主要谈下系统架构的问题。项目刚开始,和做传统的web项目是类似的,按MVC模式一个工程包含了PC Web前端页面,数据模型层,数据库事务层和业务逻辑层,再一个Android工程做App客户端;期间为了解决并发,负载,通讯等问题也引入了Redis,阿里云OSS,Netty等一系列中间件.但项目总体架构还是基本没变,项目前期由我们2个全能战士,客户端服务端一肩挑写出来就上线了,随着项目需求和功能的逐步增多,开发人员也增加了不少,现在已经有10多个开发人员了。
  随着项目越来越大,功能越来越多,架构的问题也就随之来了,每次版本更新都是一个无比繁琐和蛋疼的过程。比如需要优化前端UI了,但web前端和后台项目都在一个工程里,光前端把工程启动起来,就要安装各种开发环境和工具,前后端写在一起之前又没有规范写法,导致前后代码高度的耦合,前端没有一点ajax,js等前后交互开发经验,根据无法去理解和优化前端,最后也只能让前端优化一些 css和图标了;这种架构也不太适合多人协同开发,虽然有svn这种代码异步提交合并机制,但也还是会出现代码间相互覆盖的问题,因为之前也没分得很细,很多功能模块可能就直接一个action一大坨,面对这么一坨庞大的代码,新同事的学习成本也是越来越高;工程编译的时间是越来越长,之前可能启动几秒就启动了,甚至热更新也没任何问题,到后来启动基本是30多秒到一分钟,有时热更新下class类web服务器需要重新编译时,基本就瘫痪了;最要命的就是代码的更新和维护成本,以前更新下代码随便测试OK了,就可以很放心的往服务器上丢了,现在即使是一个小小的改动,不经历内网,公网,样机批量测试个2-3轮,更新上传了觉都睡不好;发布更新的成本就更多了,APP客户端就不说了,几十个APP编译的连电脑都换成服务器配置了,服务器上每次更新一个版本,白天都不敢去动,出了什么更新问题,微信,QQ和电话基本就像打仗一样了,所以每次都熬到半夜才能发布下更新,更新发布到凌晨也是经常的事情了;再就是分支部署的问题,每增加一台独立的服务器,有时候可能就一个数据库不同而已,但基本是所有中间件和工程都要部署一次,更新版本是也一样,更新了还得挨个去测试。
  说了这么多蛋疼的地方,终归还是架构方式不够科学,不过在早期也算是很不错的一套技术架构了,不过随着互联网的发展也越来越不适用了。原因有2个,一个是架构项目耦合度太高,另外一个是架构的设计方式面向的是功能模块,而不是面向的服务。通过拆分项目,比如将web前端拆分独立成一个工程,这样前端专注于页面开发即可,也不用安装后端相关的开发环境和工具了,与后台的交互完全可以通过事先定义的服务接口进行开发;将数据库事务层,业务逻辑层设计成接口,拆分成一个独立的接口服务工程;用于和web前端和后台服务实现端交互;将后台服务实现拆分成独立的工程,用于实现数据事务层,业务逻辑层。用于手机和微信浏览的前端H5页面拆分成独立工程;这样加上手机APP端,原来的2个工程就被拆分成5个工程了,相互之间耦合度大大减低,代码的维护和发布成本都减少了很多。
  工程拆分后,其实就相当于将原来一个独立垂直型的工程变成了一个分布式的工程,不同工程间的调用我们一般采用SOA面向服务的设计方式去做,比如早期企业级的EBS企业总线,一条总线负责调度不同的项目服务,我目前了解过的一些服务框架还有阿里的dubbo框架,Spring cloud等,其中dubbo是基于java Rpc远程调用和zookeeper注册服务中心实现的服务框架,可以看做Spring cloud其中的一个分支点,通过这些服务框架,就可以在这些不同进程里的项目里相互调用,无论是代码的复用还是更新维护成本都方便了很多,比如我们现在再新做的一个项目,很多功能代码基本都是相同的,完全可以复用,而按现有架构的做法就是复制代码到新的工程,那以后更新维护这部分代码,就得在2个工程里操作;通过面向服务架构后也很方便后续问题的定位和分支节点拓展,比如发现服务实现层负载过高,就只加机器部署服务实现项目,而不是整体都部署,对于一些有差异化的分支节点的部署和维护也非常的方便。最方便的就是大家以后开发完全可以相互独立的进行,因为大家面向的都是一个服务接口,而不用关心接口后面的具体实现,事前放一个测试样例数据即可完成开发,后续服务实现完成后替换过来即可,而且发布更新时也不用担心相互影响了,更新什么就只会影响当前的功能。
  目前应该有了基本的架构思路了,也做了一些服务框架的demo,比如dubbo,但为了追求项目开发进度和稳定性,短期内可能还是会用原来的架构去开发,虽然说了很多缺点,但更多的其实就是麻烦和繁琐,稳定性和成熟性上还是没有任何问题的,现代技术之所以日新月异,除了功能创新和性能优化外,很重要的一点也是为了解决我们这些开发人员在开发过程中遇到的各种不便捷和不合理的问题。

猜你喜欢

转载自19841026.iteye.com/blog/2357342