Java中大型系统常见架构
前段时间,有个从别的行业转到业务系统开发的同事,向我咨询如何设计一个基于Java Web的中大型业务系统,因为我的经验是Java底层的中间件的开发,一时有点语塞,但是我们的客户和同事先前都是业务系统开发出身,所以汇总了一下思路,产出架构草图给这个同事解急,虽然是常规套路,在网上找相关资料还是比较零散,所以贴出来给需要的人吧。
1. 基本架构
1.1 架构概述
常见业务系统实现采用SpringMVC + Mybatis + Mysql/Oracle的方式实现,在遇到并发用户请求压力的情况下,通过水平扩展提升性能,业务系统基于的Web 容器(Tomcat)采用多个并发实例来处理业务请求,这个时候前端需要采用负载均衡器来分发Web请求到各个Web容器上的应用,这样每个Web容器上的Http请求的压力被分散掉,但是为了保证高可用性,即一旦某个Web容器Crack掉,其对应的业务请求能够在其他容器继续处理,需要将其Session信息缓存到Redis集群中进行保存,从而支持高可用性,另外Redis集群是个高速内存缓存,可以从数据库加载常见需要并发读取的信息(读多写少,如配置信息),从而提升并行请求处理的性能,在一定程度降低数据库IO的压力。
数据库后端为了应对并发业务压力,也是采用分库分表分区的方式,将不同的业务单元拆分到不同的数据库,统一业务单元内部拆分到不同的表或者同一表拆分到不同的分区上去。
这个可以根据业务系统的压力,决定拆分的力度粗细。也就是通过数据库的水平扩展提升处理性能。
1.2 部署结构
1.3 Web App实现
Web App采用常规的SpringMVC + Mybatis + Mysql/Oracle的方式实现,访问数据库的操作被封装在Service + Dao这一层,业务逻辑在Controller层实现.
2. 架构优化
2.1 Service层隔离
将Service层和业务系统的展示层(控制台)分开,以Rest Service的访问系统的数据库和其他业务服务,如果能直接一步到位做到这一层最好,这样以后如果需要和其他系统做集成,以API的形式公开这一层很方便,另外以Rest Service的方式分离展示和服务层,也有利于以后业务扩展和提升并发处理能力。

2.2 数据库层
传统的关系数据库的集群和高可用性的性能通常一般,MySQL采用主备的方案保证数据高可用性,通过分库分表来提升并行处理性能,通过读写分离,提升并发读取性能。因为分库分表,如果业务涉及到跨库查询就相对比较麻烦,需要自己处理或者使用MyCat这种分库分表的框架。
3. 微服务化
系统规模进一步,可以考虑微服务化,可以考虑Spring Cloud这种复杂框架。
浙公网安备 33010602011771号