最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA。
     有点挑战,做完了,会有很大进步。

上一篇,我们描述了原有项目中的问题。
  或者说是,本篇的基本背景。

本篇开始,给出我们的改进方案和技术架构。
  不过,根据自己的理解,我先列出了“规范和约定”。

  因为,我认为“规范和约定”是具体方案和解决办法的基石,也是很多互联网项目的基本准则吧。

2.改进方案和技术架构
 

   2.1规范和约定
 
   2.1.1代码规范
      用准确的英文单词,给类、函数名、变量名
      get,add,update
      更多细节,参考“Java代码规范-小雷.pdf”和“JAVA编码规范.pdf”
 
   2.1.2约定优于配置,约定优于注释
         数据库表名和字段名、Java类、函数、变量名
 
        约定优于配置
        约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,
旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。
本质是说,开发人员仅需规定应用中不符约定的部分。
例如,如果模型中有个名为Brand的类,那么数据库中对应的表就会默认命名为brand,Controller的名字默认命名为BrandController。
只有在偏离这一约定时,例如将该表命名为"product_brand",才需写有关这个名字的配置。

约定优于注释
    这个是我自己的见解。
     用标准,统一的英文单词,给变量和函数等命名。
    比如数据库表brand表有个字段name。
    BrandDao有个add和update方法。

brand:就是品牌的意思
   name:就是品牌的名称
   add:就是增加一个品牌,BrandDao中,千万别用addBrand这种啰嗦的命名方式,类名中已经包含了Brand,里面的dao就是和brand相关的。
   update:就是更新一个品牌

不用去写注释,也不用去和相关人士,过多解释这个字段的意思,这个函数的作用。
  望文生义,通过名字就可以知道准确的意思,就不用多费口舌了。

对于那些复杂的代码,比如订单支付过程中,有一些不好理解的业务逻辑代码,再写简洁的注释。
 

   2.1.3单表 
       a.服务分离
          web服务比较多,到处都是, 一个服务和对应的数据库是逻辑上在一起的。
          感觉有点说不通呢?多表凭啥不能做到“服务分离” 。
          更准确的理由,应该是下面提到的“分库分表”,然后才是“服务分离”这个 。
 
       b.不方便缓存
          单表的结果集,方便缓存,而多表则不合适。
          比如user表有roleId字段,查询用户的时候,查1个用户,再根据roleId查角色信息。
         但是,关联的角色名称可能变化了,或者user用户信息变了,而角色不变。
          那么,可以单独缓存user或者role。
         而多表的情况下,还是都查询了数据库。 
 
       c.联合查询,效率低
         当数据量大的时候,笛卡尔积很大,10000*10000,占用的内存很大。
         假设内存足够的话,笛卡尔积的过程,也很需要时间。

而单表查询,没有笛卡尔积的过程,先批量查A,比如10条,再批量去B查,1次10条,代码组装,数据就够了。

这里面存在一个问题,当A-B表关联查询,但是查询条件是B表字段的时候,这个是否必须“关联查询”。
        比如,根据用户角色名称,查询用户,获得第1页10条数据。

如果还是单表的情况,就需要做“冗余”。

因此,我们说“单表”存在2个含义。
       一、只有自己一个表的数据,二、物理上是一个表,但逻辑上有2个表的数据。
 

       d. 并发
          每个表数据量、查询查询、修改次数等都不一样。
          单个表,如果需要锁住一行,也更加精准。
    
          这个地方,还不是特别确定。 
         单表锁一行:select * from brand where id =1 for update
         多表锁一行:select * from user left join  role on user.roleId = role.id where roleId = 1 for updte ?
 
         准确的说,以上是“并发修改” 中的1个例子,还有“并发查询”等很多种并发场景吧。
 
       e. 如何分表、分库
           数据量大的时候,需要分表分库。
          分表分库之后,联合查询就很废材了。
 
        f.根据业务场景和特性,分别做优化
           实际情况,user、role、brand等查询量、修改量等都是不同的。
           这一点,和把整个项目拆分成商品product、用户user等思想是类似的。
           拆分成更小粒度的,方便做优化。

     疑问: 既然MySQL多表这么废材,为什么当初设计MySQL等数据库的时候,都有关联查询等一大堆功能特性呢?
    难道是因为互联网崛起,超出了当初设计者的想象力? 

   2.1.4单一职责
         一个类、一个函数,只做一件事,只完成一个功能。
         一个接口集,对外提供的服务,也是紧密相关的。

个人观察多问几个为什么,可以发现更多的问题,学到更多更深入的“知识点” 。
                    用单表是好,为啥不能用“多表联合查询” ,通过对这个问题的思考和交流,理解更近了一步。

   约定优于注释,算是我的独家见解吧~ 

一个电商项目的Web服务化改造3:改进方案の规范和约定、单表、单一职责的更多相关文章

  1. 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现

        最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.     有点挑战,做完了,会有很大进步. 上一篇,我们明确了我们的"规范和约定". 从 ...

  2. 一个电商项目的Web服务化改造

    一个电商项目的Web服务化改造 项目,早期是随便瞎做的,没啥架构,连基本的设计也没. 有需求,实现需求,再反复修改. 大致就是这么做的. 最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的 ...

  3. 一个电商项目的Web服务化改造6:单元测试4步走,构造数据、执行操作、断言、回滚

      最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.     有点挑战,做完了,会有很大进步. 单元测试,在很早之前的文章已经介绍过.     可以在这里看到相关的 ...

  4. 一个电商项目的Web服务化改造5:面向服务的分层架构设计(有图有真相)

    最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.     有点挑战,做完了,会有很大进步. 本篇,以我亲自画的3个图,阐述一下架构设计.   一.分层架构-总体图 ...

  5. 一个电商项目的Web服务化改造2:现有项目的5个问题

         最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.      有点挑战,做完了,会有很大进步, 1.现有项目的问题   1.1代码风格不统一     不同的 ...

  6. 一个电商项目的Web服务化改造7:Dubbo服务的调用,4个项目

    使用dubbo服务的过程,很简单,和之前学习的WebService完全一样,和本地接口调用也基本一致. dubbo和WebService的区别:我认为dubbo就是封装了WebService,然后提供 ...

  7. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  8. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  9. 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文

    阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...

随机推荐

  1. sql server的版本检查

    https://support.microsoft.com/en-ph/help/321185/how-to-determine-the-version-edition-and-update-leve ...

  2. 特征变化--->特征向量中部分特征到类别索引的转换(VectorIndexer)

    VectorIndexer: 倘若所有特征都已经被组织在一个向量中,又想对其中某些单个分量进行处理时,Spark ML提供了VectorIndexer类来解决向量数据集中的类别性特征转换. 通过为其提 ...

  3. astgo-官方功能更新日志

    2014年9月 2014-9-7:更新 1.安卓.苹果客户端添加字幕广告(点击字幕跳转打开网址) 2.安卓.苹果客户端添加公告推送功能 3.修正Astgo软交换管理平台修删除充值卡.用户账号,造成整个 ...

  4. php phppowerpoint

    今天早上从订阅的 Zend DevZone 看到篇很有意思的文章. Creating PowerPoint 2007 files using PHP. 试了一下. 果然很又意思, 分享给大家吧. 程序 ...

  5. ARM VM安装Linux Diagnostic 2.3扩展

    目前创建的Azure Linux虚拟机默认安装的是LAD 3.0,如果客户有特殊需求,可以通过如下方法安装LAD 2.3 1.在Azure Portal卸载LAD 3.0 2.使用Azure Powe ...

  6. JAVA小记(一)

    java中向上转型.向下转型.内部类中所需注意的问题: 向上转型与向下转型: 举个例子:有2个类,Father是父类,Son类继承自Father. Father f1 = new Son();   / ...

  7. CSS发布时间

    * 1996年W3C正式推出了CSS1.* 1998年W3C正式推出了CSS2.* CSS2.1是W3C现在正在推荐使用的.* CSS3现在还处于开发中.

  8. IIS 配置 SVC

    IIS8中添加WCF支持几种方法小结[图文] 方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不 ...

  9. [转]Android定时刷新UI界面----Handler

    本文转自:http://blog.csdn.net/macong01/article/details/7479266 本想做一个软件可以对UI界面进行定时更新,找了一些资料,先贴一个简单的定时更新界面 ...

  10. 【1】Jdk1.8中的HashMap实现原理

    HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 内部实现 ...