1.java秒杀项目第一课-项目工程

1.java秒杀项目第一课-项目工程 内容介绍本文介绍了使用Trea如何进行项目创建技术点介绍课程内容介绍学习目标设计一个秒杀系统秒杀对我们来说都不是一个陌生的东西。每年的双11,618以及时下流行的直播等等。秒杀然而这对于我们系统而言是一个巨大的考验。那么如何才能更好地理解秒杀系统呢我觉得作为一个程序员你首先需要从高维度出发从整体上思考问题。在我看来秒杀其实主要解决两个问题一个是并发读一个是并发写。并发读的核心优化理念是尽量减少用户到服务端来“读”数据或者让他们读更少的数据并发写的处理原则也一样它要求我们在数据库层面独立出来一个库做特殊的处理。另外我们还要针对秒杀系统做一些保护针对意料之外的情况设计兜底方案以防止最坏的情况发生。其实秒杀的整体架构可以概括为“稳、准、快”几个关键字。所谓“稳”就是整个系统架构要满足高可用流量符合预期时肯定要稳定就是超出预期时也同样不能掉链子你要保证秒杀活动顺利完成即秒杀商品顺利地卖出去这个是最基本的前提。然后就是“准”就是秒杀 10 台 iPhone那就只能成交 10 台多一台少一台都不行。一旦库存不对那平台就要承担损失所以“准”就是要求保证数据的一致性。最后再看“快”“快”其实很好理解它就是说系统的性能要足够高否则你怎么支撑这么大的流量呢不光是服务端要做极致的性能优化而且在整个请求链路上都要做协同的优化每个地方快一点整个系统就完美了。所以从技术角度上看“稳、准、快”就对应了我们架构上的高可用、一致性和高性能的要求高性能。秒杀涉及大量的并发读和并发写因此支持高并发访问这点非常关键。对应的方案比如动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化一致性。秒杀中商品减库存的实现方式同样关键。可想而知有限数量的商品在同一时刻被很多倍的请求同时来减库存减库存又分为“拍下减库存”“付款减库存”以及预扣等几种在大并发更新的过程中都要保证数据的准确性其难度可想而知高可用。现实中总难免出现一些我们考虑不到的情况所以要保证系统的高可用和正确性我们还要设计一个 PlanB 来兜底以便在最坏情况发生时仍然能够从容应对。项目搭建Trea创建项目创建controller层在此层下创建DemoController增加一个hello接口。端口被占用的情况使用Trae CN创建springboot3 项目后修改端口AI使用测试根据mysql的数据库链接在mytest数据库中创建一张 tuser的数据表将以上直接执行在工程里maven创建项目工程目录dependencies!-- web组件 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--mysql 依赖--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependency!-- MyBatis-Plus 依赖 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-spring-boot3-starter/artifactIdversion3.5.5/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies创建 DemoController 测试packagecom.yxl.seckill.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;ControllerRequestMapping(/demo)publicclassDemoController{GetMapping(/hello)publicStringhello(){returnhello;}}学生可以尝试创建使用不同的注解进行方法创建并进行访问。PostMapping专门用于映射POST请求PutMapping专门用于映射PUT请求DeleteMapping专门用于映射DELETE请求PatchMapping专门用于映射PATCH请求RestFul风格接口Contorller与RestController的区别由于配置了mysql 的依赖 需要进行数据配置报错信息编写通用返回类packagecom.yxl.seckill.vo;importlombok.AllArgsConstructor;importlombok.Getter;importlombok.ToString;ToStringGetterAllArgsConstructorpublicenumResponseCode{//通用状态码SUCCESS(200,success),ERROR(500,服务端异常),//登录模块5002xxSESSION_ERROR(500210,session不存在或者已经失效),LOGINVO_ERROR(500211,用户名或者密码错误),MOBILE_ERROR(500212,手机号码格式错误),REPEATE_ERROR(400212,重复下订单),EMPTY_STOCK(400210,库存不足);privatefinalIntegercode;privatefinalStringmessage;}packagecom.yxl.seckill.vo;importlombok.Data;DataNoArgsConstructorAllArgsConstructorpublicclassCommonResultT{privateIntegercode;privateStringmessage;privateTdata;// 成功但不返回数据的方法publicstaticTCommonResultTsuccess(){returnsuccess(null);}// 成功并返回数据的方法publicstaticTCommonResultTsuccess(Tdata){CommonResultTresultnewCommonResult();result.setCode(ResponseCode.SUCCESS.getCode());result.setMessage(ResponseCode.SUCCESS.getMessage());result.setData(data);returnresult;}// 错误响应的方法publicstaticTCommonResultTerror(ResponseCoderesponseCode){CommonResultTresultnewCommonResult();result.setCode(responseCode.ERROR.getCode());result.setMessage(responseCode.ERROR.getMessage());returnresult;}// 通用错误响应方法publicstaticTCommonResultTerror(){returnerror(ResponseCode.ERROR);}}关于提示CommonResult 需要实例化的是lombok版本的问题使用一下版本。dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.30/versionscopetrue/scope/dependency[[1.1 Controller中不同的请求方式与返回请求体]]