您的位置:首页 > 编程语言 > Java开发

java如何高质量的介绍自己的电商开发项目--关于Spring MVC+Springboot+Mybatis等技术。

2020-04-06 23:15 148 查看

首先介绍这个项目。面试官您好,我做过的这个项目是旅游电商平台。

在整个项目中我们采用的是nginx+tomcat来部署的,nginx主要用来是做静态文件资源

服务器的还有做反向代理和负载均衡(不了解的哥哥姐姐们查一查,一般都会问到,

我面试的时候问到过我除了会tomcat还会什么我当时蒙了没答上来),因为这种电商

项目需要在多个环境中运行,我们利用了nginx的反向代理解决不同系统中带来的各种问题。
在做这个项目的时候有架构师因为涉及的功能比较多,所以会采用分布式架构设

计,整个项目包括,后台管理系统,商品首页系统,搜索系统,商品详细系统,登录

系统。购物车系统。订单系统等、这样分出来交给每个人做是为了使模块独立出来,

降低了各个系统之间的耦合度,增加一个新的功能不会影响到其他的功能模块。在做

浏览器访问前端页面去加载后端系统数据时出现的跨域问题,因为项目是采用分布式

架构设计的,个个模块是相互独立的,而且访问的路径都不一样,当时跨域请求数据

时会受到跨域受限的问题,比如当用户首次访问网站首页时,首页会异步请求后台管

理系统,加载商品的项目,之前我们是通过ajax异步请求数据来实现这个功能的,测试

中ajax不支持跨域就改用了jsonp来解决这个问题,jsonp通过script标签的src可以实现

跨域请求的特性,加载资源,将加载的资源通过一个方法名数据进行包裹,当做是js脚

本。就是定义一个回调函数通过获取传入的数据。使用jsonp兼容性还比较好,并且在

请求完毕后可以通过callback的方式来实现回传结果,但是jsonp只支持get请求不支持

post等其他类型的http请求。

我们可以通过http请求,来访问后台数据,当时我们想到的是是使用

httpclient(Dubbo)来解决此问题,因为Httpclient可以使用java代码模拟浏览器发送

请求(差不多,可能不准确,不全自己在动手查查)执行流程如下:
【HttpClient httpclient = new DefaultHttpClient();

//准备一个请求对象
HttpGet httpget = new HttpGet(“http://www.apache.org/”);

//此处还可以添加请求消息头header,如果是post还可以设置请求参数
//执行请求
HttpResponse response = httpclient.execute(httpget);

//检查响应状态
System.out.println(response.getStatusLine());

//获取响应实体的持有
HttpEntity entity = response.getEntity();

//如果响应不包含实体,则没有必要
//担心连接释放
if(entity!= null){
InputStream instream = entity.getContent();
try{

BufferedReader reader = new BufferedReader(
new InputStreamReader(instream));
//做一些有用的响应
System.out.println(reader.readLine());

} catch(IOException ex){

//在IOException的情况下,连接将被释放
//自动返回到连接管理器
抛出

} catch(RuntimeException ex){

//如果出现意外异常,您可能希望中止
// HTTP请求为了关闭底层
//连接并将其释放回连接管理器。
httpget.abort();
抛出

} finally {

//关闭输入流将触发连接释放
instream.close();

}}

//当不再需要HttpClient实例时,
//关闭连接管理器以确保
//立即释放所有系统资源
httpclient.getConnectionManager()。shutdown();

}】
1.创建出httpclient对象。

2.构建post和get请求。

3.如果有参数就去构造请求参数get和post各自构建的方式不一样。

4.执行请求,并且接受响应。

5.处理响应结果。

6.释放连接。无论何时执行方法是否成功,都必须释放连接。

httpclient访问线程是安全的因为每次发起http请求的时候都会重新建立起连接(差不多

三次)用完就会关闭连接(这是第四次),当然这样会消耗很多时间,采用了连接池

的方法。当然还有别的方法,如果不采用连接池都会导致每次打开一个端口,再大并

发的情况下导致端口资源很快就会被消耗完。,从而导致无法建立新的连接。

在使用get进行参数传递的时候在url中设置参数,通过key和value因为都是String类
型,然后将url传给httpget请求。Post的话模拟表单提交,将数据封装list集合中,将集合数据放入构造的表单实体中,在将表单实体请求放到httppost请求。

在项目中那些首页的大广告和商品类目这些不需要经常修改数据,就是说如果用户每次刷新页面的时候都要去数据库中查询这样的话就会浪费资源和增加数据库的压力。当时我们的解决方案是将这些数据添加到一个缓存中。我们使用的是redis把数据通过key-value的形式缓存到内存中,并且还提供了多种数据存储的类型:string、hash、list、set、sortedset、,还自身提供持久化功能,还可以吧数据备份到磁盘中,redis的save命令用于创建当前redis的数据库备份防止redis宕机的时候把数据丢失。总之就是会周期性的把数据写入磁盘或者把修改操作写入追加记录文件。对于redis内存受限的问题的话利用jedis做分片式集群。

还有的话单点登录系统。单点登录的话我之前实现的登录和注册时在同一个tomcat内部实现的,但是现在系统架构是每一个系统是由一个团队进行维护,每个系统都是单独部署运行一个单独tomcat,所以,不能将用户的登录信息保存到session中多个tomcat的session是不能共享的,就是session共享问题,所以需要一个单独的系统来维护用户的登录信息。我们是这样做的,用户去登录页面登录,发送含有用户信息的请求并且会携带cookie去服务端数据库查询是否有该用户,如果没有提示用户,如果有就把用户信息保存到redis中,并生成一个tooken保存到cookie。

在后台管理系统中采用了Maven多模块化的管理,采用了水平切分的方式,垂直于水平划分的区别,垂直:功能模块明确,层次不够清晰,代码重用性差。水平:层次清晰,代码重用性高,易于独立维护。分层开发,就能代码重用性高,层次清晰,易于独立维护。接口提供的话就是采用restful风格,这是一种软件架构风格当然设计风格不是标准,就是提供了一组设计原则和约束条件通知机制采用activemq模式。我负责的话就是后台管理模块,实现商品管理和商品规格参数管理,对商品和商品规格进行CRUD增删改查操作。在实现前台调用后台的数据时为了实现系统间的调用就是用了httpclient技术来实现此功能,提供了调用时的接口。在使用前台数据与后台数据同步实现的时候使用的activemq插件消息队列机制。

在此期间我还参与了购物车模块的开发,在这个模块中我们还考虑了会员在登录和未登录情况下把商品保存到购物车后台如何保存商品信息,会不会发生冲突。当时采用了登录拦截器这个插件来判断用户是否登录,如果没有登录就将商品信息保存到cookie中,当用户登录后,再把商品持久到数据库中,但是考虑到cookie才4k存储量小就决定使用redis来缓存,用户在未登录状态下商品信息,在redis中设置缓存生存时间,如果在规定时间内没有登录,数据就会自动删除,如果用户在规定时间内登陆了便会使用activemq机制将数据同步到数据库中。

最好再说其中的配置文件,这就看面试官的水平了如果是架构师项目经理那种的就别说了 除非你对web.xml config.xml 等等充分的掌握如果是 其实你可以感受出来他也半斤八两你就可以扯一些这些东西,看你个人吧,把自己做过的项目都吃透,大体都差不多,刚起步你报的错去了公司 几乎一查都有 而且把那些东西下载下来压缩 放到tomcat上跑 增增删删改改 功能能实现了就行 归根结底 还是同源 不会就查。好的谢谢关注!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐