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

《java架構師成長直通車》課程階段一學習筆記

《java架構師成長直通車》課程階段一學習筆記

單體架構、高可用集群、分布式架構、微服務

課程項目的大致發展是:單體架構 -> 高可用集群 -> 分布式架構 -> 微服務
其中就需要理解,單體架構、集群、分布式和微服務之間的區別了。
借用 知乎的熱門回答,簡單來講就是 單體架構 可以看做一名廚師,當門店生意很好的時候,此時雇請多第二名廚師,而這位廚師和之前的廚師能做出一模一樣的飯菜,此時就可以看做為一個 集群;而再后來生意更加好的時候,雇請了一些配菜員,他能干洗菜、切菜之類的工作,用來分擔廚師的負擔,此時廚師和配菜員的關系就是 分布式;如果工作再細分下去,比如這個配菜員只能洗菜,那個配菜員只能切菜,那么這就是 微服務 的概念了。

同時這里也區別一下 高并發高吞吐 之間的概念區別。可以拿CPU舉例,高吞吐 可以看做單核的處理能力,即一個請求發送到后端,此時系統數據量很大時,后端處理結果返回的響應速度。而 高并發 就像是多核的處理分配問題,一個網站積累的用戶越多,對后端的請求量就會越來越大,此時后端應對這種情況下的響應速度。

項目的開端

項目的開始就是技術的選型,區分了 SpringBootSpringMVC 的區別,其實主要理解 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-loggingExclude 剔除出去,并添加 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 語法(根據商品主鍵獲取評論數接口);
  • @RequestParamrequired 屬性為 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:適用于集群與分布式,可擴展性強
  • 高并發導致扣庫存問題,解決方式:
    • synchronized 修飾詞:不推薦使用,集群下無用,性能低下
    • 鎖數據庫:不推薦,導致數據庫性能低下
    • 分布式鎖:zookeepperreids
    • 適用樂觀鎖,什么是樂觀鎖,什么是悲觀鎖,什么是減少樂觀鎖的粒度,提高并發能力(創建訂單接口)
  • Service層拋出異常 RuntimeException 觸發事務回滾(創建訂單接口);
  • Mapper封裝了常用的方法中使用 pojo 實例查詢(根據用戶id獲取用戶地址);
  • 使用語法糖 BeanUtils.copyProperties(Object source, Object target); 實現不同類的對象之間相同屬性的賦值(用戶修改地址);
  • 付款超時時,要設置訂單的交易狀態為關閉,定時任務的創建:
    • 使用 @schedule 注釋開啟定時任務,缺點:
      • 1、有時間差,即每條訂單不一定會剛剛達到一天的時長后就馬上關閉,程序不嚴謹
      • 2、假如數據量大,全表查找全部未支付的訂單對數據庫造成性能負擔
      • 3、不支持集群,假設部署了多臺服務器,定時任務就會多臺執行,導致浪費,解決方案只使用一臺服務器單獨使用定時任務
      • 所以 @schedule 只適用一些小型輕量級項目,傳統項目
    • 最好使用消息隊列:MQ -> RabbitMQKafka 等的延時任務
  • 使用 RestTemplate 向支付中心發起請求

5 用戶中心模塊

  • 使用 hibernate 檢查傳入參數是否符合規格(更新用戶消息接口);
  • 添加靜態資源服務(獲取頭像圖片);
  • properties 文件映射為 Bean 實例使用(上傳用戶頭像接口);
  • 限制上傳文件的大小,并且全局捕獲異常(上傳用戶頭像接口);
  • 注意存放文件時,Window系統和Linux系統的路徑區別(上傳用戶頭像接口);
  • 更新頭像 url 到數據庫,需要添加時間戳,以防瀏覽器緩存;
  • MyBatis 插入一個列表的數據(用戶評價商品接口);
  • MyBatis 嵌套查詢,避免 PageHelper 插件出錯(獲取用戶的所有訂單接口);
  • Mapper封裝了常用的方法中使用 updateByExampleSelective,使 exemple 和 pojo 聯合更新操作(根據用戶id獲取用戶地址);

6 項目發布

  • linux 虛擬機如何聯網,修改 /etc/sysconfig/network-scripts/ifcfg-ens33 文件的 ONBOOTyes,然后執行 service network restart 刷新配置。 《NAT模式和橋接模式實現局域網其他物理機器與Vmware虛擬機互相訪問》;
  • 使用 ifconfig 獲取 IP 地址,端口為 22,連接 SecureCRT,FileZilla;
  • 設置防火墻,《Centos7 防火墻配置》;
  • 打包 war 包:
    • 1、設置 controller 層的 pom.xml 的打包類型為 war
    • 2、設置剔除 SpringBoot 內置 tomcat
    • 3、設置 war 包啟動類

https://www.nshth.com/java/338417.html
>

相关文章:

  • 有一個解謎的有外星人的游戲,【Pygame小游戲】 史上最經典的外星人游戲 ,全面保障 勇敢去闖 (未解之謎)
  • 2020年2月編程語言排行榜:Java第一,Python出現下滑!
  • 開一家手機配件店怎么樣,手機配件實體店好做不_震驚!手機實體店,你不得不防的套路!
  • bld設計公司,BLE外設設計
  • 手機如何連接外設,iOS 連接外設的幾種方式
  • 三星手機換電池視頻教程,三星2016換電池教程
  • 機械設計制造畢業設計題目,機械專業夾具類畢業設計題目匯總/組合機床、車床撥叉、飛錘支架、連接座、倒擋撥叉、蓋、法蘭盤、銅襯軸套、心軸零件、曲軸箱零件、托板、發動
  • Shell基礎(四):字符串截取及切割、字符串初值的處理、基使用Shell數組、expect預期交互、使用正則表達式...
  • shell編程入門,shell基礎之04
  • 計算機基礎知識試題及答案(全),計算機序列類型和字典試題,計算機考試試題和資料
  • 新開店鋪怎么做推廣,淘寶新開店鋪沒有生意不會推廣的苦衷與心得
  • 如何注冊商標,給大家科普一下商標小知識沒注冊下來的商標,做吊牌,做包裝袋,發朋友圈廣告時千萬不能打R。將未注冊商標冒充注冊商標使用的,或者使用未注冊商標的,最高
  • 商標繳費后多久初步審核通過,商標注冊需要多久下證
  • 商標買賣,信用百度公司商標信息爬取
  • 商標檢索網站,中國商標網 -爬蟲
  • 應用商店上架app容易么,iOS App 上架App Store及提交審核(Appuploader)
  • app證書失效了怎么辦,iOS證書申請打包上傳App Store審核完整流程(7個步驟)
  • 銀行合并后,10萬億同業存款免繳存準 全面降準將推遲
  • kindle買8g還是32g,萬字長文!對比分析了多款存儲方案,KeeWiDB最終選擇自己來
  • java中的final關鍵字有哪些用法,Java: static,final,代碼塊 的詳解
  • 服務器反應慢及解決辦法,Linux服務器 大量的CLOSE_WAIT、TIME_WAIT解決辦法
  • wait for的用法,oracle for update wait 解析
  • 如何手動關閉close_wait,CLOSE_WAIT和TIME_WAIT
  • 渲染軟件哪個好用,Windows平臺OpenGL渲染視頻
  • 怎樣說代碼讓人聽不懂,RPA初級認證直通車,不懂代碼也能成為技術大佬
  • java快速開發平臺 開源,快上車!Java技術開發大廠直通車馬上啟動!
  • 架構師培訓,Java高級:java架構師成長直通車pan
  • 【淘寶開店教程】淘寶直通車常見問題講解
  • 《java架構師成長直通車》課程階段一學習筆記
  • 視頻教程-Java面試Offer直通車-Java