疯狂Spring Boot讲义[推荐1]
《疯狂Spring Boot讲义》是2021年电子工业出版社出版的图书,作者是李刚
《疯狂Spring Boot终极讲义》不是一本介绍类似于@PathVariable、@MatrixVariable、@RequestBody、@ResponseBody这些基础注解的图书,它是真正讲解Spring Boot的图书。Spring Boot的核心是什么?它的核心就是自动配置,以及以自动配置为基础与大量第三方后端技术进行整合。因此学习Spring Boot应该重点关注的就是它为整合各种框架所提供的自动配置,包括Spring Boot如何整合各种前端框架,如Spring MVC、Spring WebFlux;Spring Boot如何整合各种持久层技术,如Spring Data、MyBatis、Hibernate/JPA、R2DBC、jOOQ等;Spring Boot如何整合NoSQL技术,如Redis、MongoDB、Neo4j、Cassandra、Solr、Elasticsearch等;Spring Boot如何整合各种消息组件,如ActiveMQ、Artemis、RabbitMQ、Kafka等;Spring Boot如何整合各种缓存机制,如JCache、EhCache、Redis、Hazelcast等;Spring Boot如何整合各种安全框架,如Spring Security、Shiro等,这些都只是Spring Boot整合的典型内容。本书的作用就是带你彻底掌握Spring Boot官方手册中所整合的各种技术,而且本书会讲清楚Spring Boot和Spring框架的关系,带着你揭开Spring Boot的核心:自动配置的面纱,领着你剖析Spring Boot自动配置的源代码实现,然后以此为基础,详细讲解Spring Boot如何整合各种Java后端技术。在掌握了本书知识之后,你不仅能轻松看懂Spring Boot官方手册(其实无须再看了),而且真正掌握了Spring Boot的大成,并通过Spring Boot的整合触类旁通地掌握各种Java后端技术。本书提供了读者答疑交流群,读者可通过扫描本书封面上的二维码,按照指引加入读者答疑交流群。

技术示范:高并发请求提供及时响应,对秒杀请求的瞬时高并发进行削峰限流
项目背景
- 电商在特殊时间节点做促销活动,参与商品的价格实惠,用户特意等到活动期间购买
- 从而很容易引起瞬时的高并发请求的峰值情况
- 通常通过RabbitMQ消息组件进行削峰,即限制、延迟处理,避免服务器崩溃。
系统架构
| MVC | Spring MVC | 用户请求的处理与转发; 包括系统的超链接与表单提交 | 拦截器的权限控制 | 
| 底层持久层 DAO层 | MyBatis | 简化,优化与封装 | SQL Mapping框架 Mapper接口 | 
| NoSQL 分布式Session | Redis | 数据缓存、页面缓存 | |
| 消息组件 | RabbitMQ | 秒杀限流 | |
| 业务逻辑层 | Spring Boot | 整合与自动配置;业务逻辑组件 | 依赖注入;面向接口; IoC;声明式事务框架 | 
| 表现层 | Thymeleaf | 收集用户请求数据; 业务数据表示 | |
| Bootstrap | 简单美化 | ||
| jQuery | JS工具库动态更新页面 | 
功能模块
- 主要是用户模块和秒杀模块
- 业务逻辑组件为门面封装且依赖Mapper组件
| Mapper对象组件| 4 | UserMapper | user_inf | 
| MiaoshaItemMapper | item_inf、miaoshao_inf | |
| OrderMapper | order_inf | |
| MiaoshaOrderMapper | order_inf、miaosha_order | |
| 业务逻辑组件| 2 | UserService | 用户登录、用户信息查看 | 
| MiaoshaService | 商品查看、商品秒杀 | |
| 消息组件| 2 | MiaoshaSender | 向RabbitMQ消息队列发送消息 | 
| MiaoshaReceiver | 接受RabbitMQ消息队列中的消息 | |
| 操作Redis组件| 1 | FkRedisUtil | 
加工逻辑
项目搭建
- 通过Spring Boot整合框架的自动配置,只需要在pom.xml中添加对应依赖库
其他依赖库
| Apache Commons Pool2连接池 | 连接Redis | 
| Common Lang 3 | StringUtils、ArrayUtils、ClassUtils、RegExUtils工具类 | 
| Common Codec | 编码、解码算法,如MD5加密算法 | 
领域对象层
设计领域对象
- MyBatis的SQL Mapping进行持久化操作,从而保证面向对象方式开发
| user_inf | nickname not null;加盐加密 | |
| item_inf | 主键自增 | 商品名称、商品描述 | 
| miaosha_item | 主键自增 | 基本信息; 秒杀价、库存、开始结束时间 | 
| order_inf | 主键自增 | 订单用户、订单价格、下单时间 | 
| miaosh_order | 主键自增; unique key(user_id, item_id)唯一约束 | 用户ID、订单ID、商品ID | 
创建领域对象类
- MyBatis是结果集映射框架
- 只需要定义数据列的类实例变量以及setter、getter方法
Mapper(DAO)层
- MyBatis只需要通过XML文件定义Mapper接口的相关SQL语句就开发完成Mapper组件。
实现Mapper组件
- Mapper接口声明Mapper组件提供的持久化对象操作的CRUD方法
- 可能随着业务逻辑的需求而增加
| UserMapper接口 | 根据user_id查询user_inf; 更新user_inf | @Select(“SQL语句”) @Update(“SQL语句”) | 
| MiaoshaItemMapper接口 | 更新库存 查询所有秒杀商品 查询指定秒杀商品 | @Result(参数) List<MiaoshaItem> @Param | 
| OrderMapper接口 | 插入新纪录 获取订单 | @Insert(“SQL语句”) @Option(参数) | 
| MiaoshaOrderMapper接口 | 获取秒杀订单 插入秒杀订单 | 
部署Mapper组件
Spring Boot自动配置数据源、SqlSessionFactory基础组件,部署Mapper成容器的Bean
| spring.datasource | .driver-class-name | =com.mysql.cj.jdbc.Driver | 
| .url | =mysql://localhost:3306/... | |
| .username | ||
| .password | 
分布式Session及用户登录的实现
权限管理等采用分布式Session,高并发秒杀系统通常都是分布式应用,基于Redis实现
实现Redis组件
- 添加Spring Boot Data Redis,提供自动配置RedisConnectionFactory、StringRedisTmplate
- 注入其他组件即可
| spring.redis | host | ||
| port | |||
| database | |||
| password | |||
| lettuce.pool | .maxActive | ||
| .maxIdle | 空闲连接数 | ||
| .minIdle | 
- 工具类对RedisTemplate封装
- 方便操作系统中的key-value对
- 包括添加key-value对、根据key获取对应的value、根据key删除指定key-value 对、判断指定的key是否存在等
| FkRedisUtil | get:获取相应的value | RedisTemplate: opsForValue: get | 
| set:添加key-value对 | opsForValue: set: Duration.ofSeconds | |
| exists:key是否存在 | RedisTemplate: hasKey; | |
| delete:根据key删除 | RedisTemplate: delete | |
| incr | RedisTemplate: opsForValue: increment | |
| decr | RedisTemplate: opsForValue: decrement | |
| beanTostring | ObjectMapper.writeValueAsString; | |
| stringToBean | ObjectMapper.readValue | 
- 控制前缀部分,避免重复
- 控制过期时间
| KeyPrefix | 定义prefix以及过期时间 | 
便于KeyPrefix提供实现类,而作为基类
| AbstractPrefix | 设置过期时间 定义:类名:prefix | 
分布式Session的实现
- Session ID发送浏览器,以Cookie保存[UUID]
- 服务器端用Redis保存key-value信息,以客户端的Session ID为key
- 对象:分布式Session
- 为了实现流程,定义操作Cookie工具类
- getSessionId工具方法就是分布式Session实现机制的第1步:通过Cookie来读取Session ID;如果读不到有效的Session ID,系统会生成一个随机的UUID作为Session ID,并将该Session ID 以Cookie的形式写入浏览器,交给浏览器保存。
| key | value | |
| Cookie | “token” | UUID | 
| Redis | prefix+UUID | Session信息 | 
| CookieUtil | addSessionID:以Cookie写入 | HttpServletResponse:addCookie Cookie: setMaxAge、setPath | 
| getCookieValue:读取指定 | HttpServletRequest: getCookies() Cookie: getName、getValue | |
| getSessionId:读取,否则创建 | 对getCookieValue进一步封装 | 
通过Redis缓存实现分布式Session
| UserController | addSession: 分别保存 | |
| getByToken:延长有效期、读取 | 
只要任意控制器访问系统,拦截器就会向氛围中的浏览器写入Cookie,从而保存SessionID
| AccessInterceptor | preHandle:访问写入、保存 拦截所有控制器的处理方法 | HandlerInterceptor: preHandle | 
| UserKey | key前缀以及有效时间 | 
用户登录的实现
getLoginVerifyCode符合分布式的Session流程
| UserController | toLogin | |
| getLoginVerifyCode:验证码 | @GetMappring(method) HttpServletResponse:getOutputStream | |
| proLogin | 
相关文章:
 
疯狂Spring Boot讲义[推荐1]
《疯狂Spring Boot讲义》是2021年电子工业出版社出版的图书,作者是李刚 《疯狂Spring Boot终极讲义》不是一本介绍类似于PathVariable、MatrixVariable、RequestBody、ResponseBody这些基础注解的图书,它是真正讲解Spring Boot的图书。Spring Boot的核心…...
vue中$nextTick的作用是什么,什么时候使用
$nextTick 是 Vue 提供的一个方法,用于在下一次 DOM 更新周期之后执行回调函数。它通常用于在 Vue 完成数据更新后,需要访问更新后的 DOM 状态时,保证操作的是更新后的 DOM。 工作原理: Vue 是异步更新 DOM 的,当数据…...
 
Redis实现全局ID生成器
全局ID生成器 为什么要用全局ID生成器 1.当我们使用数据库自增来实现id的生成时,规律过于明显,会给用户暴露很多信息 2.当我们订单量过大时无法用数据库的一张表来存放订单,如果两张表的id都是自增的话,id就会出现重复 什么是全局ID生成器 全局ID生成器,是一种在分布式系统…...
Xshell远程连接工具详解
Xshell是一款在Windows平台上运行的远程连接工具,它支持SSH1、SSH2以及Microsoft Windows平台的TELNET协议。Xshell通过互联网实现对远程主机的安全连接,帮助用户在复杂的网络环境中享受他们的工作。本文将详细介绍Xshell的溯源、最新版本以及它的优势。…...
如何在verilog设计的磁盘阵列控制器中实现不同RAID级别(如RAID 0、RAID 1等)的切换?
以下是一种在Verilog设计的磁盘阵列控制器中实现不同RAID级别(以RAID 0和RAID 1为例)切换的方法: 添加控制信号 在磁盘阵列控制器模块中添加一个输入信号,例如raid_mode,用于选择RAID模式。假设raid_mode = 0表示RAID 0模式,raid_mode = 1表示RAID 1模式。module raid_co…...
 
基于元神操作系统实现NTFS文件操作(十)
1. 背景 本文补充介绍文件遍历操作的部分附加内容,譬如,过滤掉系统元文件、过滤掉重复的文件项、过滤掉隐藏文件等,并提供了基于元神操作系统的部分实现代码。 2. 方法 (1)过滤掉系统元文件 NTFS文件系统的前16个元…...
Qt的几个函数方法
void receiveInfo1() {// 假设这是从串口接收到的字符串QString receivedString "23.5C,45%,1012hPa";// 使用逗号分隔符分割字符串QStringList parts receivedString.split(,);// 检查分割后的列表是否有足够的部分if (parts.size() > 3) {QString part1 part…...
 
openpnp - bug - 散料飞达至少定义2个物料
文章目录 openpnp - bug - 散料飞达至少定义2个物料笔记END openpnp - bug - 散料飞达至少定义2个物料 笔记 散料飞达上定义的物料个数用完了,现在只需要一个料就可以。 用顶部相机去找编带上是否还有一个单独的料,找到了。 定义散料飞达的料为1个&…...
 
HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException
HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException 异常信息: Hive:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /xxxdir is exceeded: quota10000 file count15001N…...
数据库的构成与手写简单数据库的探索
一、引言 在当今数字化的时代,数据库扮演着至关重要的角色。无论是企业管理系统、电子商务平台还是各种移动应用,都离不开数据库的支持。数据库是存储和管理数据的核心工具,它的高效性、可靠性和安全性对于数据的处理和应用至关重要。本文将…...
 
基于STM32的智能晾衣架设计
引言 随着智能家居的普及,智能晾衣架成为了提升生活便利性的重要设备。智能晾衣架通过集成多个传感器,能够自动感知天气变化、湿度、光照等环境因素,实现自动升降、风干和报警功能,帮助用户更加高效地晾晒衣物。本项目基于STM32设…...
 
【MAUI】模糊控件(毛玻璃高斯模糊亚克力模糊)
文章目录 XAML.CSToBytes方法使用效果 常试过AcrylicView.MAUI和Sharpnado.MaterialFrame,对于二者教程很少,使用直接写控件然后调属性,没有报错但也并没有效果所幸就自己写一个 XAML <?xml version"1.0" encoding"utf-…...
深度学习:pandas篇
1. Pandas 基础 Pandas 是一个帮助你处理和分析数据的工具 安装 Pandas pip install pandas 导入 Pandas,我们用 pd 来代替 Pandas 的全称,这样以后写代码的时候更简洁 import pandas as pd 建 Series 和 DataFrame Pandas 最基本的两个数据结构是…...
 
Redis学习文档(Redis基本数据类型【Hash、Set】)
Hash(哈希) 介绍 Redis 中的 Hash 是一个 String 类型的 field-value(键值对) 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接修改这个对象中的某些字段的值。 Hash 类似于 JDK1.…...
 
15分钟学Go 第9天:函数的定义与调用
第9天:函数的定义与调用 欢迎来到第9天的Go语言学习模块!今天我们将深入探讨函数的定义与调用,帮助你掌握如何编写和使用函数。学习函数不仅是Go语言的基础,也是程序设计的核心概念之一。这一节将详细介绍函数的结构、参数传递、…...
 
Java虚拟机:JVM介绍
1024 程序员节日快乐!愿您我的代码永远没有 bug ,人生永远没有 bug ! JVM 概述JVM 架构 概述 JVM( Java Virtual Machine ,Java 虚拟机),是 Java 语言的运行环境,是运行所有 Java 程…...
R数据科学 16.5.3练习题
(1) 编写代码以使用一种映射函数完成以下任务。 a. 计算 mtcars 数据集中每列的均值。 b. 确定 nycflights13::flights 数据集中每列的类型。 c. 计算 iris 数据集中每列唯一值的数量。 d. 分别使用 μ -10、0、10 和 100 的正态分布生成 10 个随机数。 library(purrr) # 计算…...
 
通过conda install -c nvidia cuda=“11.3.0“ 安装低版本的cuda,但是却安装了高版本的12.4.0
问题 直接通过 conda install -c nvidia cuda"11.3.0"安装得到的却是高版本的 不清楚原理 解决方法 不过我们可以分个安装 runtime toolkit 和 nvcc 安装指定版本的 cudatoolkit 和 nvcc conda install -c nvidia cuda-cudart"11.3.58" conda instal…...
 
简易CPU设计入门:验证取指令模块
项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后ÿ…...
【MySQL数据库】MySQL主从复制
文章目录 MySQL主从复制MySQL主从复制的分类MySQL主从复制原理MySQL主从复制的配置步骤MySQL主从复制的同步模式 MySQL主从复制实验环境准备关闭防火墙和 SELinux时间同步主服务器设置从服务器设置 MySQL 主从复制配置主服务器配置从服务器配置(以 Slave1 为例&…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
 
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
 
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
 
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
 
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
 
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
 
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
 
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
