疯狂Spring Boot讲义[推荐1]

news2024/11/28 23:53:31

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2227413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DBC文件当中新建CANFD等类型的报文

同学最近有添加CANFD报文的需求&#xff0c;需要用到CANFD类型报文的DBC文件&#xff0c;这下就难住我了&#xff0c;我之前用的DBC文件只有“CAN Standard”“CAN Extended”两种类型&#xff0c;压根没见过FD的。 后来他找到了项目之前的DBC&#xff0c;打开来看&#xff0c…

RabbitMQ集群搭建及使用

1. 概述 前提条件&#xff1a;linux服务器下已经安装好了docker服务。 本文档将搭建一个三台RabbitMQ的集群&#xff0c;包括三个RabbitMQ容器安装在同一服务器和三台不同的服务器。 2. 集群搭建 在一台服务器上创建三个RabbitMQ容器。 2.1.1. 创建容器 执行以下命令创建三…

卡方检验方法概述与类型——四格表和R*C表卡方检验案例

卡方检验是以卡方分布为基础&#xff0c;针对定类数据资料的常用假设检验方法。其理论思想是判断实际观测到的频数与有关总体的理论频数是否一致。 卡方统计量是实际频数与理论频数吻合程度的指标。卡方值越小&#xff0c;表明实际观察频数与理论频数越接近&#xff0c;反之卡…

three.js使用ShaderMaterial实现聚光灯光源demo

文章目录 顶点片元全部 核心&#xff1a; 顶点 varying vec3 vNormal;varying vec3 vViewPosition;void main() {vNormal normalMatrix * normal;vNormal normalize( vNormal );vec4 modelViewPosition modelViewMatrix * vec4(position, 1.0);gl_Position projectionMat…

WPF+MVVM案例实战(三)- 动态数字卡片效果实现

1、创建项目 打开 VS2022 &#xff0c;新建项目 Wpf_Examples&#xff0c;创建各层级文件夹&#xff0c;安装 CommunityToolkit.Mvvm 和 Microsoft.Extensions.DependencyInjectio NuGet包,完成MVVM框架搭建。搭建完成后项目层次如下图所示&#xff1a; 这里如何实现 MVVM 框…

深入理解 SQL 中的 WITH AS 语法

在日常数据库操作中&#xff0c;SQL 语句的复杂性往往会影响到查询的可读性和维护性。为了解决这个问题&#xff0c;Oracle 提供了 WITH AS 语法&#xff0c;这一功能可以极大地简化复杂查询&#xff0c;提升代码的清晰度。本文将详细介绍 WITH AS 的基本用法、优势以及一些实际…

【云原生】Kubernets1.29部署StorageClass-NFS作为存储类,动态创建pvc(已存在NFS服务端)

文章目录 在写redis集群搭建的时候,有提到过使用nfs做storageclass,那时候kubernetes是1.20版本,https://dongweizhen.blog.csdn.net/article/details/130651727 现在使用的是kubernetes 1.29版本,根据之前的修改方式并未生效,反而提示:Error: invalid argument "Re…

算法日记 11 day 二叉树

新的篇章&#xff0c;二叉树&#xff01;&#xff01;&#xff01; 二叉树的种类 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 这棵二叉树为满二叉树&#xff0c;也可以说深度…

IDEA->EasyCode(mapper.xml) 字段无逗号分隔和修改全局变量问题

1.mapperxml字段无逗号分隔 在easycode的设置里找到&#xff1a; 1、Template下的 mapper.xml.vm脚本 2、Global Config下的 mybatisSupport.vm脚本 将脚本里的 $velocityHasNext 替换成 $foreach.hasNext&#xff0c;然后保存。Mybatis-Plus框架操作一样 github->issue连…

红队工具---Behinder学习

1.什么是Behinder&#xff1f; Behinder 是一款用于网络渗透测试的安全工具&#xff0c;主要用于对 Web 应用进行攻击和漏洞利用。它提供了强大的功能&#xff0c;是一款红队的大杀器&#xff0c;几乎是现代web安全必须学习的一款webshell管理工具。 主要用途 渗透测试&#…

中航资本:商业卫星产业链建设加快 无人机军民两用空间广阔

互联网医疗迎多重边沿改进 我国居民医疗保健开支稳步添加&#xff0c;据国家统计局数据&#xff0c;2023年全国居民医疗保健人均消费开支为2460元&#xff0c;占人均消费总开支的比例从2018年的8.5%前进至2023年的9.2%。跟着慢病患者群扩展、业态相似的外卖、产品电商翻开以及…

基于springboot+vue实现的免费体育馆场地预约系统 (源码+L文+ppt)4-099

基于springbootvue实现的免费体育馆场地预约系统 &#xff08;源码L文ppt&#xff09;4-099 4.1 系统总体结构设计 本系统是基于B/S架构的网站系统&#xff0c;分为系统前台和系统后台&#xff0c;前台主要是提供给注册用户和未注册登录的游客使用的&#xff0c;包括首页、场馆…

雷军救WPS“三次”,WPS注入新生力量,不再“抄袭”微软

救WPS“三次” 1989年&#xff0c;求伯君用128万行代码编写出了WPS1.0&#xff0c;宣告了中国自主办公时代的开启。 那时候&#xff0c;雷军还在武汉大学深造&#xff0c;他早就把求伯君当成了自己的榜样&#xff0c;这一来二去的&#xff0c;雷军和WPS之间也就结下了不解之缘…

基于GFlowNets的蚁群抽样算法在组合优化中的应用(arXiv 2024)(未完) -1

文章目录 Abstract1 Introduction2 Related works2.1 蚁群优化2.2 神经组合优化2.3 GFlowNets与组合优化3 Preliminary3.1 旅行商问题3.2 蚁群优化3.3 生成流网络Abstract 本文介绍了一种神经引导的概率搜索算法——生成流蚁群采样器(GFACS),用于解决组合优化(CO)问题。G…

【C++】类和对象(四):析构函数

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的析构函数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1. 概念2. 特性 1. 概念 通过前面构造函数的学习&#xff0c;我们知道一个对象是怎么来的…

VulkanTutorial(8·Shader modules)

Shader modules 与早期的API不同&#xff0c;Vulkan中的着色器代码必须以字节码格式指定&#xff0c;而不是人类可读的语法&#xff0c;如GLSL和HLSL。这种字节码格式称为SPIR-V它是一种可用于编写图形和计算着色器的格式 使用像SPIR-V这样简单的字节码格式&#xff0c;不会面…

详解PHP正则表达式中的转义操作

PHP正则表达式中的特殊字符和转义 在 PHP 正则表达式中&#xff0c;有许多特殊字符具有特定的意义。这些特殊字符通常用于定义匹配模式的一部分&#xff0c;或者改变匹配的行为。以下是 PHP 正则表达式中一些常用的特殊字符及其含义: .匹配除换行符之外的任何单个字符 ^在方括…

27.Redis哨兵架构

Redis哨兵高可用架构 Sentinel&#xff08;哨兵&#xff09;是一种特殊的 Redis 服务&#xff0c;其主要功能并非提供常规的读写服务&#xff0c;而是专门用于监控 Redis 实例节点。 1.在哨兵架构下&#xff0c;客户端&#xff08;client 端&#xff09;首次会从哨兵处找出 Re…

STM32G474硬件CRC7和软件CRC7校验

1、CRC7的多项式和初始值 #define CRC_Hardware_POLYNOMIAL_7B 0x09//硬件CRC多项式为0x09 //SD卡中的校验算法CRC7&#xff0c;生成多项式为x^7 x^3 1&#xff0c;由于bit7不存在&#xff0c;只有bit31和bit01&#xff0c;所以多项式为0x09#define CRC7_INIT_VALUE 0…

Java基础 —— IO流详解

IO流 在Java中&#xff0c;IO&#xff08;输入/输出&#xff09;流是用于在程序与外部世界&#xff08;如文件、网络、内存等&#xff09;之间传输数据的机制。IO流分为两大类&#xff1a;输入流&#xff08;InputStream/Reader&#xff09;和输出流&#xff08;OutputStream/…