(六)工程结构

(一)应用分层

  1. 【推荐】图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于Web 层,也可以直接依赖于 Service 层,依此类推:

                    

   开放接口层:可直接封装 Service 方法暴露成 RPC 接口; 通过 Web 封装成 http 接口; 进行网关安全控制、 流量控制等。

   终端显示层:各个端的模板渲染并执行显示的层。 当前主要是 velocity 渲染, JS 渲染,JSP 渲染,移动端展示等。

   Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。

   Service 层:相对具体的业务逻辑服务层。

   Manager 层:通用业务处理层,它有如下特征:

    1) 对第三方平台封装的层,预处理返回结果及转化异常信息;

    2) 对 Service 层通用能力的下沉,如缓存方案、 中间件通用处理;

    3) 与 DAO 层交互,对多个 DAO 的组合复用。

   DAO 层:数据访问层,与底层 MySQL、 Oracle、 Hbase 等进行数据交互。

   外部接口或第三方平台:包括其它部门 RPC 开放接口,基础平台,其它公司的 HTTP 接口。

  3. 【参考】分层领域模型规约:

   DO(Data Object) : 此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。

   DTO(Data Transfer Object) :数据传输对象, Service 或 Manager 向外传输的对象。

   BO(Business Object) :业务对象, 由 Service 层输出的封装业务逻辑的对象。

   AO(Application Object): 应用对象, 在 Web 层与 Service 层之间抽象的复用对象模型,极为贴近展示层,复用度不高。

   VO(View Object) : 显示层对象,通常是 Web 向模板渲染引擎层传输的对象。

   Query:数据查询对象,各层接收上层的查询请求。 注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。

(二)二方库依赖

  1. 【强制】定义 GAV 遵从以下规则:

    1) GroupID 格式: com.{公司/BU }.业务线 [.子业务线],最多 4 级。

    说明: {公司/BU} 例如: alibaba/taobao/tmall/aliexpress 等 BU 一级; 子业务线可选。

    正例: com.taobao.jstorm 或 com.alibaba.dubbo.register

    2) ArtifactID 格式:产品线名-模块名。语义不重复不遗漏,先到中央仓库去查证一下。

    正例: dubbo-client / fastjson-api / jstorm-tool

  3) Version:详细规定参考下方。

  2. 【强制】二方库版本号命名方式:主版本号.次版本号.修订号

    1) 主版本号: 产品方向改变, 或者大规模 API 不兼容, 或者架构不兼容升级。

    2) 次版本号: 保持相对兼容性,增加主要功能特性, 影响范围极小的 API 不兼容修改。

    3) 修订号: 保持完全兼容性, 修复 BUG、 新增次要功能特性等。

  说明: 注意起始版本号必须为: 1.0.0,而不是 0.0.1 正式发布的类库必须先去中央仓库进行查证,使版本号有延续性, 正式版本号不允许覆盖升级。如当前版本: 1.3.3, 那么下一个合理的版本号: 1.3.4 或 1.4.0 或 2.0.0

  3. 【强制】线上应用不要依赖 SNAPSHOT 版本(安全包除外) 。

  说明: 不依赖 SNAPSHOT 版本是保证应用发布的幂等性。另外,也可以加快编译时的打包构建。

  4. 【强制】二方库的新增或升级,保持除功能点之外的其它 jar 包仲裁结果不变。如果有改变,必须明确评估和验证, 建议进行 dependency:resolve 前后信息比对,如果仲裁结果完全不一致,那么通过 dependency:tree 命令,找出差异点,进行<excludes>排除 jar 包。

  5. 【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的 POJO 对象。

  6. 【强制】依赖于一个二方库群时,必须定义一个统一的版本变量,避免版本号不一致。

  说明: 依赖 springframework-core,-context,-beans,它们都是同一个版本,可以定义一个变量来保存版本: ${spring.version},定义依赖的时候,引用该版本。

  7. 【强制】禁止在子项目的 pom 依赖中出现相同的 GroupId,相同的 ArtifactId,但是不同的Version。

  说明: 在本地调试时会使用各子项目指定的版本号,但是合并成一个 war,只能有一个版本号出现在最后的 lib 目录中。 可能出现线下调试是正确的,发布到线上却出故障的问题。

  8. 【推荐】所有 pom 文件中的依赖声明放在<dependencies>语句块中,所有版本仲裁放在<dependencyManagement>语句块中。

  说明: <dependencyManagement>里只是声明版本,并不实现引入,因此子项目需要显式的声明依赖, version 和 scope 都读取自父 pom。而<dependencies>所有声明在主 pom 的<dependencies>里的依赖都会自动引入,并默认被所有的子项目继承。

  9. 【推荐】二方库不要有配置项,最低限度不要再增加配置项。

  10.【参考】为避免应用二方库的依赖冲突问题,二方库发布者应当遵循以下原则:

    1) 精简可控原则。移除一切不必要的 API 和依赖,只包含 Service API、必要的领域模型对象、 Utils 类、常量、枚举等。如果依赖其它二方库,尽量是 provided 引入,让二方库使用者去依赖具体版本号; 无 log 具体实现,只依赖日志框架。

    2) 稳定可追溯原则。每个版本的变化应该被记录,二方库由谁维护,源码在哪里,都需要能方便查到。除非用户主动升级版本,否则公共二方库的行为不应该发生变化。

《阿里巴巴Java开发手册1.4.0》阅读总结与心得(三)的更多相关文章

  1. 码出高效,阿里巴巴JAVA开发手册1.4.0

    码出高效,阿里巴巴JAVA开发手册1.4.0阅读笔记 一.编程规约(三) 代码格式// 关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格 if (flag == 0) { ...

  2. 读阿里巴巴Java开发手册v1.2.0之工程结构有感【架构篇】

    首先,把昨天那俩条sql语句的优化原因给大家补充一下,第一条效率极低,第二条优化后的,sql语句截图如下: 经过几个高手的评论和个人的分析: 第一条sql语句查询很慢是因为它首先使用了in关键字查询, ...

  3. 读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】

     不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...

  4. 阿里巴巴 Java开发手册1.4.0

    <阿里巴巴Java开发手册1.4.0>下载地址: 下载地址:https://102.alibaba.com/downloadFile.do?file=1528269849853/Java_ ...

  5. 【阿里巴巴Java开发手册1.7.0(嵩山版)】编程规约&MySQL 数据库规约

    阿里巴巴Java开发手册1.7.0(嵩山版) 一.编程规约 (一)命名风格 所有命名不得以下划线和$开始和结束. 所有命名不得以拼音或拼音英文混合. 类名使用UpperCamelCase风格. 方法名 ...

  6. 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(一)

    前言 下面是阿里对<阿里巴巴 Java 开发手册>(下称<手册>)的介绍: 凝聚了阿里集团很多同学的知识智慧和经验,这些经验甚至是用血淋淋的故障换来的,希望前车之鉴,后车之师, ...

  7. 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(五)

    笔者作为一名有数年工作经验的Java程序员,仔细研读了这份手册,觉得其是一份不可多得的好材料.阿里巴巴在发布时所说,“阿里巴巴集团推出的<阿里巴巴Java开发手册(正式版)>是阿里巴巴近万 ...

  8. 304902阿里巴巴Java开发手册1.4.0

    转自官网 前言 <阿里巴巴Java开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大开发者.现代软件行业的高速 ...

  9. 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(四)

    (七)设计规约 1. [强制] 存储方案和底层数据结构的设计获得评审一致通过,并沉淀成为文档. 说明: 有缺陷的底层数据结构容易导致系统风险上升,可扩展性下降,重构成本也会因历史数据迁移和系统平滑过渡 ...

随机推荐

  1. .NET Core CSharp初级篇 类的生命历程

    .NET Core CSharp初级篇 1-7 本节内容为类的生命周期 引言 对象究竟是一个什么东西?对于许多初学者而言,对象都是一个非常抽象的知识点.如果非要用一句话描述,我觉得"万物皆对 ...

  2. Linux基础之bash shell介绍及基本特性

    今天继续讲Linux基础知识,内容是关于bash shell的.分享以下bash shell的相关知识,例如基本特性等.  1.8)bash shell的介绍 1.8.1)什么是bash shell ...

  3. python查漏补缺 --- 基础概念及控制结构

    python  是一种面向对象的解释型计算机程序设计语言,在运行时由解释器处理,在执行程序之前不需要编译程序.Python就是一句话,写得快,跑得慢. 下面的内容是平时工作中容易忽略掉的小细节,希望借 ...

  4. Linux 下实践 VxLAN:虚拟机和 Docker 场景

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫. 在上篇文章 ...

  5. python常用函数进阶(2)之map,filter,reduce,zip

    Basic Python : Map, Filter, Reduce, Zip 1-Map() 1.1 Syntax # fun : a function applying to the iterab ...

  6. 一文掌握 Spring Boot Profiles

    Spring Boot Profiles 简介 Profile 的概念其实很早在 Spring Framework 就有了,在 Spring Framework 3.1 版本引入了注解 @Profil ...

  7. SpringBoot Jar包瘦身 - 跟大文件说再见!

    前言 SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼.就是 编译出来的 Jar 包很大,如果工程引入了许多开 ...

  8. c#小灶——标识符和关键字

    标识符 我们之前说,命名空间的名字是自己取的,类名也是自己取的,方法名也是自己取的,以后还有各种常量.变量.对象……这些名字是自己取的.这些名字,就是标识符. 标识符规则: 标识符可以包含大小写字母. ...

  9. 0x15 字符串

    KMP算法 next数组的求法 void calc_next() { next[]=; , j=; i<=n; ++i) { &&a[i]!=a[j+]) j=next[j]; ...

  10. CSS实现三栏布局(5种)

    常见的布局方式: float布局.Position定位.table布局.弹性(flex)布局.网格(grid)布局 那么我们就是用以上5种方式完成三栏布局,不过前提是左右宽度(假如左右宽度为300px ...