web商城总结

      大概学习完taotao商城后的总结和记录。

一、概括

       taotao商城使用的是SSM技术,也就是持久层---MyBatis、业务层---Spring、表现层---SpringMVC。项目为maven工程,使用分布式结构,SOA架构,按照功能把系统拆分成独立的模块。单独为某一个节点添加服务器,需要系统之间配合才能完成整个业务逻辑为不同的模块项目。每个模块的结构大致相同,表现层工程中(使用Controller标记)注入(Autowired)service,配置文件为SpringMVC.xml。业务工程(使用Service标记)中实现接口(interface)模块,注入mapper,其配置文件为mybatis---SqlMapConfig.xml,properties---db.properties(数据库相关),spring---(applicationContext-activemq.xml某些工程会用到)、applicationContext-dao.xml(扫描mapper包)、applicationContext-service.xml(Dubbo中暴露服务接口)、applicationContext-transaction.xml(事务管理、配置通知、配置切面)。数据库(使用阿里的Druid连接池)对应的pojo类和mapper映射(dao)由逆向工程生成。(restRESTful可以通过一套统一的接口为 Web,iOS和Android提供服务,对外返回json格式数据。

       Spring MVC是Spring框架提供的构建Web应用程序的全功能MVC模块,也是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,很好地实现了MVC架构模式的思想并将web层进行职责解耦。一般地,在MVC框架中,控制器(Controller)用于执行业务逻辑并产生模型数据(Model),而视图(View)则用于渲染模型数据。(@ResponseBody
    /*加上ResponseBoby注解,就不会走视图解析器,不会返回页面,
    不加就会走视图解析器,返回页面。@Responsebody 注解表示该方法的返回的结果直接写入
     HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用;返回给了页面异步请求中*/)

 

打包方式:

       dao-----查写数据,其他工程也需要和数据库打交道,直接抽出为一个工程,打包为Jar,方便其他工程依赖。

       pojo-----接收dao返回的数据,打包为jar方便其他工程依赖。

       interface-----1.解耦 2.使用dubbo,官方推荐将接口打包为jar。

       service-----(war包,为了发布服务方便),服务层要发布在spring容器中,初始化spring容器需要web.xml,所以是war包。如果打包为jar包的话,要初始化spring容器需要入口函数加载spring容器,不是太方便。

 

 SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。 常作为数据源较简单的web项目的框架。

  分布式架构:多个子系统相互协作才能完成业务流程。系统之间需要进行通信。

   集群:同一个工程部署到多台服务器上(单台服务器---节点)。

  分布式架构:

  把系统按照模块拆分成多个子系统。

  优点:

  1. 把模块拆分,使用接口通信,降低模块之间的耦合度。
  2. 把项目拆分成若干个子项目,不同的团队负责不同的子项目。
  3. 增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
  4. 可以灵活的进行分布式部署。

 

 缺点:

    1、系统之间交互需要使用远程通信,接口开发增加工作量。

    2、各个模块有一些通用的业务逻辑无法共用。

 

基于SOA架构,表现层和服务层是不同的工程。所以需要两个系统之间的通信。

每个模块的结构大致相同,表现层工程中(使用Controller标记)注入(Autowired)service,配置文件为SpringMVC.xml。业务工程(使用Service标记)中实现接口(interface)模块,注入mapper,其配置文件为mybatis---SqlMapConfig.xml,properties---db.properties(数据库相关),spring---(applicationContext-activemq.xml某些工程会用到)、applicationContext-dao.xml(扫描mapper包)、applicationContext-service.xml(Dubbo中暴露服务接口)、applicationContext-transaction.xml(事务管理、配置通知、配置切面)。(序列化的目的依赖为了进行网络传输,确保传过去的字节流还能被反编译找到对应的类,二来为了方便本地硬盘存储。)

【SOA:Service Oriented Architecture面向服务的架构。也就是把工程拆分成服务层、表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。

  如何实现远程通信?

  1. 使用WebService:效率不高,它是基于soap协议(http+xml)。项目中不推荐使用。
  2. 使用restful形式的服务:http+json。很多项目中应用。如果服务越来越多,服务与服务之间的调用关系复杂,调用服务的URL管理复杂,什么时候添加机器难以确定。
  3. 使用dubbo。使用rpc协议(Registry注册中心、Provider服务提供者、Consumer服务消费者)进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数,管理服务。】

     

web商城总结_第1张图片 结构

二、Dubbo

【系统间通信】

       (1)DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

  • 单一应用架构
    • 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
    • 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
  • 垂直应用架构
    • 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
    • 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
  • 分布式服务架构
    • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
    • 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
  • 流动计算架构
    • 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
    • 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。

 

Dubbo就是资源调度和治理中心的管理工具。

 

(2)Dubbo 就是类似于webservice的关于系统之间通信的框架,并可以统计和管理服务之间的调用情况(包括服务被谁调用了,调用的次数是如何,以及服务的使用状况)。

 

节点角色说明:

  • Provider: 暴露服务的服务提供方。
  • Consumer: 调用远程服务的服务消费方。
  • Registry: 服务注册与发现的注册中心。
  • Monitor: 统计服务的调用次调和调用时间的监控中心。
  • Container: 服务运行容器。

 (3)使用方法

Spring配置下

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

单一工程中spring的配置local.xml

       

远程服务:

在本地服务的基础上,只需做简单配置,即可完成远程化:

将上面的local.xml配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml,将服务引用部分放在服务消费方remote-consumer.xml。

并在提供方增加暴露服务配置,在消费方增加引用服务配置

服务层发布服务:

表现层调用服务:

       

(4)注册中心---zookeeper

【zookeeper做服务层的负载均衡】

zookeeper的介绍

         zookeeper翻译成动物园管理员,他是用来管hadoop(大象)、Hive(蜜蜂)、pig(小猪)的管理员,这些“动物”都是一些项目, Apache Hbase和 Apache Solr 的分布式集群都用到了zookeeper;Zookeeper:是一个分布式的、开源的程序协调服务,是hadoop项目下的一个子项目

Zookeeper它有几个特色功能:

1)集中式的配置信息(数据库的属性文件,放在zookeeper中,修改后不用重启也能生效)

2)自动容错

3)近实时搜索

4)查询时自动负载均衡

集群管理

        在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还有,比如一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。

注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。使用dubbo-2.3.3以上版本,官方建议使用zookeeper作为注册中心。

Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高(稳定性好),可用于生产环境,并推荐使用。

【dubbo和zookeeper一起管理服务层】

三、分页插件---PageHelper

 

四、富文本编辑器

KindEditor

http://kindeditor.net/

UEditor:百度编辑器

http://ueditor.baidu.com/website/

CKEditor

http://ckeditor.com/

纯js开发,跟后台语言没有关系。

第一步:在jsp中引入KindEditor的css和js代码。

第二步:在表单中添加一个textarea控件。是一个富文本编辑器的载体。类似数据源。

第三步:初始化富文本编辑器。使用官方提供的方法初始化。

第四步:取富文本编辑器的内容。

表单提交之前,把富文本编辑器的内容同步到textarea控件中。

五、redis

【存储首页常用图片、分类信息、用户登陆信息并模拟session】

  1. 什么是NoSql

        为了解决高并发、高可扩展(集群)、高可用(不能宕机)、大数据存储问题而产生的数据库解决方案,就是NoSql数据库。

        NoSql  :全称 not only sql ,非关系型数据库。可以作为关系型数据库的一个很好的补充。不能替代。

    2. 什么是redis

        Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库(nosql),应用在缓存。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型有5种。

如下:

字符串类型 (String) 、散列类型(hash)、列表类型(List)、集合类型(set)、有序集合类型(SortedSet)。

    3. redis的应用场景

        缓存。分布式集群架构中的session分离。任务队列。(秒杀、抢购、12306等等)应用排行榜。(SortedSet)网站访问统计。数据过期处理。(expire)

  4. Redis持久化方案

          Redis 数据都放在内存中。如果机器挂掉,内存的数据就不存在。

        需要做持久化,将内存中的数据保存在磁盘,下一次启动的时候就可以恢复数据到内存中。

        1.RDB (默认开启)  快照形式  (定期将当前时刻的数据保存磁盘中)会产生一个dump.rdb文件

                特点:会存在数据丢失,性能较好,数据备份。

        2.AOF   append only file  (所有对redis的操作命令记录在aof文件中),恢复数据,重新执行一遍即可。

                特点:每秒保存,数据比较完整,耗费性能。   

六、Solr

   中文分析器(IKAnalyzer2012FF_u1.jar)、solrJ管理索引库(使用SolrJ可以实现索引库的增删改查操作)

(1)SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。

 SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。

七、ActiveMQ(消息队列)

【项目使用:在修改商品后,需要自动更新索引库。在修改商品处进行监听,每当监听到修改后,将消息发送给自动更新索引库的项目】

(1)ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

主要特点:

1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)

3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上

5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

6. 支持通过JDBC和journal提供高速的消息持久化

7. 从设计上保证了高性能的集群,客户端-服务器,点对点

8. 支持Ajax

9. 支持与Axis的整合

10. 可以很容易得调用内嵌JMS provider,进行测试

(2)ActiveMQ的消息形式

对于消息的传递有两种类型:

一种是点对点的(Queue),即一个生产者和一个消费者一一对应;

另一种是发布/订阅模式(Topic),即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。

JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

  · StreamMessage -- Java原始值的数据流

  · MapMessage--一套名称-值对

  · TextMessage--一个字符串对象

  · ObjectMessage--一个序列化的 Java对象

  · BytesMessage--一个字节的数据流

八、freemarker

【ActiveMQ进行监听,商品添加后,生成静态页面】

(1)网页静态化

什么是静态化?

        通过一些技术手段(Freemarker/valocity)将动态的页面(jsp,asp.net,php) 转换成静态的页面,通过浏览器直接访问静态页面。

为什么要静态化?

        通过浏览器直接访问静态的页面,不需要经过程序处理,它的访问速度高。

        稳定性好。

        更有效的防止安全漏洞问题,比如不易遭受黑客攻击。

        静态的页面更容易被搜索引擎收录。

怎么样实现?

可以使用freemarker实现网页静态化。

(2)FreeMarker是一个用Java语言编写的模板引擎,它基于模板输出文本。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。

九、Nginx

keepalive使得nginx高可用、nginx对表现层做负载均衡

 详见Nginx文章https://blog.csdn.net/qq_34480270/article/details/85112360。

十、SSO系统

(1)SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。

(2)只用一个web工程时不用SSO就行。集群环境下会出现要求用户多次登录的情况。

解决方案:

  1. 配置tomcat集群。配置tomcatSession复制。节点数不要超过5个。
  2. 可以使用Session服务器,保存Session信息,使每个节点是无状态。需要模拟Session。

单点登录系统是使用redis模拟Session,实现Session的统一管理,解决Session的共享问题.

传递数据时使用的Jsonp(Ajax跨域请求)。

 

十一、MyCat

           MyCat(可以认为是代理)是分布式数据库中间件,类似web服务器的Nginx。可以实现分库分表、读写分离、主备切换等功能。

(数据库是对底层存储文件的抽象,而Mycat是对数据库的抽象。)

十二、其他性能提升方法

升级硬件、使用CDN。

 

技术用来解决项目开发中所遇到的问题!

https://www.cnblogs.com/zdd-java/p/taotao-refactoring-01.html

你可能感兴趣的:(java)