自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 雪花算法详解

一句话概括:雪花算法是Twitter设计的根据时间戳、机器标识码和序列号生成的唯一长整型数。

2024-04-18 09:49:54 589

原创 【从零开始手搓12306项目】二十八、雪花算法(一阶段结束)

在common中新建一个util包,新建ShowUtil类,封装雪花算法。为每个数据中心和机器编号,保证每台机器生成的ID不重复。在高并发场景中,雪花算法是解决ID冲突的不错选择。修改memberservice。将代码提交到git仓库。

2024-04-18 09:49:51 166

原创 【从零开始手搓12306项目】二十七、集成校验框架

LOG.error("业务异常:{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());在MemberRegisterReg类中添加注解。MemberController中添加注解。在common模块的pom文件中添加依赖。* 校验异常统一处理。将代码提交到git仓库。

2024-04-18 09:49:47 168

原创 【从零开始手搓12306项目】二十六、使用自定义异常处理异常业务

在common模块新建exception包,新建BusinessExceptionEnum类。为了区分业务异常和系统异常,需要增加自定义异常类。生成get/set和tostring方法。新增BusinessRxceptin类。集成RuntimeExceptin。修改memberservice代码。生成get/set和构造函数。将代码提交到git仓库。

2024-04-18 09:49:24 154

原创 【从零开始手搓12306项目】二十五、增加统一异常处理

在common模块中新增controller包,新增ControllerException类。将代码提交到git仓库。

2024-04-17 10:56:32 196

原创 【从零开始手搓12306项目】二十四、封装请求参数和返回结果

member模块中ing新建req包,新建MemberRegisterReq类。在common模块中新建resp包,新建CommonResp类。写一个属性,并生成get/set和tostring方法。因为增加了无参构造,所以可以优化注册功能代码。将代码提交到git仓库。

2024-04-17 10:55:13 192

原创 【从零开始手搓12306项目】二十三、完成会员注册接口的开发

先写service,再写controller。在http文件中输入ptrp回车快速创建代码。将代码提交到git仓库。

2024-04-17 10:52:51 131

原创 【从零开始手搓12306项目】二十二、集成Mybatis官方生成器

自定义的SQL需要写到自己的mapper里,不能放在生成的mapper里。Mybatis官方代码生成器:Mybatis Generator。开发规范:生成器生成的四个文件都不能手动修改。创建新模块generator。在resources新建文件。修改service方法。将代码提交到git仓库。

2024-04-17 10:51:01 166

原创 【从零开始手搓12306项目】二十一、集成Mybatis持久层框架

在common的数据配置文件中的数据库连接配置剪切到member模块中,添加mybatis.xml路径。新增service包,创建MemberService类,添加注解@Service,创建执行方法。在common模块的application.properties文件中,添加数据库连接。新建MemberMapper.xml文件,在启动类中添加注解@MapperScan。在member模块下的main中新建包mapper,用来存放持久层框架。每个模块的数据库配置不一样,所以放在各自的模块里。

2024-04-17 10:46:28 303

原创 【从零开始手搓12306项目】二十、使用IDEA配置数据库连接

输入连接名称,账号、密码和数据库名,此时下面会有URL,在数据库配置中会经常用到。安装mysql8.0,并配置好环境变量,用户名和密码,新建数据库train。在Database的Data Source下选择mysql。在项目中新建文件夹sql,新建member.sql文件。输入sql语句并运行,此时在数据库中会新增一个表。将代码提交到git仓库。

2024-04-17 10:41:53 198

原创 【从零开始手搓12306项目】十九、增加网关模块

只有gateway需要配置外网IP,其它模块都只开放内网访问,外网访问不了,保证应用安全。gateway只有一个依赖,不能引入common,也不能引入starter-web。在main下新建包com.jia.train.gateway.config。新增application.properties文件,端口配置为8000。修改valu值,让输出的日志文件都保存在gateway文件下。在train项目中增加一个maven模块gateway。做路由转发,转发到member模块。打印请求日志,修改参数。

2024-04-17 10:39:36 130

原创 【从零开始手搓12306项目】十八、增加通用模块

将member模块下的pom文件依赖复制到common模块下,将devtools和test依赖删除。在父pom文件和member中添加common依赖,在member中不需要依赖的版本号。在common模块的main下面新建一个aspect包。在train项目中增加一个maven模块common。去掉member里面的aspect包。相反,在member中只保留这两个。新建一个LogAspect类。

2024-04-17 10:37:05 166

原创 【从零开始手搓12306项目】十七、增加AOP打印请求参数和返回结果

注意在子模块中的pom文件中添加依赖时,不需要版本号,版本号只需要写在根目录下。在member模块的main下面新建一个aspect包。注意:添加依赖后,需要收到刷新maven导入jar包。同时在member模块的pom文件中导入AOP依赖。同时将依赖添加到member目录下的pom文件中。在根目录下的pom文件中加入第三方依赖。新建一个LogAspect类。AOP可以拦截其它类。

2024-04-17 10:35:23 180

原创 【从零开始手搓12306项目】十六、使用HHTPClient完成测试接口

在里面新建一个文件,member-test.http。左边绿色三角运行,可以让项目在idea中测试运行。在train项目中新建一个包,命名为http。在里面输入gtr回车快速生成所需代码。

2024-04-17 10:10:35 176

原创 【从零开始手搓1230项目】十五、实现日志的相关配置

在resources包下添加logback-spring.xml文件,是日志文件格式配置文件,修改valu值,让输出的日志文件都保存在member文件下。在项目提交到git时,一般不会将日志文件上传到远程仓库,所以在.gitignore文件中将log文件屏蔽掉。为了后续做路由转发,在网关模块里,将接口带“/member”的请求兜转发到member模块。将代码加在application.properties里面。在启动类里面加代码,要修改类名。之后就可以将项目提交到git上。

2024-04-17 10:08:59 139

原创 【从零开始手搓12306项目】十四、新建member模块

在resources包下新建application.properties,可以在这个文件里面定义访问端口和数据库相关信息等。将文件提交给git管理,在main下新建包com.jia.train.member.config。将父pom文件下的dependencies和build标签内容剪切到member的pom文件中。新建MemberApplication启动类。这样可以读取到其他包的Controller。新建maven模块,命名为member。新建TestController。新建controller包。

2024-04-17 10:05:26 163

原创 【从零开始手搓12306项目】十三、代码关联远程Git仓库

实际工作中,每完成一个小功能,就提交一次,写清楚注释,下班前,代码全部push到远程仓库,前提是代码不要报错。创建成功之后仓库会有提示操作,在本地仓库克隆到远程仓库代码块找相关代码。打开命令行窗口,输入以下代码,将名字和邮箱更改成自己的。将勾选取消,这两个的目的是每次提交都检查代码正确性。关联远程Git仓库需要SSH密钥。在本店的Git目录下可以生成密钥。点击Show SSH Key。将SSH密钥添加到自己仓库中。将本地仓库与远程仓库关联起来。授权仓库绑定,输入yes。将项目交给Git管理。

2024-04-17 10:00:45 143

原创 【从零开始手搓12306项目】十二、项目初始化配置

idea的编码环境全都改成UTF-8。

2024-04-17 09:35:29 213

原创 【从零开始手搓12306项目】十一、快速完成微服务架构的搭建

创建Application启动类,测试项目能不能正常启动。导入热部署、Web框架和Cloud Bootstrap。创建Spring Initializr。SDK版本选择选择JDK 17。idea配置好Maven环境。

2024-04-17 09:32:58 150

原创 【从零开始手搓12306项目】第一阶段遇到的问题及解决方案

此时本地仓库的代码版本与云仓库代码版本冲突,打开命令行强制推送,让本地仓库覆盖云仓库。一定要注意数据库的url链接,在datebase的url复制过来。定义Git全局的 .gitignore 文件。注意区分private和public。最好复制一遍到xml文件。

2024-04-16 19:43:13 240

原创 SpingBoot3相关

JIT(Just-in-Time,实时编译)Java跨平台的基础AOT(Ahead-of-Time,预编译或提前编译),无法跨平台。

2024-04-16 19:41:31 176

原创 【从零开始手搓12306项目】十、百万人抢一万张票,系统如何保证其正常及稳定性?

针对静态资源做CDN(Content Delivery Network 内容分发网络)微服务-服务拆分(一般是按功能模块来划分,热点接口也可以做成单独的服务)缓存(本地缓存、分布式缓存),穿透、击穿、雪崩等问题。分表:横向分表(一般按时间或地区划分)、纵向分表。冗余设计,反范式,空间换时间。分库:业务分离、读写分离。倒计时&Loading。

2024-04-16 19:40:06 232

原创 【从零开始手搓12306项目】九、12306系统数据库表

2024-04-16 19:38:40 71

原创 【从零开始手搓12306项目】八、12306系统整体架构设计

6.1 简单的模块划分6.2 加入common模块,放置公共代码;制作generator代码生成器模块6.3 加入中间件及微服务组件

2024-04-16 19:36:56 149

原创 【从零开始手搓12306项目】七、12306系统功能模块划分

会员模块:会员、乘客、已购买的车票。业务模块:所有的车次数据、余票信息。跑批模块:管理定时任务,界面启停。admin模块:管理员相关界面。网管模块:路由转发、登录校验。web模块:会员相关界面。热点接口会做成单独的模块。不同的模块配置不同的资源。

2024-04-16 19:34:56 123

原创 【从零开始手搓12306项目】六、12306系统核心功能

2024-04-16 19:33:29 116

原创 【从零开始手搓12306项目】五、如何保证不超卖、不少卖、还能承受极高的并发?

座位购买:记录座位销售详情(将卖票变成01二进制数的计算)余票查询:记录站站余票。

2024-04-16 19:32:04 110

原创 【从零开始手搓12306项目】四、12306是如何成为全球最忙碌的网站之一?

一天的请求量大概1600亿,平均180万/秒(二八理论:20%的事件产生80%的请求),不适合二八理论,因为12306分时间放票。提高处理能力:QPS和TPS(堆积硬件、软件:Gemfine、算法:模型、逻辑)削峰(削峰填谷)[业务:验证码、分时段、排队]、[技术:限流、异步]平均一年售出30亿张,高峰期日售票能力达到了2000万张。高峰期1秒可卖出1300张票。

2024-04-16 19:30:56 160

原创 【从零开始手搓12306项目】三、众多高并发项目中,为什么选择12306

业务复杂度高于淘宝双11,考验个人程序设计能力(动态库存、选座功能、线上线下并行)持续高并发业务,需要更综合的高并发设计(不停地刷票、绝不能超卖)商品秒杀,淘宝双11。

2024-04-16 19:29:52 227

原创 【从零开始手搓12306项目】二、为什么要选择SpringBoot3和JDK17

课程中的高并发技术(CDN、分布式缓存[缓存穿透、缓存击穿、缓存雪崩]、两层验证码[特事特办:纯前端验证码+后端验证码]、限流技术、令牌技术、分布式锁、异步削峰、排队机制、分布式事务),和版本无关,适合普遍的SpringBoot2+JDk1.8项目。JAVA开发非常依赖Spring(SpringBoot3重要特性:AOT)Spingboot 3.0.0(至少要升级到JDK 17)学习要激进(学新版),项目要滞后(用旧版)SpringBoot3要求最低JDK17。第三方依赖如Mybatis,都做了升级。

2024-04-16 19:27:37 121

原创 【从零开始手搓12306项目】一、项目指南

学习主流前后端分离架构,Spring Cloud Alibaba + Vue3。秒杀过程没有问题,但是服务器响应很慢(异步削峰+排队机制)高并发技术:缓存、分布式锁、限流、令牌、削峰、排队等。秒杀还没开始,页面就崩了(页面静态化、CDN)全面学习高性能、高并发、高可用场景解决方案。秒杀还没开始,服务器就崩了(限流、令牌)主流前后端分离架构+高并发技术项目实战。秒杀结束后,库存崩了(分布式锁技术)缺少大型高并发项目开发经验的开发人员。引入高并发技术,实现高性能抢票。架构搭建,使用前后端分离架构。

2024-04-16 19:26:32 170

原创 JAVA学习日记十三(反射机制)

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在运行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。Java反射机制提供的功能:在运行时判断任意一个对象所属的类。

2024-03-28 21:40:19 975 1

原创 JAVA之浅谈i++与++i

a=i++ , a 返回原来的值a=i,i=i+1;单独使用的时候,两者没有区别,参与运算时,也不过是语句的执行顺序换了,但是执行的步骤是一样的,效率都是一样的啊,没有什么不同啊?单独拿出来说的话,++i和i++,效果都是一样的,就是i=i+1。1.先说a=i++,这个运算的意思是先把i的值赋予a,然后在执行i=i+1;2.而a=++i,这个的意思是先执行i=i+1,然后在把i的值赋予a;当i初始等于3时,执行a=i++,最终结果a=3,i=4.当i初始等于3时,执行a=++i,最终结果a=4,i=4.

2024-03-20 20:08:35 399 1

原创 JAVA学习日记十二(File类与IO流)

在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)。:从输入流中读取一些字符,并将它们存储到字符数组 cbuf中,从cbuf[off]开始的位置存储。想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。

2024-03-19 20:29:35 757

原创 JAVA之内存分配

当声明一个新的变量使用现有的对象进行赋值时(比如p3 = p1),此时并没有在堆空间中创 建新的对象。堆(Heap):存放引用数据类型的数据与new出来的对象,注意创建出来的对象只包含各自的成员变量,不包括成员方法。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。java程序是运行在jvm(java虚拟机)上的,因此Java的内存分配是在JVM中进行的。栈(Stack):存放基本数据类型的数据、引用数据类型的变量名及对象的引用,但是引用的数据与对象并不放在栈中,而是放在堆中。

2024-03-18 17:19:54 152 1

原创 JAVA学习日记十一(数据结构与集合源码)

数组的初始化容量,如果在构建ArrayList与Vector的集合对象时,没有显式指定初始化容量,那么Vector的内部数组的初始容量默认为10,而ArrayList在JDK 6.0 及之前的版本也是10,JDK8.0 之后的版本ArrayList初始化为长度为0的空数组,之后在添加第一个元素时,再创建长度为10的数组。数据结构,就是一种程序设计优化的方法论,研究数据的`逻辑结构`和`物理结构`以及它们之间相互关系,并对这种结构定义相应的运算,目的是加快程序的执行速度、减少内存占用的空间。

2024-03-18 10:01:56 1058 1

原创 JAVA学习日记十(泛型Generic)

泛型即为“类型参数”,这个类型参数在声明它的类、接口或方法中,代表未知的某种通用类型。所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值或参数的类型。这个类型参数将在使用时(例如,继承或实现这个接口、创建对象或调用方法时)确定(即传入实际的类型参数,也称为类型实参)。集合中没有使用泛型时:集合中使用泛型时:Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。

2024-03-17 21:00:11 881 1

原创 JAVA之线程安全问题

当我们使用多个线程访问同一资源(可以是同一个变量、同一个文件、同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题。但是如果多个线程中对资源有读和写的操作,就容易出现线程安全问题。

2024-03-16 19:47:26 1360 1

原创 JAVA学习日记九(集合框架)

数组的特点与弊端:一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。数组在内存存储方面的特点数组初始化以后,长度就确定了。数组中的添加的元素是依次紧密排列的,有序的,可以重复的。数组声明的类型,就决定了进行元素初始化时的类型。不是此类型的变量,就不能添加。可以存储基本数据类型值,也可以存储引用数据类型的变量数组在存储数据方面的弊端。

2024-03-16 19:07:12 876 1

原创 JAVA学习日记八(多线程)

JVM会为其创建方法调用栈和程序计数器,当然,处于这个状态中的线程并没有开始运行,只是表示已具备了运行的条件,随时可以被调度。比如:线程A用来生产包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,此时B线程必须等到A线程完成后才能执行,那么线程A与线程B之间就需要线程通信,即——哪个线程获得了“同步锁”对象之后,”同步锁“对象就会记录这个线程的ID,这样其他线程就只能等待了,除非这个线程”释放“了锁对象,其他线程才能重新获得/占用”同步锁“对象。

2024-03-14 20:14:07 598

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除