# java-study7-gmallparent **Repository Path**: heyuyou/java-study7-gmallparent ## Basic Information - **Project Name**: java-study7-gmallparent - **Description**: 电商项目 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-03-29 - **Last Updated**: 2023-03-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java-study7-gmallparent #### 前端代码 - 商城后台:https://gitee.com/weiranyi/java-study7-gmallparent-front-end-gmall-admin #### 笔记 - 笔记1(中间件的搭建):https://zhuanlan.zhihu.com/p/586013397 - 笔记2(项目模块搭建):https://zhuanlan.zhihu.com/p/587846521 - 笔记3(项目优化-SQL调优&异步编排等):https://zhuanlan.zhihu.com/p/588811069 - 笔记4(ES)https://zhuanlan.zhihu.com/p/591663092 - 笔记5(单点登录,feign隐式传参,购物车,订单,下单,MQ)https://zhuanlan.zhihu.com/p/591948675 - 笔记6(git-删除远程分支提交记录的操作笔记)https://zhuanlan.zhihu.com/p/402541888 - rabbitmq:https://gitee.com/weiranyi/java-study5-rabbitmq - 笔记7(分布式事务,秒杀,物流)https://zhuanlan.zhihu.com/p/594181193 #### 收获 - 1.做saveSpuInfo的时候体会到了为啥要用VO接收前端参数,一方面后端直接用entity接收嵌套JSON参数,需要 在entity增加属性,违反了实体类规范;另一方面需要修改多个实体类相对于直接定义一个VO比较繁琐 ``` SpuInfo /** * 当前属性的所有值 * * @TableField(exist = false) 数据库没这个字段 */ @TableField(exist = false) private List spuImageList; @TableField(exist = false) private List spuSaleAttrList; SpuSaleAttr @TableField(exist = false) private List spuSaleAttrValueList; ``` - 2.导入优化-以minio为例 ``` - MinioProperties: 该类用于读取配置文件中的参数信息 - MinioConfiguration:该类用于创建MinioClient,并将其放入Ioc容器 - MinioAutoConfiguration:该类自动协助开发者使用MinioConfiguration和MinioProperties - EnableMinio:注解类,方便要使用Minio的模块,注解方式导入 ``` - 3.错误码笔记 - 503:服务不可用 - 400:参数不对 - 4.分支名称修改练习 ``` 1、已推送远程仓库的情况 # 重命名本地分支 git branch -m web-all dev # 删除远程分支 git push --delete origin web-all # 上传新命名的本地分支 git push origin dev # 将本地分支与远程分支关联起来 git branch --set-upstream-to origin/dev ``` - 5.web-all ``` 浏览器->网关->web-all(IndexController)->Fegin客户端远程调用 ->服务器响应数据 ``` - 6.清除WindowsDNS缓存 ``` 1.查看系统内的dns缓存 ipconfig /displaydns 2.清空缓存 ipconfig /flushdns ``` - 7.网关从上到下匹配 ``` 会优先满足上面的规则 ``` - 8.数据库 ```sql # getValuesSkuJson---------------------------- # 1.sku_sale_attr_value与spu_sale_attr_value连接(目的不是查询数据,主要进行排序操作,以固定查询顺序) SELECT n.sku_id,GROUP_CONCAT(DISTINCT n.sale_attr_value_id ORDER BY n.sale_attr_value_id ASC SEPARATOR '|') value_json FROM (SELECT skusav.sku_id,skusav.sale_attr_value_id FROM sku_sale_attr_value skusav LEFT JOIN spu_sale_attr_value spusav ON skusav.sale_attr_value_id = spusav.id WHERE skusav.sku_id IN (SELECT id FROM sku_info WHERE spu_id = 29) ORDER BY skusav.sku_id,skusav.sale_attr_value_id,spusav.id) n GROUP BY n.sku_id ``` - 9.写代码得考虑很多健壮性问题,例如:上下架功能五次迭代探索 ``` 1.第一版:只考虑了数据库状态位 2.第二版:上架时考虑放入ES中 3.第三版:考虑下架时清空缓存同时位图状态为设置为0,上架时位图状态为设置为1 4.第四版:考虑一致性问题,引入了事务 5.第五版:考虑项目启动时,未上架商品详情信息不进位图 ``` - 10.购物车考虑商品数量的限制 - 总条数不超过200 - 每个商品有限制购买数量(依据优惠活动而定),如无则设置默认值 - 11. 主键增长 - long类型(64位) - 最大值是 9,223,372,036,854,775,807(2^63 -1),每天自增10000000 - 大概可以用 922,337,203,685 天 = > 大概 2,526,951,242年 - 大概 25,269,512世纪 - 综上:自增id没有容量限制一说,BUT每个表都按照自己的增长方式增长主键可能重复 - 解决:设置不同的增长步长,BUT扩容时比较麻烦同时每个数据库要维护自增键 - 升一个纬度解决方式:雪花算法 - 雪花算法(64位) - 组成:第一位不能用,41bit时间戳(ms)+10bit机器id+12bit序列号 - 1ms - 1/1024台 - 4096个ID - BUT,雪花算法BUG,如果机器时钟向过去调,就容易重复,不容许时间向过去调整 - 12.权限 - 防范:横向越权【业务越权】 及 纵向越权【数据越权】 - 横向越权:【登录可查订单->本来我只能查的订单,但我可以登录查别人的单】 - 纵向越权:【登录可看数据列表->我只能查10条自己的,结果查了100条我本没权的】 - 解决:加一堆判断 - 13.关单分析 ``` /** * 方案1:CompletableFuture.runAsync:这种方式占用了核心线程,30min不释放 * 方案2:scheduledExecutorService.schedule:同redis延迟双删的业务逻辑,但在当前场景下,占用内存,一旦宕机,任务丢失 * // 类似延迟双删得写法,不采用异步编排,采用Scheduled*这类能进行调度的线程池 * 方案3:定时扫描数据库(会有时效性问题【不能通过调整频率解决】) * select * from order_info where expire_time < new Date and order_status = UNPAID * 方案4:方案2和方案3都采用,2用来保证时效性,3用来防宕机 * * 方案5:消息队列的延迟队列 */ 方案2:伪代码 scheduledExecutorService.schedule(()->{ // 30分钟后执行 this.closeOrder(id,userId); },30,TimeUnit.MINUTES); 方案3:伪代码 // 得开启@EnableScheduling注解开启调度 (0:整秒启动 */30:表示每隔30min ) @Scheduled(cron = "0 */30 * * * ?") public void closeOrder() { // SQL,扫描全库,过期的订单就改为已关闭 } ``` - 14.kill java微服务进程 ``` jps winodws管理员状态:taskkill /pid 118191 -f ```