SpringBoot分布式項目實戰項目


Spring boot分布式項目實戰項目

B站鏈接:【SpringBoot項目實戰】 2020最新在線教育 spring boot分布式項目實戰_嗶哩嗶哩_bilibili

項目中資源:

源碼+講義+筆記
資料:鏈接:https://pan.baidu.com/s/1JQC99C5sXj2pev94NbOw1w  密碼:nagl
源碼:鏈接:https://pan.baidu.com/s/1OGvCX0rosUFHIxKLiXw-Dw  密碼:umcq
筆記:鏈接:https://pan.baidu.com/s/1LbAjf5bkBCn7MWF4jNYnsA  密碼:u3k5

在線教育項目總結
1、總結在線教育項目功能點

2、總結在線教育項目技術點

3、總結在線教育項目問題

總結在線教育項目功能點
一、准備
1、把后端接口啟動起來
2、啟動前端項目(前台系統和后台系統)

二、項目后台管理系統功能
1、登錄功能(SpringSecurity框架)

2、權限管理模塊
(1)菜單管理:列表、添加、修改、刪除

(2)角色管理
* 列表、添加、修改、刪除、批量刪除
* 為角色分配菜單

(3)用戶管理
* 列表、添加、修改、刪除、批量刪除
* 為用戶分配角色

(4)權限管理表和關系
* 使用五張表

3、講師管理模塊
(1)條件查詢分頁列表、添加、修改、刪除

4、課程分類模塊
(1)添加課程分類
* 讀取Excel里面課程分類數據,添加到數據庫中

(2)課程分類列表
* 使用樹形結構顯示課程分類列表

5、課程管理模塊
(1)課程列表功能
(2)添加課程
* 課程發布流程:第一步填寫課程基本信息,第二步添加課程大綱(章節和小節),第三步課程信息確認,最終課程發布

* 課程如何判斷是否已經被發布了?使用status字段

* 課程添加過程中,中途把課程停止添加,重新去添加新的課程,如何找到之前沒有發布完成課程,繼續進行發布? 到課程列表中根據課程狀態查詢未發布的課程,點擊課程右邊超鏈接把課程繼續發布完成

(3)添加小節上傳課程視頻

6、統計分析模塊
(1)生成統計數據
(2)統計數據圖表顯示

三、項目前台用戶系統功能
1、首頁數據顯示
(1)顯示幻燈片功能
(2)顯示熱門課程
(3)顯示名師

2、注冊功能
(1)獲取手機驗證碼

3、登錄功能
(1)普通登錄和退出
* SSO(單點登錄)

⦁ JWT
⦁ 使用JWT生成token字符串
⦁ JWT有三部分組成:jwt頭信息,有效載荷,哈希簽名(防偽標志)

登錄實現流程
⦁ 登錄調用登錄接口返回token字符串,把返回token字符串放到cookie里面,創建前端攔截器進行判斷,如果cookie里面包含token字符串,把token字符串放到header里面。調用接口根據token獲取用戶信息,把用戶信息放到cookie里面,進行顯示

(2)微信掃描登錄
⦁ OAuth2
⦁ 定義:是針對特定問題解決方案
⦁ 主要有兩個問題:開放系統間授權,分布式訪問

⦁ 如何獲取掃描人信息過程?
⦁ 掃描之后微信接口返回code(臨時票據),拿着code值請求微信固定地址,得到兩個值:access_token(訪問憑證)和openid(微信唯一標識),你拿着這兩個值再去請求微信固定的地址,得到微信掃描人信息(比如昵稱,頭像等等)

4、名師列表功能

5、名師詳情功能

6、課程列表功能
(1)條件查詢分頁列表功能

7、課程詳情頁
(1)課程信息顯示(包含課程基本信息,分類,講師,課程大綱)
(2)判斷課程是否需要購買

8、課程視頻在線播放

9、課程支付功能(微信支付)
(1)生成課程訂單
(2)生成微信支付二維碼
(3)微信最終支付

* 微信支付實現流程
* 如果課程是收費課程,點擊立即購買,生成課程訂單
* 點擊訂單頁面去支付,生成微信支付二維碼
* 使用微信掃描支付二維碼實現支付
* 支付之后,每隔3秒查詢支付狀態(是否支付成功),如果沒有支付成功等待,如果支付成功之后,更新訂單狀態(已經支付狀態),向支付記錄表添加支付成功記錄

總結在線教育項目技術點(前端)
1、在線教育項目采用前后端分離開發

2、項目使用前端技術
(1)vue
* 基本語法
* 常見指令 : v-bind v-model v-if v-for v-html
* 綁定事件: v-on-click @click
* 生命周期:created() 頁面渲染之前 mounted()頁面渲染之后
* ES6規范

(2)Element-ui

(3)nodejs
* 是JavaScript運行環境,不需要瀏覽器直接運行js代碼,模擬服務器效果

(4)NPM
* 包管理工具,類似於Maven
* npm命令: npm init npm install 依賴名稱

(5)Babel
* 轉碼器,可以把ES6代碼轉換成ES5代碼

(6)前端模塊化
* 通過一個頁面或者一個js文件,調用另外一個js文件里面的方法
* 問題:ES6的模塊化無法在Node.js中執行,需要用Babel編輯成ES5后再執行

(6)后台系統使用vue-admin-template
* 基於vue+Element-ui

(7)前台系統使用Nuxt
* 基於vue
* 服務器渲染技術

(8)Echarts
* 圖表工具

總結在線教育項目技術點(后端技術一)
1、項目采用微服務架構

2、SpringBoot
(1)SpringBoot本質是就是Spring,只是快速構建Spring工程腳手架
(2)細節:
* 啟動類包掃描機制
* 設置掃描規則 @ComponentScan("包路徑")
* 配置類
(3)SpringBoot配置文件
* 配置文件類型:properties和yml
* 配置文件加載順序:bootstrap application application-dev

3、SpringCloud
(1)是很多框架總稱,使用這些框架實現微服務架構,基於SpringBoot實現
(2)組成框架有哪些?

(3)項目中,使用阿里巴巴Nacos,替代SpringCloud一些組件

(4)Nacos
* 使用Nacos作為注冊中心
* 使用Nacos作為配置中心

(5)Feign
* 服務調用,一個微服務調用另外一個微服務,實現遠程調用

(6)熔斷器

*容錯處理

(7)Gateway網關
* SpringCloud之前zuul網關,目前Gateway網關

(8)版本

4、MyBatisPlus
(1)MyBatisPlus就是對MyBatis做增強
(2)自動填充
(3)樂觀鎖
(4)邏輯刪除
(5)代碼生成器

5、EasyExcel
(1)阿里巴巴提供操作excel工具,代碼簡潔,效率很高
(2)EasyExcel對poi進行封裝,采用SAX方式解析
(3)項目應用在添加課程分類,讀取excel數據

總結在線教育項目技術點(后端技術二)
1、Spring Security
(1)在項目整合框架實現權限管理功能
(2)SpringSecurity框架組成:認證和授權
(3)SpringSecurity登錄認證過程

(4)SpringSecurity代碼執行過程

2、Redis
(1)首頁數據通過Redis進行緩存
(2)Redis數據類型
(3)使用Redis作為緩存,不太重要或者不經常改變數據適合放到Redis作為緩存

3、Nginx
(1)反向代理服務器
(2)請求轉發,負載均衡,動靜分離

4、OAuth2+JWT
(1)OAuth2針對特定問題解決方案
(2)JWT包含三部分

5、HttpClient
(1)發送請求返回響應的工具,不需要瀏覽器完成請求和響應的過程
(2)應用場景:微信登錄獲取掃描人信息,微信支付查詢支付狀態

6、Cookie
(1)Cookie特點:
* 客戶端技術
* 每次發送請求帶着cookie值進行發送
* cookie有默認會話級別,關閉瀏覽器cookie默認不存在了,
* 但是可以設置cookie有效時長 setMaxAge

7、微信登錄

8、微信支付

9、阿里雲OSS
(1)文件存儲服務器
(2)添加講師時候上傳講師頭像

10、阿里雲視頻點播
(1)視頻上傳、刪除、播放
(2)整合阿里雲視頻播放器進行視頻播放
* 使用視頻播放憑證

11、阿里雲短信服務
(1)注冊時候,發送手機驗證碼

12、Git
(1)代碼提交到遠程Git倉庫

13、Docker+Jenkins
(1)手動打包運行
(2)idea打包
(3)jenkins自動化部署過程

總結在線教育項目問題
1、前端問題-路由切換問題
(1)多次路由跳轉到同一個vue頁面,頁面中created方法只會執行一次
(2)解決方案:使用vue監聽

2、前端問題-ES6模塊化運行問題
(1)Nodejs不能直接運行ES6模塊化代碼,需要使用Babel把ES6模塊化代碼轉換ES5代碼 執行

3、mp生成19位id值
(1)mp生成id值是19位,JavaScript處理數字類型值時候,只會處理到16位

4、跨域問題
(1)訪問協議,ip地址,端口號,這三個如果有任何一個不一樣,產生跨域
(2)跨域解決:
* 在Controller添加注解
* 通過網關解決

5、413問題
(1)上傳視頻時候,因為Nginx有上傳文件大小限制,如果超過Nginx大小,出現413
(2)413錯誤:請求體過大
(3)如何解決?:在Nginx配置客戶端大小
(4)響應狀態碼:413 403 302

6、Maven加載問題
(1)maven加載項目時候,默認不會加載src-java文件夾里面xml類型文件的
(2)解決方案:
* 直接復制xml文件到target目錄
* 通過配置實現

面試問題

1、項目描述(重點

(1)
在線教育系統,分為前台網站系統和后台運營平台,B2C模式。
前台用戶系統包括課程、講師、問答、文章幾個大部分,使用了微服務技術架構,前后端分離開發。
后端的主要技術架構是:SpringBoot + SpringCloud + MyBatis-Plus + HttpClient + MySQL + Maven+EasyExcel+ nginx
前端的架構是:Node.js + Vue.js +element-ui+NUXT+ECharts
 
其他涉及到的中間件包括Redis、阿里雲OSS、阿里雲視頻點播
業務中使用了ECharts做圖表展示,使用EasyExcel完成分類批量添加、注冊分布式單點登錄使用了JWT
 
(2)
項目前后端分離開發,后端采用SpringCloud微服務架構,持久層用的是MyBatis-Plus,微服務分庫設計,使用Swagger生成接口文檔
接入了阿里雲視頻點播、阿里雲OSS
系統分為前台用戶系統和后台管理系統兩部分。
前台用戶系統包括:首頁、課程、名師、問答、文章。
后台管理系統包括:講師管理、課程分類管理、課程管理、統計分析、Banner管理、訂單管理、權限管理等功能。
 
在線教育計費案例:
小A是一名杭州的創業者,帶領團隊研發了一個在線教育平台。他希望把視頻托管在阿里雲上,存量視頻大約1000個,占用存儲空間近1T,每月預計新增視頻100個,並新增存儲約100G,課程視頻的時長集中在20-40分鍾,並且按照不同課程進行分類管理。為了保障各端的觀看效果,計划為用戶提供“標清480P”和“高清720P”兩種清晰度。目前已有用戶400人左右,每日平均視頻觀看次數1000次,在移動端和PC端觀看次數比例大致為3:1。

2、這是一個項目還是一個產品

這是一個產品
1.0版本是單體應用:SSM
2.0版本加入了SpringCloud,將一些關鍵業務和訪問量比較大的部分分離了出去
目前獨立出來的服務有教學服務、視頻點播服務、用戶服務、統計分析服務、網關服務

3、測試要求

首頁和視頻詳情頁qps單機qps要求 2000+
經常用每秒查詢率來衡量域名系統服務器的機器的性能,其即為QPS
QPS = 並發量 / 平均響應時間

4、企業中的項目(產品)開發流程

一個中大型項目的開發流程
1、需求調研(產品經理)
2、需求評審(產品/設計/前端/后端/測試/運營)
3、立項(項目經理、品管)
4、UI設計
5、開發
  • 架構、數據庫設計、API文檔、MOCK數據、開發、單元測試
  • 前端
  • 后端
6、前端后端聯調
7、項目提測:黑盒白盒、壓力測試(qps)  loadrunner
8、bug修改
9、回歸測試
10、運維和部署上線
11、灰度發布
12、全量發布
13、維護和運營
 

5、系統中都有那些角色?數據庫是怎么設計的?

前台:會員(學員)
后台:系統管理員、運營人員
后台分庫,每個微服務一個獨立的數據庫,使用了分布式id生成器  

6、視頻點播是怎么實現的(流媒體你們是怎么實現的)

我們直接接入了阿里雲的雲視頻點播。雲平台上的功能包括視頻上傳、轉碼、加密、智能審核、監控統計等。
還包括視頻播放功能,阿里雲還提供了一個視頻播放器。

7、前后端聯調經常遇到的問題:

      1、請求方式post、get
      2、json、x-wwww-form-urlencoded混亂的錯誤
      3、后台必要的參數,前端省略了
      4、數據類型不匹配
      5、空指針異常
      6、分布式系統中分布式id生成器生成的id 長度過大(19個字符長度的整數),js無法解析(js智能解析16個長度:2的53次冪)
          id策略改成 ID_WORKER_STR

8、前后端分離項目中的跨域問題是如何解決的

后端服務器配置:我們的項目中是通過Spring注解解決跨域的 @CrossOrigin
也可以使用nginx反向代理、httpClient、網關

9、說說你做了哪個部分、遇到了什么問題、怎么解決的

問題1:
分布式id生成器在前端無法處理,總是在后三位進行四舍五入。
分布式id生成器生成的id是19個字符的長度,前端javascript腳本對整數的處理能力只有2的53次方,也就是最多只能處理16個字符
解決的方案是把id在程序中設置成了字符串的性質
 
問題2:
項目遷移到Spring-Cloud的時候,經過網關時,前端傳遞的cookie后端一只獲取不了,看了cloud中zuul的源碼,發現向下游傳遞數據的時候,zull默認過濾了敏感信息,將cookie過濾掉了
解決的方案是在配置文件中將請求頭的過濾清除掉,使cookie可以向下游傳遞
 
問題3.......

10、分布式系統的id生成策略

11、項目組有多少人,人員如何組成?

太教條化:10幾個人,1個項目經理,1個架構師,3個后端,2個前端,2個運維,1個測試,1個美工,幾個運營

12、分布式系統的CAP原理

CAP定理:
指的是在一個分布式系統中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性),三者不可同時獲得。
 一致性(C):在分布式系統中的所有數據備份,在同一時刻是否同樣的值。(所有節點在同一時間的數據完全一致,越多節點,數據同步越耗時)
可用性(A):負載過大后,集群整體是否還能響應客戶端的讀寫請求。(服務一直可用,而且是正常響應時間)
分區容錯性(P):分區容錯性,就是高可用性,一個節點崩了,並不影響其它的節點(100個節點,掛了幾個,不影響服務,越多機器越好)
 
CA 滿足的情況下,P不能滿足的原因:
數據同步(C)需要時間,也要正常的時間內響應(A),那么機器數量就要少,所以P就不滿足
  
CP 滿足的情況下,A不能滿足的原因:
數據同步(C)需要時間, 機器數量也多(P),但是同步數據需要時間,所以不能再正常時間內響應,所以A就不滿足
 
AP 滿足的情況下,C不能滿足的原因:
機器數量也多(P),正常的時間內響應(A),那么數據就不能及時同步到其他節點,所以C不滿足
 
注冊中心選擇的原則:
Zookeeper:CP設計,保證了一致性,集群搭建的時候,某個節點失效,則會進行選舉行的leader,或者半數以上節點不可用,則無法提供服務,因此可用性沒法滿足
Eureka:AP原則,無主從節點,一個節點掛了,自動切換其他節點可以使用,去中心化
 
結論:
分布式系統中P,肯定要滿足,所以我們只能在一致性和可用性之間進行權衡
如果要求一致性,則選擇zookeeper,如金融行業
如果要求可用性,則Eureka,如教育、電商系統
沒有最好的選擇,最好的選擇是根據業務場景來進行架構設計

 13、前端渲染和后端渲染有什么區別

前端渲染是返回json給前端,通過javascript將數據綁定到頁面上
后端渲染是在服務器端將頁面生成直接發送給服務器,有利於SEO的優化
 
14、能畫一下系統架構圖嗎
好了項目復盤到此結束了,總體上收獲到了很多東西。
當然也可以看這位老哥寫的,估計也把這個項目實現了一下,寫的不錯哈哈!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM