电商项目介绍---说的很好

在广州作了四年开发,大大小小参与过五个项目的开发,一个是某公司内部的人员管理系统,一个是物流项目,最近作的是一个电商项目。javascript

前两个项目采用的是ssh框架搭建的,最近的项目采用的是ssm框架搭建的。在实际开发中,我以为这两个框架,他们最大的区别在于hibernate与mybatis的区别。java

Hibernate与mybatis相比较,mybatis更为轻便、灵活,容易掌握。mybatis能够把sql语句从Java代码中分离了出来,放在了配置文件中书写,大大下降了java代码与SQL语句的耦合度,更容易对sql语句操做,重要的是mybatis还能够书写动态的sql语句,但mybatis也存在一些缺陷,好比mybatis自己的缓存机制没有hibernate那么完善,hibernate除了自己有良好的缓存机制,还可使用第三方缓存。Hibernate较完整的封装了JDBC,但学起来要比mybatis更困难一些。Hibernate的DAO层开发比MyBatis简单,对对象的维护和缓存要比MyBatis好。mysql

(springmvc与Struts的区别:springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,参数的传递是直接注入到方法中的,是该方法独有的。

struts2是类级别的拦截, 一个类对应一个request上下文, struts是在接受参数的时候,能够用属性来接受参数, 这就说明参数是让多个方法共享的,这也就没法用注解或其余方式标识其所属方法了)。nginx

 

该商城是一个综合性的B2C平台,主要针对女性消费者,主要销售女性化妆品,首饰,服装等女性用品。商家入驻商城销售自家的产品,而且能够获得商城提供的各类服务。面试

 

在整个项目中,咱们采用的是nginx+tomcat来部署的(面试官会可能问nginx是谁来部署的?如何部署的?Nginx的执行流程,优势),nginx一方面作加载静态资源的服务器,另外一方面来作反向代理和负载均衡。由于该项目须要在多个环境中运行,咱们利用了nginx的反向代理解决了不一样环境同系统访问地址不统一带来的问题。ajax

 

由于整个项目实现的功能较多, 因此采用分布式的架构设计,整个项目包括后台管理系统、前台系统、订单系统、登陆系统、搜索系统、购物车系统等,这样作的好处是使每一个功能模块独立出来,下降了各系统之间的耦合度,增删一个功能不会影响其余功能模块。redis

 

由于项目是采用分布式架构设计的,各模块之间是相互独立的,而各模块的访问路径又是不一样的,因此当跨域请求数据的时候会遇到跨域受限的问题。好比当用户首次访问该网站首页时,首页页面会异步请求后台管理系统加载商品的类目,这是就会出现跨域受限的问题,之前开发时,若是在本模块内,咱们是经过ajax异步请求数据的,但Ajax不支持跨域,因此用ajax没法解决跨域请求数据的问题。最后咱们使用的是jsonp来解决这个问题的。jsonp经过script标签的src能够跨域请求的特性,加载资源,将加载的资源(经过一个方法名将数据进行包裹)当作是js脚本解析,定义一个回调函数(是怎么实现的?),获取传入的数据。咱们使用jsonp是由于Jsonp的兼容性比较好,而且在请求完毕后能够经过callback的方式回传结果。但jsonp有一个缺点是只支持get请求而不支持post等其余类型的http请求。spring

 

这样咱们解决了浏览器访问当前页面去加载后台系统数据出现的跨域问题,可是另外一个问题又来了,其余系统该如何获得调用后台系统的数据呐?咱们想能够发送http请求来访问后台数据,咱们想到的是使用httpclient来解决此问题,由于httpclient可使用java代码模拟浏览器发送http请求(get方法如何传递参数?定义uribuilder对象,在uribuilder里设置参数,以key和value,都是string类型的,而后将uribuilder放到uri中,在后将uri讲给httpget请求。Post方法若是传输数据?模拟表单提交,将数据封装到list集合中,而后将集合数据放入构造的表单实体中,在将表单实体请求放到httppost对象中)。向外抛出一个接口,执行过程是:一、建立httpclient 对象二、构建请求对象post ,get请求三、若是有参数,就去构造请求参数 sql

       3.1 get数据库

       使用uribuilder去构造请求参数

       3.2 post

        构建表单实体,把表单实体放入到 post请求对象中。

四、执行请求 ,而且接受响应

五、处理响应结果

6. 释放链接。不管执行方法是否成功,都必须释放链接。

HttpClient实现认为是线程安全的。

每次链接发起Http请求的时候都会从新创建链接(经历3次握手),用完就会关闭链接(4次挥手),这样会消耗不少时间,全部咱们采用了链接池。若是不采用链接池,每次链接都会打开一个端口,在大并发的状况下系统的端口资源很快就会被用完,致使没法创建新的链接。

 

像项目中首页的大广告和商品类目这些不须要常常修改的数据,若是用户每次刷新页面的时候都要去数据库中查询,这样会浪费资源和增长数据库的压力。因此咱们想当把这些数据添加到一个缓冲中,用户去访问的时候,先去缓存中命中,若是命中失败,再去数据库中查询,而后把查询到的数据添加到缓存中。目前比较主流的缓存技术有Redis和Memcached,单纯从缓存命中的角度来讲,Memcached要高一些,可redis和Memcache的差距其实并不大,但Redis提供的功能更增强大一些,读写速度也很快。因此咱们选用了redis来缓存数据。Redis把数据以key—value的形式缓存到内存中,并提供了多种数据存储类型(string,set,list,hash等),还自身提供了持久化功能(2种),还能够把数据备份到磁盘中(Redis的SAVE命令用于建立当前 Redis 数据库的备份),防止redis宕机时的数据丢失。(会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步)。咱们使用的是spring与jedis整合的客户端,能够利用jedis作分片式集群,解决了redis内存受限的问题。

 

以前实现的登陆和注册是在同一个tomcat内部完成,而如今系统架构是每个系统都是由一个团队进行维护,每一个系统都是单独部署运行一个单独的tomcat,因此,不能将用户的登陆信息保存到session中(多个tomcat的session是不能共享的)(session共享?),因此咱们须要一个单独的系统来维护用户的登陆信息。咱们是这样作的,用户去登陆页面登陆,去数据库查询是否有该用户,若是没有提示用户,若是有就把用户信息保存到redis中,并生成一个token保存到cookie中,

 

 

在后台管理系统中采用了Maven的多模块化的管理,其中采用了水平切分的方式(垂直与水平划分的区别:垂直:功能模块明确,层次不够清晰,代码重用性差。水平:层次清晰,代码重用性高,独立维护。),将各层分层开发,这样作的好处是代码重用性高,层次清晰,易于独立维护。系统内部接口调用采用Httpclient,接口提供端采用RESTful方式的接口定义(一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件),系统之间的通知机制采用MQ的方式,使用RabbitMQ的实现,使用了RabbitMQ的消息订阅模式的消息机制;部署方面,采用了Nginx+tomcat的模式,其中nginx的做用一方面是作反向代理、负载均衡、另外一方面是作图片等静态资源的服务器;

在此项目中我主要负责后台管理模块,主要实现商品管理和商品规格参数管理,对商品和商品规格进行CRUD操做。;在实现前台调用后台数据时,为了实现系统间的调用,便使用了httpclient技术来实现此功能,在后台提供了须要调用的接口。(httpclient介绍,工做原理,优缺点)。若是在后台对商品进行操做,为了使前台数据与后台数据实现同步,咱们使用了RabbitMQ 消息队列机制实现商品同步功能(RabbitMQ介绍,工做原理,优缺点);

在此项目中,我还参与了购物车模块的开发。在开发这个模块时候,咱们考虑了会员在未登陆和登陆两种状况下把商品加入购物车,后台如何该保存商品信息。

在用户商品详情页点击加入购物车的时候,咱们用了登陆拦截器来判断用户是否登陆;

若是没有登陆,将商品信息保存到cookie中,当用户登陆后,再把商品持久到数据库中;可是考虑到cookie储存大小的问题,还有当cookie储存的数据越多就会影响响应速度,咱们决定使用redis来缓存用户在未登陆状态下的商品信息(redis介绍,原理,优缺点),在redis中设置缓存生存时间(如何作到的?),若是用户在规定时间内没有登陆,数据便会自动删除。若是用户在规定时间内登陆了,便会经过RabbitMQ消息队列机制将数据同步到数据库中;

相关文章
相关标签/搜索