当前位置: 首页>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
>

相关文章:

  • pdf去水印軟件免費版,java批量去除pdf簽名,刪除簽名圖標
  • java多線程面試題及答案,JAVA8線程池THREADPOOLEXECUTOR底層原理及其源碼解析
  • java編程,java.lang.Class:是反射的源頭
  • java基礎面試題及答案,HTML CSS 基礎 面試題
  • java編寫軟件工具,Xson:Java對象序列化和反序列化工具
  • nlp預訓練模型,NLP-D62-nlp比賽D31刷題D15
  • kafka如何使用,kafka javax.management.InstanceAlreadyExistsException: kafka.consumer:
  • ssm畢設項目企業部門報銷管理g9d62(java+VUE+Mybatis+Maven+Mysql+sprnig)
  • java小游戲合集,java 煙花_Java 美麗的煙花
  • table列合并,poi操作excel之列合并
  • 找不到指定模塊怎么辦,在烏版圖安裝軟件包時候報錯:E:無法定位軟件包
  • 學云計算好就業嗎,對不起,云計算技術又走錯路了
  • 數電模電基礎知識總結,數電模電實驗課程
  • java的基礎知識,「JavaSE」-面向對象
  • 擴展內存,Java編程內存分析簡要
  • java多線程面試題及答案,【階段一】java之面向對象上
  • java 工作流框架,Activiti工作流使用之SpringBoot整合Activiti
  • 模型的應用形態包括哪些,模型設計準則
  • c語言程序設計培訓班南寧,南寧從零開始學習編程
  • 服務器,Spring Security oAuth2創建認證服務器模塊
  • Java jdk14.0.1安裝簡單步驟
  • 安裝ug12.0當前頁面的腳本發生錯誤,ug提示找不到html文件,[圖文教程] 以下文件無法加載,導致打開操作失敗: 使用當前搜索選項找不到文件,部件已卸載.
  • java執行cmd命令找不到指定文件,java編譯找不到文件_解決cmd運行java程序“找不到文件”提示的方案
  • 線上學畫畫的機構排名,拍樂云推出業內首個「線上美術教學音視頻方案」,打造極致互動體驗
  • day18-java
  • 取兩者中較小值函數,求兩個數中的較大值
  • java多線程面試題及答案,python中的多任務-多線程和多進程
  • 關于Arthas如何遠程監視Java程序
  • Java8 Stream流中的 collect() 方法,遠比你想象中的強大
  • 劉德華《天若有情》,天若有情