项目分层
应用分层:隐藏下层业务逻辑的复杂性,提高系统的组件化和可维护性
计算机领域的任何问题都可以通过增加一个中间层解决
严禁第三方状态码放到系统中
分层异常处理:
- Dao层:异常类型很多,不需要打印日志
- Manager/Service层:必须记录出错日志到磁盘,尽可能带上参数信息,保护案发现场
- Web层:决不能向上抛异常,应该跳到友好错误页面,友好的错误提示信息
- 开放接口层:将异常处理成错误码和错误信息方式返回
分层领域模型:
- DO:此对象与数据库表结构一一对应,通过DAO层向上传输数据源对象
- DTO:数据传输对象,Service或Manager向外传输的对象
- BO:业务对象,可以由Service层输出的封装业务逻辑的对象
- Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输
- VO:显示层对象,通常是Web向模板渲染引擎层传输的对象
Maven、构建
Maven:管理依赖、对项目进行构建、支持多种插件、规范的目录结构、完整的项目构建阶段
什么是构建?手工情况下:使用javac编译程序成.class文件,使用打包工具打成jar包的过程
Java项目构建工具:
- 传统构建工具:Ant(缺点:不能管理依赖)
- 主流构建工具:Maven
- 新兴构建工具:Gradle(安卓应用程序的标配)
什么是GAV?即工程的坐标:G:groupId,A:artifactId,V:version
Maven的依赖仲裁:(到底选择哪一个版本)
- 按照DependencyManager版本声明进行仲裁
- 如无仲裁声明,则按照依赖最短路径确定版本
- 若相同路径,则按照第一声明优先原则
二方库管理
二方库依赖:定义GAV规则以及版本
一方库:本工程中的各模块的相互依赖
二方库:公司内部的依赖库,一般指公式内部的其他项目发布的jar包
三方库:公司之外的开源库,比如apache、google、alibaba等发布的依赖
GroupId:
- 格式:com.{公司/BU}.业务线{.子业务线),最多4级
- 例子:com.alibaba.dubbo.register
ArtifactID:
- 格式:产品线名-模块名
Version:
- 二方库版本号命名方式:主版本号.此版本号.修订号
- 主版本号:产品方向改变,或者大规模API不兼容,或者架构不兼容升级
- 次版本号:保持相对兼容性,增加主要功能特性,影响范围极小的API不兼容修改
- 修订号:保持完全兼容性,修复BUG、新增次要功能特性等
二方库引用规约:
- 线上应用不要依赖SHAPSHOT版本(快照版本很有可能会覆盖发布,测试用的)
- 正式发布的类库必须去中央仓库查证,使RELEASE版本号有延续性
- 正式发布的类库版本号不允许覆盖升级
- 二方库的新增或升级,保持除功能点之外的其他jar包仲裁结果不变(不要增加新jar包的依赖)
- 二方库里定义的枚举类型,参数中可以使用返回值不允许使用
- 依赖于一个二方库群时,必须定义一个统一的版本变量,避免版本号不一致
- 禁止在依赖中出现相同的GroupId,相同的ArtifactId,但是不同的Version
二方库引用建议:
- 底层基础技术框架、核心数据管理平台、或近硬件端系统谨慎引入第三方实现
- 所有版本仲裁使用<dependencyManagement>语句块
- 二方库不要有配置项
- 不要使用不稳定的工具包或者Utils类
二方库发布原则:
- 精简可控原则:
- 移除不必要的API和依赖
- 只包含Service API、以及必要的工具类
- 如果依赖其他二方库,尽量provided引入(不打到jar中)
- 无log具体事项,只依赖日志框架
- 稳定可追溯原则:
- 记录每个版本的变化
- 二方库维护者
- 源码的位置
- 公共二方库的行为不变
网络传输和调优
TCP/IP:在多个不同网络间实现信息传输的协议簇
TCP/IP的五层结构:以定义数据格式和解决传输问题角度进行抽象的分层
- 应用层:定义从端口获取到程序中的数据格式并解读和返回数据(http、ftp、smtp等)
- 传输层:主要工作是定义端口,实现端口到端口的通信(TCP/UDP)
- 网络层:定义IP地址和子网,并对于不同子网的数据包进行路由
- 链路层:对电信号进行分组并形成具有特定意义的数据帧
- 物理层:接口规格,信号电平,IEEE 802.1定义传送频率,帧结构
高并发服务器参数调优
- 高并发服务器建议:
- 调小TCP协议的time_wait超时时间
- 操作系统默认240秒后超时
- 在高并发访问下,可能无法建立新的连接
- 调大服务器:
- 调大服务器所支持的最大文件句柄数(fd)
- Linux系统一个连接对应一个文件描述符
- Linux系统默认所支持最大fd数量为1024
- 连接数很大时很容易无法建立连接
- 建议linux 服务器所支持的最大句柄数调高数倍(与服 务器的内存数量相关)
- JVM环境参数设置:
- XX:+HeapDumpOnOutOfMemoryError参数
- JVM碰到OOM场景时输出dump信息
- JVM的Xms和Xmx设置:
- JVM的Xms和Xmx设置一样大小的内存容量
- 避免在GC后调整堆大小带来的压力