《java架構師成長直通車》課程階段一學習筆記
《java架構師成長直通車》課程階段一學習筆記
單體架構、高可用集群、分布式架構、微服務
課程項目的大致發展是:單體架構
-> 高可用集群
-> 分布式架構
-> 微服務
。
其中就需要理解,單體架構、集群、分布式和微服務之間的區別了。
借用 知乎的熱門回答,簡單來講就是 單體架構 可以看做一名廚師,當門店生意很好的時候,此時雇請多第二名廚師,而這位廚師和之前的廚師能做出一模一樣的飯菜,此時就可以看做為一個 集群;而再后來生意更加好的時候,雇請了一些配菜員,他能干洗菜、切菜之類的工作,用來分擔廚師的負擔,此時廚師和配菜員的關系就是 分布式;如果工作再細分下去,比如這個配菜員只能洗菜,那個配菜員只能切菜,那么這就是 微服務 的概念了。
同時這里也區別一下 高并發 和 高吞吐 之間的概念區別。可以拿CPU舉例,高吞吐 可以看做單核的處理能力,即一個請求發送到后端,此時系統數據量很大時,后端處理結果返回的響應速度。而 高并發 就像是多核的處理分配問題,一個網站積累的用戶越多,對后端的請求量就會越來越大,此時后端應對這種情況下的響應速度。
項目的開端
項目的開始就是技術的選型,區分了 SpringBoot
和 SpringMVC
的區別,其實主要理解 SpringBoot
的核心設計思想就能明白二者的區別,它的核心設計思想就是:約定優于配置,它默認配置了很多框架的使用方式,就像 Maven 整合了所有的 jar 包,SpringBoot
整合了所有的框架,本質上開發人員只需規定應用中不符合約定的部分就可以了,而不是得像 SpringMVC
那樣配置所有信息。例如 SpringBoot
約定 Controller
層就是 Web 請求層,這就可以省略了 MVC 的配置,約定了 以 Service 結尾 的類自動注入事務,這就可以省略 Spring 的切面事務配置等等。
在確認使用 SpringBoot 后就可以正式地學習教程了。
- 項目的開啟初期就應該理順數據表、創建好數據表,這里使用了
PDman
數據建模工具,詳情可看 《PDMan筆記》,同時初始化項目的聚合工程,詳情可看《SpringBoot 筆記(項目初始化)》; - 使用了自定義的 MyBatis 逆向生成工具,他可以幫助生成 Pojo、Dao、Mapper,并且生成的 Mapper 接口封裝了常用的方法。
- 整合 Swagger2,Swagger 2是一個接口文檔生成工具,使用它可以與前端對接時省事很多,同時它也能提供很好的測試接口功能;
- 整合日志,由于SpringBoot包含的日志包比較臃腫,這里在 pom 文件中使用右鍵選擇
Diagrams
->show dependencies
i顯示依賴匯總圖,并把內置的spring-boot-starter-logging
給Exclude
剔除出去,并添加slf4j
日志依賴,同時編寫log4j.properties
依賴配置文件,此時要注意的是日志的輸出路徑,如果是window系統時,不寫具體的硬盤名稱,會以項目所在的硬盤添加該設置的路徑作為最終日志文件的存放路徑; - 設置 Service 層切面,日志輸出記錄每個 Service 的耗時時間;
- 單元測試,直接配置在api層即可;
- 開發環境和生產環境時,
Application.yml
文件的配置; - 設置跨域
- 設置
spring-boot-devtools
熱部署,《IntelliJ IDEA Spring boot devtools 實現熱部署》,要注意
至此,項目的初始化就基本完成了。
完成單體項目下來需要記下來的點
1 用戶模塊
- 統一規范,VO,BO,pojo;
- 前后端的 cookies 交互;
@RequestBody
、@RequestParam
,@PathVariable
(首頁根據分類Id 獲取六個商品推薦的接口) 的區別;
2 首頁模塊
- Mapper封裝了常用的方法中使用
example
實例的升降序查詢(首頁獲取輪播圖列表接口); - 自定義Mapper接口,返回的pojo類中還有數組屬性的字段,該如何編寫 XML 文件映射到自定義 VO 對象(根據父級Id 獲取其下一級的所有子分類信息接口);
- sql 語句中的反單引號 ` 的作用;
3 商品模塊
- sql語句根據表中某個字段的取值不同,從而查詢該表對應條件時的匯總數量,使用
case
語法(根據商品主鍵獲取評論數接口); @RequestParam
的required
屬性為false
時,前端的傳值方式(根據關鍵詞獲取商品列表接口);- 使用
PageHelper
分頁插件(根據關鍵詞獲取商品列表接口); - MyBatis 的
<if>
標簽;<choose>
標簽;test
屬性判斷單個字符串時,如何告訴 Mybatis 該比較類型是String
,而不要和char
類型混淆;${}
和#{}
的區別(根據關鍵詞獲取商品列表接口); - 數組轉化到集合的語法糖:
Collections.addAll(集合, 數組);
(根據規格id集合字符串獲取最新商品信息接口); - MyBatis 的
<foreach>
標簽(根據規格id集合字符串獲取最新商品信息接口);
4 訂單模塊
- 購物車的存儲信息方式:
- Cookie:
- 優點:性能好、訪問快,沒有與數據庫交互
- 缺點1:更換電腦購物車數據會丟失
- 缺點2:電腦被其他人登錄,隱私安全問題
- Session
- 優點:初期性能好。訪問快
- 缺點1:Session 基于內存,用戶量龐大影響服務器性能
- 缺點2:只能存在與當前會話,不適用集群與分布式系統
- 數據庫
- 優點:數據持久化,可在任何地方任何時間訪問
- 缺點:頻繁讀寫數據庫,造成數據庫壓力
- Redis 緩存
- 優點:數據持久化,可在任何地方任何時間訪問
- 優點2:頻繁讀寫只基于緩存,不會造成數據庫壓力
- 優點3:適用于集群與分布式,可擴展性強
- Cookie:
- 高并發導致扣庫存問題,解決方式:
synchronized
修飾詞:不推薦使用,集群下無用,性能低下- 鎖數據庫:不推薦,導致數據庫性能低下
- 分布式鎖:
zookeepper
,reids
- 適用樂觀鎖,什么是樂觀鎖,什么是悲觀鎖,什么是減少樂觀鎖的粒度,提高并發能力(創建訂單接口)
- Service層拋出異常
RuntimeException
觸發事務回滾(創建訂單接口); - Mapper封裝了常用的方法中使用 pojo 實例查詢(根據用戶id獲取用戶地址);
- 使用語法糖
BeanUtils.copyProperties(Object source, Object target);
實現不同類的對象之間相同屬性的賦值(用戶修改地址); - 付款超時時,要設置訂單的交易狀態為關閉,定時任務的創建:
- 使用
@schedule
注釋開啟定時任務,缺點:- 1、有時間差,即每條訂單不一定會剛剛達到一天的時長后就馬上關閉,程序不嚴謹
- 2、假如數據量大,全表查找全部未支付的訂單對數據庫造成性能負擔
- 3、不支持集群,假設部署了多臺服務器,定時任務就會多臺執行,導致浪費,解決方案只使用一臺服務器單獨使用定時任務
- 所以
@schedule
只適用一些小型輕量級項目,傳統項目
- 最好使用消息隊列:
MQ
->RabbitMQ
,Kafka
等的延時任務
- 使用
- 使用
RestTemplate
向支付中心發起請求
5 用戶中心模塊
- 使用
hibernate
檢查傳入參數是否符合規格(更新用戶消息接口); - 添加靜態資源服務(獲取頭像圖片);
- 將
properties
文件映射為 Bean 實例使用(上傳用戶頭像接口); - 限制上傳文件的大小,并且全局捕獲異常(上傳用戶頭像接口);
- 注意存放文件時,Window系統和Linux系統的路徑區別(上傳用戶頭像接口);
- 更新頭像 url 到數據庫,需要添加時間戳,以防瀏覽器緩存;
- MyBatis 插入一個列表的數據(用戶評價商品接口);
- MyBatis 嵌套查詢,避免 PageHelper 插件出錯(獲取用戶的所有訂單接口);
- Mapper封裝了常用的方法中使用
updateByExampleSelective
,使exemple
和 pojo 聯合更新操作(根據用戶id獲取用戶地址);
6 項目發布
- linux 虛擬機如何聯網,修改
/etc/sysconfig/network-scripts/ifcfg-ens33
文件的ONBOOT
為yes
,然后執行service network restart
刷新配置。 《NAT模式和橋接模式實現局域網其他物理機器與Vmware虛擬機互相訪問》; - 使用
ifconfig
獲取 IP 地址,端口為22
,連接 SecureCRT,FileZilla; - 設置防火墻,《Centos7 防火墻配置》;
- 打包 war 包:
- 1、設置 controller 層的
pom.xml
的打包類型為war
- 2、設置剔除 SpringBoot 內置 tomcat
- 3、設置 war 包啟動類
- 1、設置 controller 層的