当前位置: 首页 > news >正文

疯狂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

  1. 为了实现流程,定义操作Cookie工具类
  2. 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年电子工业出版社出版的图书&#xff0c;作者是李刚 《疯狂Spring Boot终极讲义》不是一本介绍类似于PathVariable、MatrixVariable、RequestBody、ResponseBody这些基础注解的图书&#xff0c;它是真正讲解Spring Boot的图书。Spring Boot的核心…...

vue中$nextTick的作用是什么,什么时候使用

$nextTick 是 Vue 提供的一个方法&#xff0c;用于在下一次 DOM 更新周期之后执行回调函数。它通常用于在 Vue 完成数据更新后&#xff0c;需要访问更新后的 DOM 状态时&#xff0c;保证操作的是更新后的 DOM。 工作原理&#xff1a; Vue 是异步更新 DOM 的&#xff0c;当数据…...

Redis实现全局ID生成器

全局ID生成器 为什么要用全局ID生成器 1.当我们使用数据库自增来实现id的生成时,规律过于明显,会给用户暴露很多信息 2.当我们订单量过大时无法用数据库的一张表来存放订单,如果两张表的id都是自增的话,id就会出现重复 什么是全局ID生成器 全局ID生成器,是一种在分布式系统…...

Xshell远程连接工具详解

Xshell是一款在Windows平台上运行的远程连接工具&#xff0c;它支持SSH1、SSH2以及Microsoft Windows平台的TELNET协议。Xshell通过互联网实现对远程主机的安全连接&#xff0c;帮助用户在复杂的网络环境中享受他们的工作。本文将详细介绍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. 背景 本文补充介绍文件遍历操作的部分附加内容&#xff0c;譬如&#xff0c;过滤掉系统元文件、过滤掉重复的文件项、过滤掉隐藏文件等&#xff0c;并提供了基于元神操作系统的部分实现代码。 2. 方法 &#xff08;1&#xff09;过滤掉系统元文件 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个物料 笔记 散料飞达上定义的物料个数用完了&#xff0c;现在只需要一个料就可以。 用顶部相机去找编带上是否还有一个单独的料&#xff0c;找到了。 定义散料飞达的料为1个&…...

HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException

HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException 异常信息&#xff1a; Hive:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /xxxdir is exceeded: quota10000 file count15001N…...

数据库的构成与手写简单数据库的探索

一、引言 在当今数字化的时代&#xff0c;数据库扮演着至关重要的角色。无论是企业管理系统、电子商务平台还是各种移动应用&#xff0c;都离不开数据库的支持。数据库是存储和管理数据的核心工具&#xff0c;它的高效性、可靠性和安全性对于数据的处理和应用至关重要。本文将…...

基于STM32的智能晾衣架设计

引言 随着智能家居的普及&#xff0c;智能晾衣架成为了提升生活便利性的重要设备。智能晾衣架通过集成多个传感器&#xff0c;能够自动感知天气变化、湿度、光照等环境因素&#xff0c;实现自动升降、风干和报警功能&#xff0c;帮助用户更加高效地晾晒衣物。本项目基于STM32设…...

【MAUI】模糊控件(毛玻璃高斯模糊亚克力模糊)

文章目录 XAML.CSToBytes方法使用效果 常试过AcrylicView.MAUI和Sharpnado.MaterialFrame&#xff0c;对于二者教程很少&#xff0c;使用直接写控件然后调属性&#xff0c;没有报错但也并没有效果所幸就自己写一个 XAML <?xml version"1.0" encoding"utf-…...

深度学习:pandas篇

1. Pandas 基础 Pandas 是一个帮助你处理和分析数据的工具 安装 Pandas pip install pandas 导入 Pandas&#xff0c;我们用 pd 来代替 Pandas 的全称&#xff0c;这样以后写代码的时候更简洁 import pandas as pd 建 Series 和 DataFrame Pandas 最基本的两个数据结构是…...

Redis学习文档(Redis基本数据类型【Hash、Set】)

Hash&#xff08;哈希&#xff09; 介绍 Redis 中的 Hash 是一个 String 类型的 field-value&#xff08;键值对&#xff09; 的映射表&#xff0c;特别适合用于存储对象&#xff0c;后续操作的时候&#xff0c;你可以直接修改这个对象中的某些字段的值。 Hash 类似于 JDK1.…...

15分钟学Go 第9天:函数的定义与调用

第9天&#xff1a;函数的定义与调用 欢迎来到第9天的Go语言学习模块&#xff01;今天我们将深入探讨函数的定义与调用&#xff0c;帮助你掌握如何编写和使用函数。学习函数不仅是Go语言的基础&#xff0c;也是程序设计的核心概念之一。这一节将详细介绍函数的结构、参数传递、…...

Java虚拟机:JVM介绍

1024 程序员节日快乐&#xff01;愿您我的代码永远没有 bug &#xff0c;人生永远没有 bug &#xff01; JVM 概述JVM 架构 概述 JVM&#xff08; Java Virtual Machine &#xff0c;Java 虚拟机&#xff09;&#xff0c;是 Java 语言的运行环境&#xff0c;是运行所有 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设计入门:验证取指令模块

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…...

【MySQL数据库】MySQL主从复制

文章目录 MySQL主从复制MySQL主从复制的分类MySQL主从复制原理MySQL主从复制的配置步骤MySQL主从复制的同步模式 MySQL主从复制实验环境准备关闭防火墙和 SELinux时间同步主服务器设置从服务器设置 MySQL 主从复制配置主服务器配置从服务器配置&#xff08;以 Slave1 为例&…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...