Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强
总时长 104:45:00 共408P
此文章包含第236p-第p247的内容
介绍
记得整合OpenFeign来进行远程调用或被别人远程调用
把static路径下的文件通过nginx映射到/usr/share/nginx/html
自己的端口和配置连接的nacos信息
开启服务的注册发现功能 @EnableDiscoveryClient
开启服务的远程调用功能@EnableFeignClients
在网关添加路由规则
根据路径映射到达虚拟机 在通过nginx转发给网关,再由网关找到我们的服务
业务编写
进入页面
离线购物车
还有一些复杂功能,如展示降价信息,优惠信息等
因为购物车是属于读写都很多的数据 所以使用文档型数据库好一些,如mongodb(性能不会带来太大的提升) 这里我们使用的是redis
因为redis默认数据是存在内存中的,所以宕机的时候购物车数据会消失,这里指定redis的持久化策略,来使数据持久化,这样虽然损失了一部分的性能,但是性能还是比mysql要高很多
临时购物车用localstrage,优点:后台压力小,缺点:无法通过大数据分析出当前用户喜欢的东西,无法定制化推荐
所以临时购物车这里也存到了redis里,但是注意离线存在redis可能会被攻击
用数组类型进行保存,缺点:修改时无法快速找到,需要遍历循环才能找到对应的商品进行修改
这里我们使用hash类型进行保存 (相当于 java 的 map)
这里的总价是通过单价和数量动态计算出来的,所以这里我们自定义一个get方法,防止被覆盖把@Data去掉
这里把set方法全都去掉
ThreadLocal用户身份鉴别
ThreadLocal同一个线程可以共享数据
这个是jsk1.8前是这样的,jdk1.8改成了thredlocal作为key
threadlocal好处就是线程结束了就没了,放session里太占空间 threadlocal不需要手动释放
拦截器不能只放在容器中(@Component注解放在容器中),需要进行配置
/** 所有请求
页面编写
ctrl + alt + m 快速抽取方法 也可以使用右键进行抽取
这里的设计有一些漏洞,如果商品的价格发生变化了,redis缓存中的数据会产生数据不一致问题,我设计的话 只在redis里存店铺ID,商品ID,skuID,数量,加入时间,最新修改时间,以及当前价格(方便以后提示是否降价等信息),然后去数据库或es里查询这些商品的最新信息
这里的错误提示是因为这里可能会修改 所以必须是final类型才可以,否则异步信息会报错
防止误刷新页面新添加商品到购物车(解决重复提交),这里做了个重定向
重定向不可能带model数据,转发才有
转发和重定向的区别
转发:是指服务器接收到一个请求后,将请求转发给另一个资源进行处理,并将该资源的处理结果返回给客户端。在这个过程中,转发后的资源对客户端是不可见的,客户端只知道自己访问了一个资源,而不知道这个资源是被转发到的。
重定向:是指服务器接收到一个请求后,发现该请求需要访问另一个资源才能得到响应,于是告诉客户端重新发送一个请求,访问另一个资源。在这个过程中,客户端会重新发送一个请求,访问另一个资源,因此客户端会知道自己访问了两个资源。
转发对客户端是不可见的,而重定向对客户端是可见的。转发比重定向快。转发只需要发送一次请求,而重定向需要发送两次请求。转发是服务器内部的处理机制,客户端不需要进行任何处理。
转发可以访问相对路径和绝对路径的资源,而重定向只能访问绝对路径的资源。因为转发是在服务器内部进行的,可以访问相对路径和绝对路径的资源。而重定向是在客户端进行的,只能访问绝对路径的资源。
离线和登录进行合并
es的优势才是查询 redis的优势是快
这里check==1就行了 没必要三元运算