wordpress在哪兒打開企業(yè)網站seo優(yōu)化外包
《瘋狂Spring Boot講義》是2021年電子工業(yè)出版社出版的圖書,作者是李剛
《瘋狂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后端技術。本書提供了讀者答疑交流群,讀者可通過掃描本書封面上的二維碼,按照指引加入讀者答疑交流群。
技術示范:高并發(fā)請求提供及時響應,對秒殺請求的瞬時高并發(fā)進行削峰限流
項目背景
- 電商在特殊時間節(jié)點做促銷活動,參與商品的價格實惠,用戶特意等到活動期間購買
- 從而很容易引起瞬時的高并發(fā)請求的峰值情況
- 通常通過RabbitMQ消息組件進行削峰,即限制、延遲處理,避免服務器崩潰。
系統(tǒng)架構
MVC | Spring MVC | 用戶請求的處理與轉發(fā); 包括系統(tǒng)的超鏈接與表單提交 | 攔截器的權限控制 |
底層持久層 DAO層 | MyBatis | 簡化,優(yōu)化與封裝 | SQL Mapping框架 Mapper接口 |
NoSQL 分布式Session | Redis | 數據緩存、頁面緩存 | |
消息組件 | RabbitMQ | 秒殺限流 | |
業(yè)務邏輯層 | Spring Boot | 整合與自動配置;業(yè)務邏輯組件 | 依賴注入;面向接口; IoC;聲明式事務框架 |
表現層 | Thymeleaf | 收集用戶請求數據; 業(yè)務數據表示 | |
Bootstrap | 簡單美化 | ||
jQuery | JS工具庫動態(tài)更新頁面 |
功能模塊
- 主要是用戶模塊和秒殺模塊
- 業(yè)務邏輯組件為門面封裝且依賴Mapper組件
Mapper對象組件| 4 | UserMapper | user_inf |
MiaoshaItemMapper | item_inf、miaoshao_inf | |
OrderMapper | order_inf | |
MiaoshaOrderMapper | order_inf、miaosha_order | |
業(yè)務邏輯組件| 2 | UserService | 用戶登錄、用戶信息查看 |
MiaoshaService | 商品查看、商品秒殺 | |
消息組件| 2 | MiaoshaSender | 向RabbitMQ消息隊列發(fā)送消息 |
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進行持久化操作,從而保證面向對象方式開發(fā)
user_inf | nickname not null;加鹽加密 | |
item_inf | 主鍵自增 | 商品名稱、商品描述 |
miaosha_item | 主鍵自增 | 基本信息; 秒殺價、庫存、開始結束時間 |
order_inf | 主鍵自增 | 訂單用戶、訂單價格、下單時間 |
miaosh_order | 主鍵自增; unique key(user_id, item_id)唯一約束 | 用戶ID、訂單ID、商品ID |
創(chuàng)建領域對象類
- MyBatis是結果集映射框架
- 只需要定義數據列的類實例變量以及setter、getter方法
Mapper(DAO)層
- MyBatis只需要通過XML文件定義Mapper接口的相關SQL語句就開發(fā)完成Mapper組件。
實現Mapper組件
- Mapper接口聲明Mapper組件提供的持久化對象操作的CRUD方法
- 可能隨著業(yè)務邏輯的需求而增加
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,高并發(fā)秒殺系統(tǒng)通常都是分布式應用,基于Redis實現
實現Redis組件
- 添加Spring Boot Data Redis,提供自動配置RedisConnectionFactory、StringRedisTmplate
- 注入其他組件即可
spring.redis | host | ||
port | |||
database | |||
password | |||
lettuce.pool | .maxActive | ||
.maxIdle | 空閑連接數 | ||
.minIdle |
- 工具類對RedisTemplate封裝
- 方便操作系統(tǒng)中的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發(fā)送瀏覽器,以Cookie保存[UUID]
- 服務器端用Redis保存key-value信息,以客戶端的Session ID為key
- 對象:分布式Session
- 為了實現流程,定義操作Cookie工具類
- getSessionId工具方法就是分布式Session實現機制的第1步:通過Cookie來讀取Session ID;如果讀不到有效的Session ID,系統(tǒng)會生成一個隨機的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:讀取,否則創(chuàng)建 | 對getCookieValue進一步封裝 |
通過Redis緩存實現分布式Session
UserController | addSession: 分別保存 | |
getByToken:延長有效期、讀取 |
只要任意控制器訪問系統(tǒng),攔截器就會向氛圍中的瀏覽器寫入Cookie,從而保存SessionID
AccessInterceptor | preHandle:訪問寫入、保存 攔截所有控制器的處理方法 | HandlerInterceptor: preHandle |
UserKey | key前綴以及有效時間 |
用戶登錄的實現
getLoginVerifyCode符合分布式的Session流程
UserController | toLogin | |
getLoginVerifyCode:驗證碼 | @GetMappring(method) HttpServletResponse:getOutputStream | |
proLogin |