电商项目介绍
- 格式:pdf
- 大小:173.85 KB
- 文档页数:2
电商项⽬介绍
在深圳做开发做了两年。⼤⼤⼩⼩参与过三个项⽬的开发,⼀个是某医院内部的管理系统,⼀个是电商,最近做的是⼀个电商项⽬。前⼀个
项⽬采⽤的是ssh框架搭建的,最近的项⽬采⽤的是ssm框架搭建的。在实际开发中,我觉得这两个框架,他们最⼤的区别在于与mybatis的
区别。Hibernate与mybatis相⽐较,mybatis更为轻便、灵活,容易掌握。mybatis可以把sql语句从代码中分离了出来,放在了配置⽂件中书
写,⼤⼤降低⾥java代码与SQL语句的耦合度,更容易对sql语句操作,重要的是mybatis还可以书写动态的sql语句,但mybatis也存在⼀些
缺陷,⽐如mybatis本⾝的缓存机制没有hibernate那么完善,hibernate除了本⾝有良好的缓存机制,还可以使⽤第三⽅缓存。Hibernate较完
整的封装了JDBC,但学起来要⽐mybatis更困难⼀些。Hibernate的DAO层开发⽐MyBatis简单,对对象的维护和缓存要⽐MyBatis好。
(springmvc与Struts的区别:springmvc是⽅法级别的拦截,⼀个⽅法对应⼀个request上下⽂,⽽⽅法同时⼜跟⼀个url对应,参数的传递是
直接注⼊到⽅法中的,是该⽅法独有的。
struts2是类级别的拦截, ⼀个类对应⼀个request上下⽂, struts是在接受参数的时候,可以⽤属性来接受参数, 这就说明参数是让多个⽅
法共享的,这也就⽆法⽤注解或其他⽅式标识其所属⽅法了)。
该商城是⼀个综合性B2B平台,主要针对医药药店。产品涵盖滋补品,营养保健品,中西药,医疗器械等相关产品。
在整个项⽬中,我们采⽤的是nginx+tomcat来部署的(⾯试官会可能问nginx是谁来部署的?如何部署的?Nginx的执⾏流程,优点),
nginx⼀⽅⾯做加载静态资源的服务器,另⼀⽅⾯来做反向代理和负载均衡。因为该项⽬需要在多个环境中运⾏,我们利⽤了nginx的反向代
理解决了不同环境同系统访问地址不统⼀带来的问题。
因为整个项⽬实现的功能较多, 所以采⽤分布式的设计,整个项⽬包括后台管理系统、前台系统、订单系统、登录系统、搜索系统、购物车
系统等,这样做的好处是使每个功能模块独⽴出来,降低了各系统之间的耦合度,增删⼀个功能不会影响其他功能模块。
因为项⽬是采⽤分布式架构设计的,各模块之间是相互独⽴的,⽽各个模块的访问路径⼜是不同的,所以当跨域访问的时候请求数据的时候
会受到跨域受限制的问题。⽐如当⽤户⾸次访问该⽹站⾸页的时候。⾸页页⾯会异步请求后台管理系统商品的数⽬。这是就会出现跨域受限
的问题。以前开发时,如果在本模块中,我们是通过ajax异步请求数据的,但是不⽀持Ajax跨域的。Jsonp通过script标签的src可以跨域请求
的特性。加载资源,将加载的资源(通过⼀个⽅法名将⼀个数据进⾏包裹)当做是js脚本解析,定义⼀个回调函数。(是怎么实现的)获取
传⼊的数据。我们使⽤jsonp是因为jsonp的兼容性⽐较好。并且在请求完毕后通过callback的⽅式回传结果。但是Jsonp有⼀个缺点,是只⽀
持get请求⽽不⽀持post等其他类型的http等。
这样我们解决了浏览器访问当前页⾯去加载后台数据出现的跨域问题。但是另⼀个问题⼜来了。其他系统该如何调⽤后台系统的数据呢。我
们想可以发送http请求来访问后台数据。我们想到的是httpclient来解决此问题。因为httpClient可以使⽤java代码模拟浏览器发送http请求
(get⽅法如何传递参数?定义uribuilder对象,在uribuilder⾥设置参数,以key和value,都是string类型的,然后将uribuilder放到uri中,在
后将uri讲给httpget请求。Post⽅法如果传输数据?模拟表单提交,将数据封装到list集合中,然后将集合数据放⼊构造的表单实体中,在将
表单实体请求放到httppost对象中)向外抛出⼀个接⼝,执⾏过程是:1.创建httpClient对象,2.构建请求POST,get请求,3.如果有参数,就
去构造参数。
3.1 get
使⽤uribuilder去构造请求参数
3.2 post
构建表单实体,把表单实体放⼊到 post请求对象中。
4、执⾏请求 ,并且接受响应
5、处理响应结果
6. 释放连接。⽆论执⾏⽅法是否成功,都必须释放连接。
HttpClient实现认为是线程安全的。
每次连接发起Http请求的时候都会重新建⽴连接(经历3次握⼿),⽤完就会关闭连接(4次挥⼿),这样会消耗很多时间,所有我们采⽤了连接
池。如果不采⽤连接池,每次连接都会打开⼀个端⼝,在⼤并发的情况下系统的端⼝资源很快就会被⽤完,导致⽆法建⽴新的连接。
像项⽬中的⾸页的⼤⼴告和商品类这些不需要经常修改的数据。如果⽤户每次刷新页⾯都要从数据库中查询,这样就会浪费资源和增加数据
库的压⼒。所以我们想当把这些数据添加到⼀个缓冲区中。⽬前⽐较主流的缓存技术有和Memcached,单纯从缓存命中的⾓度来
说,Memcached要⾼⼀些,可和Memcache的差距其实并不⼤,但Redis提供的功能更加强⼤⼀些,读写速度也很快。所以我们选⽤了redis
来缓存数据。Redis把数据以key—value的形式缓存到内存中,并提供了多种数据存储类型(string,set,list,hash等),还⾃⾝提供了持
久化功能(2种),还可以把数据备份到磁盘中(Redis的SAVE命令⽤于创建当前 Redis 数据库的备份),,防⽌redis宕机时的数据丢失。
(会周期性的把更新的数据写⼊磁盘或者把修改操作写⼊追加的记录⽂件,并且在此基础上实现了master-slave(主从)同步)。我们使⽤的
是与jedis整合的客户端,可以利⽤jedis做分⽚式集群,解决了redis内存受限的问题。
之前实现登录和注册是在⼀个tomcat内部进⾏的。⽽现在的系统架构是每⼀个系统都是由⼀个团队进⾏维护的,每个系统都是单独部署的运
⾏⼀个单独的tomcat,所以,不能将⽤户的登录信息保存到session中(多个tomcat的session是不能共享的)(session共享?),所以我们
需要⼀个独⽴的系统来维护⽤户登录的信息。我们是这样做的,⽤户去登录页⾯登录,去数据库查询是否有该⽤户。如果没有⽤户提⽰⽤户,如果有⽤户信息保存到redis中,并⽣成token保存到cookie中。
在后台管理系统中采⽤了maven多模块开发。其中采⽤⽔平切分的⽅式(垂直和⽔平划分的区别:垂直:功能模块明确,层次不够清晰,代码chong重⽤性查,⽔平:层次清晰,代码重⽤性搞,独⽴维护)将各层分层开发,这样做的好处是代码重⽤性⾼,层次清晰,易于独⽴维护。
系统内部接⼝调⽤采⽤httpClient,接⼝采⽤RESTful风格⽅式的接⼝定义(⼀种软件架构风格,设计风格⽽不是标准。只是提供了⼀组设计
原则和约束条件)。系统之间的通知机制采⽤了MQ的⽅式,使⽤RabbitMQ的实现,使⽤RabbitMQ的消息订阅模式的消息机制,部署⽅
⾯,采⽤了Nginx+tomcat的模式,其中nginx的作⽤⼀⽅⾯是做反向代理、负载均衡、另⼀⽅⾯是做图⽚等静态资源的服务器;
在此项⽬中我主要负责后台模块。主要实现商品管理和商品规格参数管理。对商品和商品规格进⾏CRUD操作。在实现前台调⽤数据的时
候,为了实现系统之间的调⽤。便使⽤了httpclient技术来实现此功能,在后台提供了需要调⽤的接⼝。(httpclient介绍,⼯作原理,优缺
点)。如果在后台对商品进⾏操作。为了使前台和后台数据实现同步,我们使⽤了RabbitMQ 消息队列机制实现商品同步功能(RabbitMQ介
绍,⼯作原理,优缺点);
在此项⽬中,我还参加了购物车模块的开发。在开发这个模块的时候,我还考虑了会员在未登录和登录的情况下,把商品加⼊到购物车,后
台如何保存商品信息。
在⽤户详情页点击加⼊购物车的时候,我们⽤了登录拦截器来判断⽤户是否登录,如果没有登录,将商品信息保存到cookie中,当⽤户登录
后,再把商品持久化到数据库中,但是考虑到cookie存储⼤⼩的问题。还有当cookie存储的数据越多就会影响响应速度。我们决定使⽤redis
来缓存⽤户在未登录的状态下的商品信息(redis的原理,介绍,优缺点)在redis中设计缓存⽣存时间(如何做到的),如果⽤户在规定的
时间没有登录,数据变回⾃动删除,如果⽤户在规定的时间登录了,便会使⽤RabbitMQ消息队列机制将数据同步到数据库中。