1. 詳細說說你的項目吧
從以下幾個方面進行項目介紹:
- 項目的背景,包括: 是自研還是外包、什么業務、服務的客戶群是誰、誰去運營等問題。
- 項目的業務流程
- 項目的功能模塊
- 項目的技術架構
- 個人工作職責
- 個人負責模塊的詳細說明,包括模塊的設計,所用到的技術,技術的實現方案等
例子:
- 我最近參與的項目是我們公司自研的專門針對成人職業技能教育的網絡課堂系統,網站提供了成人職業技能培訓的相關課程,如: 軟件開發培訓、職業資格證書培訓、成人學歷教育培訓等課程。
- 項目基于B2B2C的業務模式,培訓機構可以在平臺入駐、發布課程,我們公司作為運營方由專門的人員對發布的課程進行審核,審核通過后課程才可以發布成功,課程包括免費和收費兩種形式,對于免費課程普通用戶可以直接選課學習,對于收費課程在選課后需要支付成功才可以繼續學習。
- 本項目包括三個端: 用戶端(學生端)、機構端、運營端。核心模塊包括:內容管理、媒資管理、課程搜索、訂單支付、選課管理、認證授權等。
- 本項目采用前后端分離架構,后端采用SpringBoot、SpringCloud技術棧開發,數據庫使用了MySQL,還使用的Redis、消息隊列、分布式文件系統、Elasticsearch等中間件系統。
- 劃分的微服務包括:內容管理服務、媒資管理服務、搜索服務、訂單支付服務、學習中心服務、系統管理服務認證授權服務、網關服務、注冊中心服務、配置中心服務等。
- 我在這個項目中負責了內容管理、媒資管理、訂單支付模塊的設計與開發。
- 內容管理模塊,是對平臺上的課程進行管理,課程的相關信息比較多, 在數據庫設計了課程基本信息表、課程營銷表、課程計劃、課程師資表進行存儲,培訓機構要發布一門課程需要填寫課程基本信息、課程營銷信息、課程計劃信息、課程師資信息,填寫完畢后需要提交審核,由運營人員進行課程信息的審核,整個審核過程是程序自動審核加人工確認的方式,通常24小時審核完成。課程審核通過即可發布課程,課程的相關信息會聚合到課程發布表中,這里不僅要將課程信息寫到課程發布表還要將課程信息寫到索引庫、分布式文件系統中,所以這里存在分布式事務的問題,項目使用本地消息表加任務調度的方式去解決這里的分布式事務,保存數據的最終一致性。
2.Git沖突怎么處理
出現沖突的原因是因為本地文件的版本與遠程文件的版本不一致, 且同一行代碼內容不同時, Git工具就無法自動合并文件, 解決代碼沖突可以使用圖形化工具或者手動處理沖突, , 本質都是一樣的, 就是對沖突代碼進行人工取舍或修改, 圖形化工具比較方便, 處理完成后點擊apply進行應用就行了, 手動處理的話, 要自己提交暫存區并push文件
3.你在哪個分支開發
一般都是在獨立的開發分支進行開發, 開發完成后合并到主分支
4.maven的常用命令
mwn clean //清除target目錄中的生成結果
myn compile //編譯源代碼
mvn test //執行單元測試
mvn package //打包
myn install //打包并把打好的包保存到本地倉庫
mvn deploy //打包并把打好的包上傳到遠程倉庫
5.mavne依賴版本沖突怎么處理
maven依賴版本沖突一般是由于間接依賴導致一個jar包即有多個不同的版本,比如:A依賴了B的1.0版本,C依賴了B的2.0版本,項目依賴A和C從而間接依賴了B的1.0和2.0版本,此時B有兩個版本引入到了項目中,當存在版本沖突時可能會出現 ClassNotFoundException、NoSuchMethodError等錯誤。
處理版本沖突可以使用以下方法:
1、使用exclusions 排除依賴
比如: 我們只依賴B的1.0版本,此時可以在依賴C時排除對B的賴。
2、使用dependencyManagement鎖定版本號:
通常在父工程對依賴的版本統一管理。
比如: 我們只依賴B的1.0版本,此時可以在父工程中限定B的版本為1.0.
6.MySql常見的儲存引擎及區別
- InnoDB
支持事務
使用的鎖顆粒度默認為行級鎖, 可以支持更高的并發; 也支持表鎖
支持外鍵約束; 外鍵約束其實降低了表的查詢速度, 增加了表之間的耦合度
- MyISAM
不提供事務支持
只支持表級鎖
不支持外鍵
- memory
數據存儲在內存中
總結
MyISAM管理非事務表,提供高速存儲和檢索以及全文搜索能力,如果在應用中執行大量select操作,應該選擇MyISAM
InnDB用于事務處理,具有ACID事務支持等特性,如果在應用中執行大量insert和update操作,應該選擇InnoDB
7.mysql建表時要注意什么
MYSQL建表的經驗有很多,下邊列舉一些:
- 注意選擇存儲引擎,如果要支持事務需要選擇InnoDB:
- 注意字段類型的選擇,
對于日期類型: 如果要記錄時分秒建議使用datetime,只記錄年月日使用date類型,
對于字符類型的選擇,固定長度字段選擇char,不固定長度的字段選擇varchar,varchar比char節省空間但速度沒有char快;
對于內容介紹類的長廣文本字段使用text或longtext類型;
如果存儲圖片等二進制數據使用blob或longblob類型;
對金額字段建議使用DECIMAL;
對于數值類型的字段在確保取值范圍足夠的前提下盡量使用占用空間較小的類型,
- 主鍵字段建議使用自然主鍵,不要有業務意義,建議使用int unsigned類型,特殊場景使用bigint類型
- 如果要存儲text、blob字段建議單獨建一張表,使用外鍵關聯。
- 盡量不要定義外鍵,保證表的獨立性,可以存在外鍵意義的字段。
- 設置字段默認值,比如:狀態、創建時間等。
- 每個字段寫清楚注釋。
- 注意字段的約束,比如:非空、唯一、主鍵等
8.SpringBoot接口開發注解有哪些
@Controller 標記此類是一個控制器,可以返回視圖解析器指定的html頁面,通過@ResponseBody可以將結果返回json、xml數據。
@RestController 相當于@ResponseBody加 @Controller,實現rest接口開發,返回json數據,不能返回html頁面。
@RequestMapping定義接口地址,可以標記在類上也可以標記在方法上,支持http的post、put、get等方法
@PostMapping定義post接口,只能標記在方法上,用于添加記錄,復雜條件的查詢接口。@GetMapping定義get接口,只能標記在方法上,用于查詢接口的定義。
@PutMapping定義put接口,只能標記在方法上,用于修改接口的定義。
@DeleteMapping定義delete接口,只能標記在方法上,用于除接口的定義。
@RequestBody定義在方法上,用于將ison串轉成iava對象。
@PathVarible 接收請求路徑中占位符的值.
@ApiOperation swagger注解,對接口方法進行說明。
@Apiwagger注解,對接口類進行說明。
@Autowired 基于類型注入。
@Resour 基于名稱注入,如果基于名稱注入失敗轉為基于類型注入。
9.你項目的開發流程是什么
1、產品人員設計產品原型。
2、討論需求。
3、分模塊設計接口。
4、出接口文檔。
5、將接口文檔給到前端人員,前后端分離開發。
6、開發完畢進行測試。
7、測試完畢發布項目,由運維人員進行部署安裝。
10.Mybatis分頁插件的原理?
首先分頁參數放到ThreadLocal中,攔截執行的sql,根據數據庫類型添加對應的分頁語句重寫sql,例如:(select* from table where a) 轉換為 (select count(*) from table where a)和(select * from table where a limit ,)
計算出了total總條數、pageNum當前第幾頁、pagesize每頁大小和當前頁的數據,是否為首頁,是否為尾頁,總頁數等。
11.MyBatis的ResultType和ResultMap的區別?
ResultType:指定映射類型,只要查詢的字段名和類型的屬性名匹配可以自動映射。
ResutMap:自定義映射規則,當查詢的字段名和映射類型的屬性不匹配時可以通過ResultMap自定義映射規則, 也可以實現一對多、一對一映射。
12.樹型表的標記字段是什么? 如何查詢MySQL樹型表?
- 樹型表的標記字段是parentid即父結點的id。
- 查詢一個樹型表的方法:
1) 當層級固定時可以用表的自鏈接進行查詢。
2) 如果想靈活查詢每個層級可以使用mysql遞歸方法,使用with RECURSIVE 實現。
13.#{} 和 ${} 有什么區別?
#{}是標記一個占位符,可以防止sql注入。
${}用于在動態 sql中拼接字符串,可能導致sql注入。
14.系統如何處理異常?
我們自定義一個統一的異常處理器去捕獲并處理異常。
使用控制器增加注解@ControllerAdvice和異常處理注解@ExceptionHandler來實現。
1.處理自定義異常
程序在編寫代碼時根據校驗結果主動拋出自定義異常類對象,拋出異常時指定詳細的異常信息,異常處理器捕獲異常信息記錄異常日志并響應給用戶。
2.處理未知異常
接口執行過程中的一些運行時異常也會由異常處理器統一捕獲,記錄異常日志,統一響應給用戶500錯誤在異常處理器中還可以針對某個異常類型進行單獨處理。
15.請求參數的合法性校驗如何做?
使用基于ISR303的校驗框架實現,SpringBoot提供了JSR-303的支持,它就是spring-boot-starter-validation,它包括了很多校驗規則,只需要在模型類中通過注解指定校驗規則,在controller方法上開啟校驗。
16.什么情況下Spring事務會失效?
- 在方法中捕獲異常沒有拋出去
- 非事務方法調用事務方法
- 事務方法內部調用事務方法
- @Transactional標記的方法不是public
- 拋出的異常與rollbackFor指定的異常不匹配,默認rollbackFor指定的異常為RuntimeException
- 數據庫表不支持事務,比如MySQL的MyISAM
- Spring的傳播行為導致事務失效,
- 比如: ROPAGATION NEVER、PROPAGATION NOT SUPPORTED
- PROPAGATION REQUIRED- 支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇,
- PROPAGATION SUPPORTS-支持當前事務,如果當前沒有事務,就以非事務方式執行。
- PROPAGATION MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。
- PROPAGATION REQUIRES NEW - 新建事務,如果當前存在事務,把當前事務掛起。
- PROPAGATION_NOT_SUPPORTED-以非事務方式執行操作,如果當前存在事務,就把當前事務掛
起。
- PROPAGATION NEVER -以非事務方式執行,如果當前存在事務,則拋出異常。
- PROPAGATION NESTED-如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則與PROPAGATION REOUIRED類似的操作。
17.斷點續傳怎么實現的?
我們是基于分塊上傳的模式實現斷點續傳的需求,當文件上傳一部分斷網后前邊已經上傳過的不再上傳。
- 前端對文件分塊。
- 前端使用多線程一塊一塊上傳,上傳前給服務端發一個消息校驗該分塊是否上傳,如果已上傳則不再上傳。
- 等所有分塊上傳完畢,服務端合并所有分塊,校驗文件的完整性。
因為分塊全部上傳到了服務器,服務器將所有分塊按順序進行合并,就是寫每個分塊文件內容按順序依次寫入一個文件中。使用字節流去讀寫文件。
- 前端給服務傳了一個md5值,服務端合并文件后計算合并后文件的md5是否和前端傳的一樣,如果一樣則說文件完整,如果不一樣說明可能由于網絡丟包導致文件不完整,這時上傳失敗需要重新上傳。
18.分塊文件清理問題?
上傳一個文件進行分塊上傳,上傳一半不傳了,之前上傳到minio的分塊文件要清理嗎?怎么做的?
1、在數據庫中有一張文件表記錄minio中存儲的文件信息。
2、文件開始上傳時會寫入文件表,狀態為上傳中,上傳完成會更新狀態為上傳完成。
3、當一個文件傳了一半不再上傳了說明該文件沒有上傳完成,會有定時任務去查詢文件表中的記錄,如果文件未上傳完成則刪除minio中沒有上傳成功的文件目錄。
19.xxl-job的工作原理是什么?xxl-job是什么怎么工作?
XXL-J0B分布式任務調度服務由調用中心和執行器組成,調用中心負責按任務調度策略向執行器下發任務,執行器負責接收任務執行任務。
1)首先部罷并啟動xxl-job調度中心。(一個java工程)
2)首先在微服務添加xx1-job依賴,在微服務中配置執行器
3)啟動微服務,執行器向調度中心上報自己。
4)在微服務中寫一個任務方法并用xxl-job的注解去標記執行任務的方法名稱。5)在調度中心配置任務調度策略,調度策略就是每隔多長時間執行還是在每天或每月的固定時間去執行,比如每天0點執行,或每隔1小時執行一次等。
6)在調度中心啟動任務。
7)調度中心根據任務調度策略,到達時間就開始下發任務給執行器。
8)執行器收到任務就開始執行任務。
20.如何保證任務不重復執行?
1)調度中心按分片廣播的方式去下發任務
2)執行器收到作業分片廣播的參數:分片總數和分片序號,計算 任務id 除以 分片總數得到一個余數,如果余數等于分片序號這時就去執行這個任務,這里保證了不同的執行器執行不同的任務。
3)配置調度過期策略為"忽略”,避免同一個執行器多次重復執行同一個任務
4)配置任務阻塞處理策略為“丟棄后續調度”,注意:丟棄也沒事下一次調度就又可以執行了
5)另外還要保證任務處理的冪等性,執行過的任務可以打一個狀態標記已完成,下次再調度執行該任務判斷該任務已完成就不再執行
21.任務冪等性如何保證?
它描述了一次和多次請求某一個資源對于資源本身應該具有同樣的結果。冪等性是為了解決重復提交問題,比如:惡意刷單,重復支付等。解決冪等性常用的方案:
1)數據庫約束,比如:唯一索引,主鍵。同一個主鍵不可能兩次都插入成功。
2)樂觀鎖,常用于數據庫,更新數據時根據樂觀鎖狀態去更新。
3)唯一序列號,請求前生成唯一的序列號,攜帶序列號去請求,執行時在redis記錄該序列號表示以該序列號的請求執行過了,如果相同的序列號再次來執行說明是重復執行。這里我們在數據庫視頻處理表中添加處理狀態字段,視頻處理完成更新狀態為完成,執行視頻處理前判斷狀態是否完成,如果完成則不再處理。