谷粒商城
我才是真的封不觉
某外企高级开发,菜鸟一个,希望在博客记录自己技术的成长,目标是成为一个好脾气的技术大牛。
b站账号 觉哥学java
展开
-
144-RabbitMQ总结
1.作用异步 削峰 解耦2.流程图 + 各组件的介绍3.交换机类型3.1direct 根据直接匹配消息头中的路由键 与 交换机与队列绑定关系中的绑定键 一样时 才 被交换机发送到该队列3.2fanout不管 路由键与绑定键 直接发送到 该交换机绑定的所有队列3.3 topic消息头中的路由键 与 交换机与队列绑定关系中的绑定键模糊匹配 可以前后模糊都行小demo图如下4.客户端上演示5.代码中实现...原创 2021-11-27 21:58:33 · 1494 阅读 · 2 评论 -
144-商城业务-购物车-购物车流程总结
1.首先 离线状态 与 登录状态分为 离线状态 与 登录状态离线状态 设计是 模仿京东 在浏览器设置一个cookie 过期时间一个月 值整个唯一的就行 比如 UUID然后 购物车 的在 redis 中存储数据类型是 hash对应 java中类型是 Map<String,Map<String,CartItem>>外层key是 购物车id cart:用户id( 如果未登录 用户id取cookie的值)内层key是 skuid 然后值是订单项2.拦截器...原创 2021-11-25 23:38:47 · 1075 阅读 · 0 评论 -
143-商城业务-购物车-ThreadLocal用户身份鉴别
1.做了啥,咋做的标题写的ThreadLocal,阅读它的源码会发现,他就是一个线程Thread对象作为键的实现了map接口的类。之前我们说了分布式session解决方案springsession其实就是把session保存到redis中,这里在拦截器的预处理中取到session,判断是否包含用户信息,从而确定是否登录,若是没登录可以让跳转到登录页面,也可以就保存到离线购物车,之前京东还有离线购物车,但是现在好像没有了这里为什么要用threadlocal对象呢,因为拦截器与对应拦截方...原创 2021-05-08 17:19:46 · 386 阅读 · 0 评论 -
142-商城业务-购物车-数据模型分析+VO编写
1.需要实现哪些功能+实现采用技术购物车分为离线与在线购物车,未登录时可以将商品添加到购物车中,此时登录后,离线购物车中的商品会自动被添加到用户购物车中,当然只针对同一浏览器采用的是redis进行存储,因为考虑到购物车中的数据,增删改查可能都很频繁,所以不放到持久数据库中,具体需要实现的功能如下2.数据模型分析+VO编写先打开京东,看看京东的购物车中都有些啥东西,分析就不用多说了,基本就那些属性:图片,单价,总价,属性,数量等等具体包含哪些属性直接看下面vo吧创建包跟..原创 2021-05-06 15:38:11 · 426 阅读 · 0 评论 -
141-商城业务-购物车-环境搭建
1.创建购物车模块添加相关依赖添加common依赖,主要为继承nacos相关依赖添加配置启动类上添加feign相关注解2.端口映射3.前端文件拷贝4.网关服务中添加相关配置5.启动测试启动网关及购物车服务后,访问测试如下页面中的首页跳转不成功,再修改下...原创 2021-05-06 15:20:27 · 178 阅读 · 0 评论 -
140-商城业务-认证服务-一篇文章带你解决单点登录+流程演示+源码提供
1.什么是单点登录SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统实现方式,下面摘录自百度百科,可能大家对cookie与session都不明白什么意思,下面我简单介绍下cookie:是本次实现单点登录的核心参与人员,它通常是保存在内存中的,有失效性,有域名关联,在浏览器f12能看到这里就是2.简要单点登录系统 体验(1)配置域名映射(2)访问客户端1跳转到认证服务器,填写用户信息后进行认证(3)认证成功后成功跳转到..原创 2021-04-30 22:27:02 · 269 阅读 · 1 评论 -
139-商城业务-认证服务-SpringSession原理
简而言之就是利用了装饰者模式在过滤器中把原生的request与response替换了,session都是要通过request.getSession()来获取的,利用这点把request包装类中getSession重写了,改成从redisRepository里面取,然后过期时间自动续期也实现了,比如过期时间为30分钟,那么浏览器开着时会自动需求,浏览器关闭后30分钟后过期点进注解,一层层看代码,主要代码为如下三处...原创 2021-04-27 16:44:28 · 208 阅读 · 0 评论 -
138-商城业务-认证服务-SpringSession整合+序列化方式修改+自定义SpringSession完成子域session共享
看完下面内容你会发现全篇做的事其实下面一句话就说完了,你只需要完成下面这几个步骤,并且页面跨域跳转时成功显示了session内的内容那么就成功了添加依赖 添加配置 启动类加注解 代码给session内添加数据 实体类序列化注解添加页面通过session获取登录用户名1.添加依赖 <dependency> <groupId>org.springframework.session</groupId> ...原创 2021-04-27 12:53:37 · 548 阅读 · 0 评论 -
137-商城业务-认证服务-分布式session不共享不同步问题与最终解决方案得出
1.cookie与session是个啥?数据格式:键值对保存位置:Session信息是存放在server端,但session id是存放在client cookie的Cookie是完全保持在客户端的如:IE firefox 当客户端禁止cookie时将不能再使用生命周期:两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)举例:比如我登录CSDN,第一次登录时通过用原创 2021-04-26 14:22:34 · 238 阅读 · 0 评论 -
136-商城业务-认证服务-账号密码登录完成
1.大致流程登录跟之前注册的代码差不多登录大致流程就是修改表单,添加name与表单提交地址,认证服务后台封装vo获取后调用member服务内的登录功能 service的登录方法内先 根据用户名或者手机号获取密码,使用md5的matches方法比较,如果密码相同则登录成功跳转到首页,如果不同 则把报错信息带回登录页显示因为跟上一篇注册的代码结构基本差不多,所以这里代码就不贴了2.报错期间授权服务启动时 报了一个错,bean重复了才发现注册跟登录服务接口都是调的memb...原创 2021-04-26 11:07:56 · 257 阅读 · 0 评论 -
135-商城业务-认证服务-注册功能整体实现
这里完成主体功能,省略部分细节了,比如对手机号与用户名的重复校验,后面赶着面试,得做快点1.前端注册表单核心代码 <form method="post" action="/regist" class="one"> <div class="register-box"> <label class="username_label">用 户 名 <input maxlength="20" name="userName" type.原创 2021-04-25 00:01:47 · 192 阅读 · 0 评论 -
134-商城业务-认证服务-MD5盐值加密
1.概念2.用法加密encode,解密decode相当于给你封装好了 同样的密码可能撒不同的盐值,但是解密后依然还是相同的原密码 BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); String encodePassword = bCryptPasswordEncoder.encode(memberRegistVo.getPassword()); ..原创 2021-04-24 23:48:26 · 151 阅读 · 0 评论 -
133-商城业务-认证服务-验证码防刷校验
1.auth服务引入redis依赖2.添加redis主机与端口的配置端口默认为63793.添加验证码前缀4.添加验证码刷新频率异常5.后端代码6.前端代码7.发送短信直接在通过feign调用第三方服务中打印或者存到redis中算了这样来测试,就不用真实的验证码短信服务了...原创 2021-04-20 22:47:22 · 1271 阅读 · 0 评论 -
day130-商城业务-商品详情-异步编排优化
1.配置线程池一般的应用整一个线程池就够了,有可能根据业务还是啥的整俩三个,这里我们整一个,直接bean注入使其可配置package com.atguigu.gulimall.product.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.concurrent.Exec原创 2021-04-20 16:46:35 · 214 阅读 · 0 评论 -
day129-商城业务-商品详情-详情页渲染
<!DOCTYPE html ><html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="/static/item/scss/shop.css" /> <link rel="stylesh.原创 2021-04-19 23:55:14 · 372 阅读 · 0 评论 -
day128-商城业务-商品详情-销售属性组合
1.sql母的是查出某spu下所有销售属性的组合SELECT ssav.`attr_id`,ssav.`attr_name`, GROUP_CONCAT( DISTINCT ssav.attr_value)FROM pms_sku_info siLEFT JOIN pms_sku_sale_attr_value ssav ON ssav.`sku_id` = si.`sku_id`WHERE si.`spu_id` = 3 GROUP BY ssav.`attr_id`,ssav.`a原创 2021-04-19 17:25:36 · 421 阅读 · 0 评论 -
day126-商城业务-商品详情-规格参数获取
1.规格参数是啥就是我们之前封装的属性分组里的属性,我们现在一组一组给他获取出来2.sql根据三级分类与spuId查出属性分组与对应属性的相关信息SELECT pav.`spu_id`,ag.`attr_group_id`,ag.`attr_group_name`,ag.`catelog_id`,a.`attr_id`,a.`attr_name`,pav.`attr_value` FROM pms_attr_group ag LEFT JOIN pms_attr_attrgro...原创 2021-04-19 16:33:58 · 277 阅读 · 0 评论 -
day124-商城业务-商品详情-环境搭建
还是老样子,还是那几步1.添加域名映射2.网关中添加配置3.把详情页复制到product模块中,然后改名为item,html4.动静分离nginx放前端文件的地方创建item文件夹,然后把前端文件上传上去5.修改原本的引用路径为新的nginx内的6.创建ItemController代码如下,就是做一个详情页的跳转package com.atguigu.gulimall.product.web;import org.springfra.原创 2021-04-18 19:19:47 · 171 阅读 · 0 评论 -
day123-商城业务-异步编排-CompletableFuture
待补充原创 2021-04-11 15:08:48 · 271 阅读 · 0 评论 -
day132-商城业务-认证服务-登录注册路径映射+好玩的验证码倒计时前端实现
1.把登录注册的链接都设置好全局收登录注册主页把这三个链接分别改为http://auth.gulimall.com/login.html http://auth.gulimall.com/reg.htmlhttp://auth.gulimall.com2.添加mvc配置类用来作为单纯的页面跳转就不需要在controller中写了package com.atguigu.gulimall.auth.config;import org.springframework...原创 2021-04-11 19:14:15 · 236 阅读 · 0 评论 -
day131-商城业务-认证服务-环境搭建
1.创建新模块认证模块2.创建时页面引入依赖3.引入common依赖由于我们不需要访问数据库,都是通过feign调用远程接口所以排除 mybatis-plus依赖4.添加应用名称端口以及nacos注册中心地址,这里我们配在本机所以其实不配也行,默认就是localhost:88485.添加注解,nacos与feign的客户端相关6.迁移前端文件到nginx由于动静分离了,前端文件统一挪到nginx的static文件夹下7.修改登录与注册...原创 2021-04-11 17:12:14 · 150 阅读 · 0 评论 -
day122-异步-线程池详解
1.为什么要使用线程池当然是大量的实际业务场景中发现前三种线程的初始化方式不好用呗,所以才有了对线程进行管理的这样一个对象的抽象封装也就是线程池具体线程池好处在哪里呢?这里我就不多说了,前人总结的经验,有时间的可以瞧瞧百度百科https://baike.baidu.com/item/%E7%BA%BF%E7%A8%8B%E6%B1%A0/4745661?fr=aladdin主要概括起来就以下几点2.线程池初始化方式及七大参数知道为啥要使用这玩意了,下面聊聊咋用首先,为啥.原创 2021-04-08 00:12:00 · 310 阅读 · 0 评论 -
day121-异步-初始化线程的四种方式
不多说,直接上代码把代码复制过去运行下就知道了package com.atguigu.gulimall.search.thread;import java.util.concurrent.*;/** * @author rengang * @version 1.0 * @date 2021/4/7 22:11 */public class ThreadTest { //一般在项目启动时创建线程池根据需求创建一到几个 保证最大线程数量运行时不会宕机.并且可以 //.原创 2021-04-07 23:13:47 · 275 阅读 · 0 评论 -
day120-商城业务-检索服务-页面分页数据渲染
1.关键词收索添加js方法 function searchByKeyWord(){ searchProducts('keyword',$('#keyword_text').val()) }元素添加id,然后超链接调用方法添加2.分页上一页在不是第一页的时候显示,下一页在不是最后一页的时候显示给他俩添加自定义属性,跳转的时候用的到查询结果对象类中加入页码集合的属性查询时加入页码集合 List&l..原创 2021-04-06 18:33:13 · 182 阅读 · 0 评论 -
day119-商城业务-检索服务-页面筛选条件渲染
品牌超链接修改为如下 <a th:href="${'javascript:searchProducts("brandId",'+brand.brandId+')'}">属性超链接修改为如下 <a th:href="${'javascript:searchProducts("attrs&am原创 2021-04-06 00:25:40 · 194 阅读 · 0 评论 -
day118-商城业务-检索服务-页面基本数据渲染
上一节已经测试好检索与返回商品数据了1.右侧商品数据渲染可以看到如下图,我们当前右侧商品部分数据都是页面写死的右键检查元素,在list.html中找到前端代码位置一个rig_tab为一行的内容保留一个其它都删了,我们开始改保留的那部分有一样的内容,我们再删掉其他三份改完后内容如下 <div class="rig_tab"> <div th:each="produ.原创 2021-04-02 17:32:57 · 212 阅读 · 0 评论 -
day117-商城业务-检索服务-SearchRequest构建-检索+排序、分页、高亮+聚合&测试
1.DSL语句概览与分析此篇我要做的就是完成DSL代码层面的实现,大致的结构如下,详细的DSL语句上篇已经贴出来了包含计算分数的must查询与不计算的filter外面被bool然后最外面被query对象包着然后是排序,然后是分页,然后是高亮,最后是聚合分析2.上代码...原创 2021-04-02 07:21:46 · 712 阅读 · 0 评论 -
day116-商城业务-检索服务-检索DSL测试-聚合部分
1.修改映射中的内容老的映射为如下,可以看到许多字段的index及doc_values都为false,那么这些字段将无法用于检索与内容的显示{ "product" : { "mappings" : { "properties" : { "attrs" : { "type" : "nested", "properties" : { "attrId" : { "t...原创 2021-04-01 21:10:25 · 191 阅读 · 0 评论 -
day115-商城业务-检索服务-检索DSL测试-查询部分
1.DSL回顾从上次敲DSL已经过了两三个月了,这次再来试试如下是查询的啥?查询的是标题包含华为没有库存,商品品牌id为6或8的商品知识点:组合查询使用bool,match分词后收索,term使用一整个关键词去搜索不进行分词,filter不会去计算任何分值,也不会关心返回的排序问题,因此比must啥的效率会高一点GET product/_search{ "query": { "bool": { "must": [ { "match": {原创 2021-04-01 01:34:52 · 202 阅读 · 0 评论 -
day115-商城业务-检索服务-检索查询参数模型+检索返回结果模型 分析抽取
1.看图思考对比京东的页面,以及之前我们sku的数据模型然后,思考我们查询条件与查询结果实体都该封装些啥2.查询条件包含的几部分3.实体封装查询条件封装实体如下package com.atguigu.gulimall.search.vo;/** * @author rengang * @version 1.0 * @date 2021/3/31 11:00 */import lombok.Data;import java.util.List;/**..原创 2021-03-31 16:26:40 · 249 阅读 · 0 评论 -
day114-商城业务-检索服务-调整页面跳转
1.引入页面热启动依赖因为我们前端页面要经常修改,重启比较麻烦加了下面依赖后,以后文件修改后,ctrl+F9即可 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>原创 2021-03-30 23:47:04 · 209 阅读 · 0 评论 -
day113-商城业务-检索服务-搭建页面环境
1.引依赖gulimall-search模块内引入thymeleaf依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>2.从资料内复制收索首页原创 2021-03-30 10:52:35 · 202 阅读 · 0 评论 -
day112-缓存-学会SpringCache看这篇就够了(入门,注解使用,自定义配置以及不足与解决方案)
1.简介之前我们说了关于读模式写模式的一些概念,以及对于缓存一致性的解决方案这一次说的是springcache,相当于简化前面的固有操作,可以理解为对缓存的一个抽象,他是spring集成组件的一部分,有了他的话我们使用缓存就简单多了,之前许多操作往往一个注解就搞定了,官方学习链接如下https://docs.spring.io/spring-framework/docs/5.2.13.RELEASE/spring-framework-reference/2.进一步了解应用要.原创 2021-03-23 03:10:34 · 336 阅读 · 0 评论 -
day111-缓存-分布式锁-缓存一致性解决看这里就够了
1.缓存一致性是个啥就是缓存里的数据与数据库里的数据是不是相同的,这种一致性其实也分为实时一致性与最终一致性2.保证缓存一致性的两种常用方式这两种方式如下图,可以看到都会存在一定的问题双写模式很明显,线程一由于网络或者啥原因,先写库但是却后于线程二刷缓存,缓存内数据自然是有误的失效模式如图,线程一写db然后删缓存,没啥问题,线程二写db,然后还没删缓存的时候,线程三读缓存,线程三此时相当于读的内容中缺少了线程二写入db的内容,也就是此时缓存是少了线程二写的内容的,然后线程原创 2021-03-22 01:40:51 · 298 阅读 · 0 评论 -
day110-缓存-分布式锁-Redisson-闭锁countdownlatch测试
1.countdownlatch概念他是啥,做啥用?其实就相当于是个计数器,比如你某个线程运行前,必须有10个线程运行你才能运行,那么就可以用这玩意来保证,实际上有啥场景呢,比如你电脑开机,bios检查内存显卡啥的正常,加载啥界面设置,加载操作系统等等线程都运行好了你才进入桌面2.模拟场景这里我们模拟一场跑步比赛,比赛共十个人,全部人都跑完或者时间超过十分钟比赛就结束上代码 @RequestMapping({"/gameProcess"}) @ResponseB.原创 2021-03-21 23:13:49 · 309 阅读 · 0 评论 -
day109-缓存-分布式锁-Redisson-信号量测试
1.信号量?Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。可以把它简单的理解成我们停车场入口2.模拟场景模拟一个停车场停车的场景,总共300个停车位,这里我们方便测试假设3个不多说,上代码 @RequestMapping({"/park"}) @ResponseBody public String park(){ RSemaphore park = rediss.原创 2021-03-21 22:38:19 · 360 阅读 · 0 评论 -
day108-缓存-分布式锁-Redisson-读写锁
1.啥是读写锁关于读写锁,顾名思义,就是分别应用于读场景与写场景的两种锁读锁是共享锁,写锁是排他锁,啥意思呢?也就是写锁只能独立存在,而读锁可以一起存在通俗来说,同名读写锁中,当出现写锁时,同名读锁不能加锁,同名写锁也不能加锁而当存在读书锁时,同名读锁能加锁,但是同名写锁不能加锁。2.为什莫其实这都是为了符合数据一致性而设计的,你想一想,当你写往某张表写数据时,另一个人在往这张表读数据他是不是要在你写完数据后再读才是读的最新数据呢?这个时候就可以用读写锁来限制当然,如原创 2021-03-19 16:19:17 · 365 阅读 · 0 评论 -
day107-缓存-分布式锁-Redisson-lock看门狗原理-redisson如何解决死锁
关于说看门狗原理之前,先看看下面两行代码,哪一行用了看门狗呢?第二行代码跟源码我们会发现,带了过期时间的话,会执行lua脚本,执行上锁操作,然后过期时间是你设置的10s,所以一般要根据业务执行的平均时间然后再适当增加来设置过期时间,以保证业务执行完之前锁还没过期第一行代码再仔细跟代码的话关于看门狗部分:就是上锁时会有个过期时间,然后看门狗其实就是个定时任务,在每隔1/3默认时间时也就是10s执行一次,然后把过期时间蓄满,所以在业务完成执行完成之前,锁不会自动过期,而业务完成之原创 2021-03-18 17:35:07 · 427 阅读 · 0 评论 -
day106-缓存-分布式锁-Redisson-可重入锁介绍及lock锁测试
1.可重入锁介绍什么是可重入锁,举个例子现在我有锁对象lock,在调用A方法内,有用lock锁住锁住后在A方法内有对B方法的调用,B方法内又有用lock锁住,如果不是可重入锁,那么调用B方法时就死锁了,因为A方法内lock锁还不会释放,如果是可重入锁,那么可以直接运行B方法,看到这你应该明白了,同一线程内,一旦获取到了某个锁,那么线程后续执行还需要此锁,那么可以直接使用想要详细了解参考:https://blog.csdn.net/yanyan19880509/article/d.原创 2021-02-12 16:16:42 · 295 阅读 · 0 评论 -
day105-缓存-分布式锁-Redisson简介&整合
1.简介之前已经说了分布式环境下我们需要使用使用分布式锁,而java语言中分布式锁的实现就是Redisson,他跟jedis,lettuce它们一样也是操作redis的一个客户端,只是里面功能更强大而已https://github.com/redisson/redisson/wiki/Table-of-Content打开后右侧即为中文文档的目录2.整合(1)引入依赖https://mvnrepository.com/search?q=redisson复制依赖添加到项目produc..原创 2021-02-10 17:05:55 · 175 阅读 · 0 评论