做跨境的網(wǎng)站有哪些網(wǎng)絡(luò)口碑營(yíng)銷案例
《瘋狂Spring Boot講義》是2021年電子工業(yè)出版社出版的圖書,作者是李剛
《瘋狂Spring Boot終極講義》不是一本介紹類似于@PathVariable、@MatrixVariable、@RequestBody、@ResponseBody這些基礎(chǔ)注解的圖書,它是真正講解Spring Boot的圖書。Spring Boot的核心是什么?它的核心就是自動(dòng)配置,以及以自動(dòng)配置為基礎(chǔ)與大量第三方后端技術(shù)進(jìn)行整合。因此學(xué)習(xí)Spring Boot應(yīng)該重點(diǎn)關(guān)注的就是它為整合各種框架所提供的自動(dòng)配置,包括Spring Boot如何整合各種前端框架,如Spring MVC、Spring WebFlux;Spring Boot如何整合各種持久層技術(shù),如Spring Data、MyBatis、Hibernate/JPA、R2DBC、jOOQ等;Spring Boot如何整合NoSQL技術(shù),如Redis、MongoDB、Neo4j、Cassandra、Solr、Elasticsearch等;Spring Boot如何整合各種消息組件,如ActiveMQ、Artemis、RabbitMQ、Kafka等;Spring Boot如何整合各種緩存機(jī)制,如JCache、EhCache、Redis、Hazelcast等;Spring Boot如何整合各種安全框架,如Spring Security、Shiro等,這些都只是Spring Boot整合的典型內(nèi)容。本書的作用就是帶你徹底掌握Spring Boot官方手冊(cè)中所整合的各種技術(shù),而且本書會(huì)講清楚Spring Boot和Spring框架的關(guān)系,帶著你揭開Spring Boot的核心:自動(dòng)配置的面紗,領(lǐng)著你剖析Spring Boot自動(dòng)配置的源代碼實(shí)現(xiàn),然后以此為基礎(chǔ),詳細(xì)講解Spring Boot如何整合各種Java后端技術(shù)。在掌握了本書知識(shí)之后,你不僅能輕松看懂Spring Boot官方手冊(cè)(其實(shí)無須再看了),而且真正掌握了Spring Boot的大成,并通過Spring Boot的整合觸類旁通地掌握各種Java后端技術(shù)。本書提供了讀者答疑交流群,讀者可通過掃描本書封面上的二維碼,按照指引加入讀者答疑交流群。
技術(shù)示范:高并發(fā)請(qǐng)求提供及時(shí)響應(yīng),對(duì)秒殺請(qǐng)求的瞬時(shí)高并發(fā)進(jìn)行削峰限流
項(xiàng)目背景
- 電商在特殊時(shí)間節(jié)點(diǎn)做促銷活動(dòng),參與商品的價(jià)格實(shí)惠,用戶特意等到活動(dòng)期間購(gòu)買
- 從而很容易引起瞬時(shí)的高并發(fā)請(qǐng)求的峰值情況
- 通常通過RabbitMQ消息組件進(jìn)行削峰,即限制、延遲處理,避免服務(wù)器崩潰。
系統(tǒng)架構(gòu)
MVC | Spring MVC | 用戶請(qǐng)求的處理與轉(zhuǎn)發(fā); 包括系統(tǒng)的超鏈接與表單提交 | 攔截器的權(quán)限控制 |
底層持久層 DAO層 | MyBatis | 簡(jiǎn)化,優(yōu)化與封裝 | SQL Mapping框架 Mapper接口 |
NoSQL 分布式Session | Redis | 數(shù)據(jù)緩存、頁面緩存 | |
消息組件 | RabbitMQ | 秒殺限流 | |
業(yè)務(wù)邏輯層 | Spring Boot | 整合與自動(dòng)配置;業(yè)務(wù)邏輯組件 | 依賴注入;面向接口; IoC;聲明式事務(wù)框架 |
表現(xiàn)層 | Thymeleaf | 收集用戶請(qǐng)求數(shù)據(jù); 業(yè)務(wù)數(shù)據(jù)表示 | |
Bootstrap | 簡(jiǎn)單美化 | ||
jQuery | JS工具庫(kù)動(dòng)態(tài)更新頁面 |
功能模塊
- 主要是用戶模塊和秒殺模塊
- 業(yè)務(wù)邏輯組件為門面封裝且依賴Mapper組件
Mapper對(duì)象組件| 4 | UserMapper | user_inf |
MiaoshaItemMapper | item_inf、miaoshao_inf | |
OrderMapper | order_inf | |
MiaoshaOrderMapper | order_inf、miaosha_order | |
業(yè)務(wù)邏輯組件| 2 | UserService | 用戶登錄、用戶信息查看 |
MiaoshaService | 商品查看、商品秒殺 | |
消息組件| 2 | MiaoshaSender | 向RabbitMQ消息隊(duì)列發(fā)送消息 |
MiaoshaReceiver | 接受RabbitMQ消息隊(duì)列中的消息 | |
操作Redis組件| 1 | FkRedisUtil |
加工邏輯
項(xiàng)目搭建
- 通過Spring Boot整合框架的自動(dòng)配置,只需要在pom.xml中添加對(duì)應(yīng)依賴庫(kù)
其他依賴庫(kù)
Apache Commons Pool2連接池 | 連接Redis |
Common Lang 3 | StringUtils、ArrayUtils、ClassUtils、RegExUtils工具類 |
Common Codec | 編碼、解碼算法,如MD5加密算法 |
領(lǐng)域?qū)ο髮?/strong>
設(shè)計(jì)領(lǐng)域?qū)ο?/strong>
- MyBatis的SQL Mapping進(jìn)行持久化操作,從而保證面向?qū)ο蠓绞介_發(fā)
user_inf | nickname not null;加鹽加密 | |
item_inf | 主鍵自增 | 商品名稱、商品描述 |
miaosha_item | 主鍵自增 | 基本信息; 秒殺價(jià)、庫(kù)存、開始結(jié)束時(shí)間 |
order_inf | 主鍵自增 | 訂單用戶、訂單價(jià)格、下單時(shí)間 |
miaosh_order | 主鍵自增; unique key(user_id, item_id)唯一約束 | 用戶ID、訂單ID、商品ID |
創(chuàng)建領(lǐng)域?qū)ο箢?/strong>
- MyBatis是結(jié)果集映射框架
- 只需要定義數(shù)據(jù)列的類實(shí)例變量以及setter、getter方法
Mapper(DAO)層
- MyBatis只需要通過XML文件定義Mapper接口的相關(guān)SQL語句就開發(fā)完成Mapper組件。
實(shí)現(xiàn)Mapper組件
- Mapper接口聲明Mapper組件提供的持久化對(duì)象操作的CRUD方法
- 可能隨著業(yè)務(wù)邏輯的需求而增加
UserMapper接口 | 根據(jù)user_id查詢user_inf; 更新user_inf | @Select(“SQL語句”) @Update(“SQL語句”) |
MiaoshaItemMapper接口 | 更新庫(kù)存 查詢所有秒殺商品 查詢指定秒殺商品 | @Result(參數(shù)) List<MiaoshaItem> @Param |
OrderMapper接口 | 插入新紀(jì)錄 獲取訂單 | @Insert(“SQL語句”) @Option(參數(shù)) |
MiaoshaOrderMapper接口 | 獲取秒殺訂單 插入秒殺訂單 |
部署Mapper組件
Spring Boot自動(dòng)配置數(shù)據(jù)源、SqlSessionFactory基礎(chǔ)組件,部署Mapper成容器的Bean
spring.datasource | .driver-class-name | =com.mysql.cj.jdbc.Driver |
.url | =mysql://localhost:3306/... | |
.username | ||
.password |
分布式Session及用戶登錄的實(shí)現(xiàn)
權(quán)限管理等采用分布式Session,高并發(fā)秒殺系統(tǒng)通常都是分布式應(yīng)用,基于Redis實(shí)現(xiàn)
實(shí)現(xiàn)Redis組件
- 添加Spring Boot Data Redis,提供自動(dòng)配置RedisConnectionFactory、StringRedisTmplate
- 注入其他組件即可
spring.redis | host | ||
port | |||
database | |||
password | |||
lettuce.pool | .maxActive | ||
.maxIdle | 空閑連接數(shù) | ||
.minIdle |
- 工具類對(duì)RedisTemplate封裝
- 方便操作系統(tǒng)中的key-value對(duì)
- 包括添加key-value對(duì)、根據(jù)key獲取對(duì)應(yīng)的value、根據(jù)key刪除指定key-value 對(duì)、判斷指定的key是否存在等
FkRedisUtil | get:獲取相應(yīng)的value | RedisTemplate: opsForValue: get |
set:添加key-value對(duì) | opsForValue: set: Duration.ofSeconds | |
exists:key是否存在 | RedisTemplate: hasKey; | |
delete:根據(jù)key刪除 | RedisTemplate: delete | |
incr | RedisTemplate: opsForValue: increment | |
decr | RedisTemplate: opsForValue: decrement | |
beanTostring | ObjectMapper.writeValueAsString; | |
stringToBean | ObjectMapper.readValue |
- 控制前綴部分,避免重復(fù)
- 控制過期時(shí)間
KeyPrefix | 定義prefix以及過期時(shí)間 |
便于KeyPrefix提供實(shí)現(xiàn)類,而作為基類
AbstractPrefix | 設(shè)置過期時(shí)間 定義:類名:prefix |
分布式Session的實(shí)現(xiàn)
- Session ID發(fā)送瀏覽器,以Cookie保存[UUID]
- 服務(wù)器端用Redis保存key-value信息,以客戶端的Session ID為key
- 對(duì)象:分布式Session
- 為了實(shí)現(xiàn)流程,定義操作Cookie工具類
- getSessionId工具方法就是分布式Session實(shí)現(xiàn)機(jī)制的第1步:通過Cookie來讀取Session ID;如果讀不到有效的Session ID,系統(tǒng)會(huì)生成一個(gè)隨機(jī)的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)建 | 對(duì)getCookieValue進(jìn)一步封裝 |
通過Redis緩存實(shí)現(xiàn)分布式Session
UserController | addSession: 分別保存 | |
getByToken:延長(zhǎng)有效期、讀取 |
只要任意控制器訪問系統(tǒng),攔截器就會(huì)向氛圍中的瀏覽器寫入Cookie,從而保存SessionID
AccessInterceptor | preHandle:訪問寫入、保存 攔截所有控制器的處理方法 | HandlerInterceptor: preHandle |
UserKey | key前綴以及有效時(shí)間 |
用戶登錄的實(shí)現(xiàn)
getLoginVerifyCode符合分布式的Session流程
UserController | toLogin | |
getLoginVerifyCode:驗(yàn)證碼 | @GetMappring(method) HttpServletResponse:getOutputStream | |
proLogin |