• 欢迎访问 winrains 的个人网站!
  • 本网站主要从互联网整理和收集了与Java、网络安全、Linux等技术相关的文章,供学习和研究使用。如有侵权,请留言告知,谢谢!

Java开发技术规范

Java技术 winrains 7个月前 (02-13) 62次浏览

1 引言

1.1 编写目的

为统一公司Java开发环境、技术选型和开发框架,特编写本规范。

本规范定义了Java项目开发中应遵守的技术指南,作为各项目组的开发指导性指南和代码审查的依据。

1.2 范围

本规范规定了使用Java语言进行开发过程中所需要遵守的技术规范。

本规范适用于所有使用Java语言开发的项目,本公司所有采用Java语言开发的项目必须符合本规范的规定。

2 技术选型规范

项目开发所涉及的技术选型如表 1所示。

表 1 技术选型

类别 名称 版本 说明
核心框架 Spring Boot 2.1
Session管理 Spring Session 2.1 用于分布式系统或集群中的session同步
安全框架 Apache Shiro 1.4 用于控制接口的访问权限
持久层 Mybatis 3.5
持续集成 Jenkins 2.176 用来系统发布和部署
数据库 MySQL 5.7.27/8.0
SQLite 3.31
MongoDB 4.2.3 非关系型数据库
数据缓存 Redis 5.0
反向代理 Apache 2.4 用于系统集群
数据库连接池 Druid 1.1.20
参数校验 Hibernate Validator 6.0 用于后台参数校验
日志组件 logback 1.3 记录系统日志
Java标准 JDK 1.8
模板(后端) velocity 2.1
模板(前端) thymeleaf 3.0 生成视图
项目管理 Maven 3.6
版本控制 SVN 4.0.2
开发工具 Eclipse 4.12以上
Intellij IDEA 2019.1以上

2.1 开发工具

采用Eclipse作为开发工具。鉴于Intellij IDEA趋于主流,且较Eclipse功能更强大,鼓励在日常工作中学习Intellij IDEA,后续会逐步迁移到该开发工具。

2.2 Java标准

开发所采用的JDK版本为1.8。

2.3 版本控制

源码及文档采用SVN统一集中管理。

2.4 项目管理

采用Maven作为项目管理工具,并在公司内网采用Nexus搭建私服库。

2.5 开发框架

Spring Boot在项目搭建、配置管理、快速开发方面都比SSM有较大优势,本规范采用Spring Boot 2.x作为产品开发的框架。

2.6 安全框架

采用Apache Shiro作为系统开发的安全框架,它是一个功能强大且灵活的开源安全框架,主要功能包括用户认证、授权、会话管理以及加密。Apache Shiro在易用性上比Spring Security好。

2.7 数据库

关系型数据库主要采用MySQL 5.7.27,后续会逐步迁移到5.8版本。基于项目需求,亦可选用SQLite。非关系型数据库采用MongoDB。

2.8 数据库连接池

采用Druid作为数据库连接池,它在功能、性能、扩展性方面,比其它数据库连接池有一定优势。

2.9 会话管理

采用Spring Session 作为会话管理工具,它用于解决分布式环境下(集群或热备)Session同步问题,它提供了一组API和实现,用于管理用户的session信息。

2.10 持久层框架

采用MyBatis作为持久层框架,它支持定制化 SQL、存储过程以及高级映射。

2.11 持续集成

采用Jenkins作为项目持续集成的工具,它支持项目的构建、部署、自动化,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

2.12 数据缓存

采用Redis作为数据缓存工具,它是一种可基于内存、亦可持久化的日志型、Key-Value数据库,读写性能优异。

2.13 反向代理

采用Apache作为反向代理服务,它是目前世界上使用最广泛的一种web server,它以跨平台,高效和稳定而闻名,可以运行在几乎所有广泛使用的计算机平台上。

2.14 参数校验

采用Hibernate Validator作为参数校验框架,它的验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度,具有统一且规范的验证方式。

2.15 日志组件

采用logback作为日志管理组件,它继承自log4j,比log4j性能更优异。

2.16 模板引擎

采用Velocity作为后端模板引擎,根据项目需要,采用thymeleaf作为前端模板引擎。

3 系统框架

系统框架采用MVC架构,分为视图层、控制层和持久层。配合各种组件、管理工具和支撑工具,系统整体框架如图 1所示。

图 1 系统架构

4 项目工程规范

项目采用Maven进行管理,项目目录结构如图 2所示。

图 2 项目目录结构

可根据项目实际情况,对上述目录结构做适当调整,但整体结构应保持一致。各包名与目录的功能描述如表 2所示。

表 2 包名功能描述

包名与目录 功能描
src/main/java 用来存储项目所有的java源文件
com.highguard.xxx.yyy.controller xxx代表工程名,yyy代表模块名(以下类同),存放控制器类文件,类似于struts里的Action类
com.highguard.xxx.yyy.entity 存放java bean实体类,一般与数据库表字段对应
com.highguard.xxx.yyy.dao 存放DAO接口类及实现类,直接操作数据库
com.highguard.xxx.yyy.dao.impl 存放DAO接口实现类
com.highguard.xxx.yyy.service 存放服务接口类及实现类,供控制器调用
com.highguard.xxx.yyy.service.impl 存放服务接口实现类
com.highguard.xxx.constants 存放常量类,供其它类引用
com.highguard.xxx.exception 存放自定义异常类
com.highguard.xxx.listener 存放监听类
com.highguard.xxx.logging 存放自定义日志类,用于提供各级别的日志输出
com.highguard.xxx.servlet 存放servlet类
com.highguard.xxx.timer 存放定时器类
com.highguard.xxx.util 存放工具类
com.highguard.xxx.webservice 存放webservice类
src/main/resources 存储工程的配置文件和资源文件
src/main/resources/mybatis 存放mybatis相关配置文件
src/main/resources/spring 存放spring相关配置文件
src/main/webapp 存储jsp页面相关文件,包括web.xml
src/test/java 存储单元测类java文件及资源文件
pom.xml 用来配置项目所依赖的jar包信息

5 开发技术规范

5.1 技术原则

5.1.1 程序对象重用原则

  • 应用程序中占用内存大的对象要避免不断生成与复制,尤其避免在循环体中生成大对象。由于Java的垃圾回收机制,不会立即释放不用的内存,如果短时间内大量生成大对象,容易造成内存溢出;
  • 应用系统应该尽量通过公共组件与AOP技术,减少重复性代码。公共组件是将通用的代码逻辑进行封装,避免重复实现,如事务控制、异常处理、日志记录等可以采用AOP技术,减少代码量,避免错误的产生。

5.1.2 依赖解除原则

  • 应用需要支持分模块独立使用,要避免包与包之间的相互依赖。如果一个包的类引用第二个包的类,那么第二个包的类不应引用第一个包的类。如果它们互相引用,就可能意味着任何一个包都不能单独使用。

5.1.3 常量使用原则

  • 应用程序中如果需要使用某常量值,必须在常量类中声明该值为常量,以增加程序的可读性和配置性。过多的常量值的直接引用不利于程序的可读性和维护;
  • 常量类的使用可以避免将常量值编译到业务代码中,当常量值发生变化的时候,无需将所有引用常量的类都重新编译,只需要编译常量类即可。

5.1.4 日志处理原则

  • 开发人员在自测通过之后,必须删除代码中的out/System.err打印语句。这些代码不允许提交到SVN服务器上,因为System.out/System.err打印占用文件句柄,在大并发操作的时候,会对系统性能带来很大的影响;
  • 应用的各类日志应该保存在指定的日志文件夹中,便于统一管理。错误与异常日志应能体现异常发生的时间、原因以及发生时的环境。应用日志必须有一定的分级日志机制,具体如下:
  • ERROR:可导致应用不正常工作的错误以及异常;
  • WARN:不会影响应用工作的错误或异常;
  • INFO:应用启动与停止信息、时间以及运行过程中的重要信息等;
  • DEBUG:各类调试信息。

注意:所有日志内容都必须使用DEBUG级别进行输出,生成环境下的默认日志级别为WARN。

5.2 展现层规范

5.2.1 事务一致性原则

  • 展现层不允许多次调用业务层的方法进行数据库的增删改操作。基于Spring的事务管理机制,事务统一控制在SERVICE层,多次调用SERVICE方法进行数据库增删改的操作将被分割成多个事务。

5.2.2 信息提示原则

  • 在用户终端不得显示Java异常堆栈。在显示错误信息时,需要显示错误码,并增加错误信息的显示和必要的操作提示。

5.3 业务层规范

5.3.1 数据访问分离原则

  • 业务层不得出现SQL、HQL或其它直接访问数据库的代码。应统一在数据访问层管理对数据库的访问,有助于提高代码的可读性和灵活性。

5.3.2 配置信息分离原则

  • 与业务逻辑有关的阈值、参数、常量、路径等,不应写死在程序中,而应采用配置文件或配置数据库。如果用户需要更新配置信息,应采用数据库方式,此时应注意更新所有相关应用实例的缓存。

5.4 数据层规范

5.4.1 ORM框架使用原则

  • 利用ORM技术,实现基本的增删改查。可以方便对数据的访问,减少代码量,避免错误的产生;
  • 无论从系统性能、数据库一致性,还是从程序的可读性考虑,都不允许使用先删后增的方式实现修改操作。

5.4.2 复杂SQL使用原则

  • 复杂SQL是指大于等于三层嵌套查询或者关联三表以上的SQL语句,应避免使用。复杂SQL很容易导致错误或性能问题,应该考虑从业务逻辑上或者数据库结构设计上进行优化来消除。

5.4.3 存储过程与触发器使用原则

  • 实时业务逻辑避免采用存储过程来实现,禁止使用触发器实现数据库逻辑。存储过程和触发器存在版本不兼容、不便于调试、不易于管理等缺点。应用服务器可以采用集群等方式提高性能,而集中的数据库服务器却成为整个系统的瓶颈,应避免让数据库服务器运行不必要的业务逻辑。

5.4.4 数据量控制原则

  • 在系统设计中,应单个数据库表的数据量过大,应采用转储、归档等措施。大数据量的数据库表会带来访问性能的下降;
  • 对于不再需要更新、但需要访问的数据,可采用转储到历史表或历史数据库的方式;
  • 历史数据查询以及统计分析等操作应主要针对历史表进行,避免对正常业务造成影响。

5.4.5 绑定变量使用原则

  • 对于需要传参数的SQL语句,必须采用绑定变量的方式,可以防止SQL注入的风险。

6 系统部署架构

项目在进行需要分析时,需要确认系统的部署架构。针对不同的部署要求,存在不同的架构及对应的技术要求。

6.1 单台服务器

单台服务器是最简单的部署架构,应用服务与数据库服务部署在一台服务器。根据单台服务器上部署应用的数量,分成单一应用和多个应用。采用该架构的项目一般性能要求不高,且对数据安全性没有要求。

6.1.1 单一应用

一台应用服务器上只运行一个应用服务,部署架构如图 3所示。

图 3 单台服务器单一应用

6.1.2 多个应用

在一台服务器上部署多个应用服务,部署架构如图 4所示。该部署架构下,可能需要考虑单点登录问题,需要通过Redis服务来实现Session同步。

图 4 单台服务器多个应用

6.2 双机热备

双机热备方式要求同时存在主机和备机两台服务器。在两台服务器上同时运行双机热备服务(Pacemaker+Corosync),正常情况下,主机对外提供服务,备机不提供服务。当主机存在故障无法继续提供服务时,自动降为备机,而备机自动升为主机,代替原主机对外提供服务。

此架构需要考虑数据库同步的问题,同步方式分为两种:主从复制和DRBD同步。

6.2.1 主从复制

此架构需要对主机和备机的数据库进行主从同步配置,利用数据库的同步机制进行数据同步。部署架构如图 5所示。

主机和备机都只访问本机的数据库,对端数据库出现异常不影响本机的服务。

图 5 数据库主从复制

6.2.2 DRBD同步

此架构不需要对数据库进行主从同步配置。正常情况下,只有主机数据库工作,备机数据库不工作。备机通过DRBD与主机数据库文件保持同步。部署架构如图 6所示。

主机和备机同时访问主机的数据库。当主机出现故障降为备机时,会关闭本机数据库服务。同时,备机升为主机,启动本机数据库服务。

图 6 数据库DRBD同步

6.3 集群

集群要求所有服务器均对外提供服务。此时要采用Apache作为代理服务器,起到负载均衡作用。为防止代理服务器成为整个系统的瓶颈(代理服务器崩溃会导致整个系统崩溃),需要对代理服务器配置成主备模式。

6.3.1 单一应用

在每台服务器上,均只运行一个应用服务,部署架构如图 7所示。在该架构下,需要配置数据库集群,以解决数据库同步及数据一致性的问题。

图 7 单一应用集群

6.3.2 多个应用

在每台服务器上,均运行多个应用服务。部署架构如图 8所示。在该架构下,除了需要配置数据库集群,以解决数据库同步及数据一致性的问题外,还可能需要配置Session同步,以解决单点登录的问题。

图 8 多个应用集群

 


版权声明:文末如注明作者和来源,则表示本文系转载,版权为原作者所有 | 本文如有侵权,请及时联系,承诺在收到消息后第一时间删除 | 如转载本文,请注明原文链接。
喜欢 (1)