最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,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. Selenium在Jenkins中的配置

    //  Goals and options -Dmode="" -DuseGrid="true" -Dhub=${Hub} -DbrowserType=${Br ...

  2. hdu 6115(LCA 暴力)

    Factory Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total ...

  3. bzoj3550

    费用流+线性规划 搞了很长时间... 我们可以设立式子,a[1]+a[2]+a[3]+...+a[n]<=k , ... , a[2 * n + 1]+ ... +a[3*n]<=k a是 ...

  4. 使用display:flex;实现两栏布局和三栏布局

    一.使用display:flex;实现两栏布局 body,div{margin:0px;padding:0px;} .flex-container{display:flex;height:300px; ...

  5. 这里有最全的C/C++入门到进阶书籍推荐,你需要嘛?

    编程是操作性很强的一门知识,看书少不了,但只有学习和实践相结合才能起到很好的效果,一种学习方法是看视频->看书->研究书中例子->自己做些东西->交流->看书. 研究经典 ...

  6. .net 必看书籍1

    我们2个网站运营群,有很多技术高手,同时也有大部分技术新人,如何从传统asp转到.net,从传统table转到div+css布局,从传统技术转到ajax,从小型程序转到高性能并发的大型程序,我花了2小 ...

  7. strupr函数

    2019-06-03 15:13:39 strupr()函数! strupr,函数的一种,将字符串s转换为大写形式. 说明:只转换s中出现的小写字母,不改变其它字符.返回指向s的指针. 兼容性说明:s ...

  8. hbuilder中的 http://www.w3.org/TR/html4/frameset.dtd

    <!-- This is the HTML 4.01 Frameset DTD, which should be used for documents with frames. This DTD ...

  9. Flume 是什么?

    Flume是一个分布式.可靠.和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力. 收集.聚合事件 ...

  10. EasyUI系列学习(一)-入门

    1.什么是jQuery EasyUI jQueryEasyUI是一组基于jQuery的UI插件集合 2.jQueryEasyUI的特点 可以通过html标记来定义用户界面:支持扩展,可根据最近的需求扩 ...