常見(jiàn)技術(shù)場(chǎng)景
1.單點(diǎn)登錄這塊怎么實(shí)現(xiàn)的
1.1 概述
單點(diǎn)登錄的英文名叫做:Single Sign On(簡(jiǎn)稱(chēng)SSO),只需要登錄一次,就可以訪問(wèn)所有信任的應(yīng)用系統(tǒng)
在以前的時(shí)候,一般我們就單系統(tǒng),所有的功能都在同一個(gè)系統(tǒng)上。
單體系統(tǒng)的session共享
-
登錄:將用戶(hù)信息保存在Session對(duì)象中
-
- 如果在Session對(duì)象中能查到,說(shuō)明已經(jīng)登錄
- 如果在Session對(duì)象中查不到,說(shuō)明沒(méi)登錄(或者已經(jīng)退出了登錄)
- 如果在Session對(duì)象中能查到,說(shuō)明已經(jīng)登錄
-
注銷(xiāo)(退出登錄):從Session中刪除用戶(hù)的信息
后來(lái),我們?yōu)榱?strong>合理利用資源和降低耦合性,于是把單系統(tǒng)拆分成多個(gè)子系統(tǒng)。
多系統(tǒng)即可能有多個(gè)Tomcat,而Session是依賴(lài)當(dāng)前系統(tǒng)的Tomcat,所以系統(tǒng)A的Session和系統(tǒng)B的Session是不共享的。
而單點(diǎn)登錄就是,多系統(tǒng)中,在一個(gè)系統(tǒng)/機(jī)器/微服務(wù)中登錄了,在登錄到期之前,訪問(wèn)其他系統(tǒng)的服務(wù),不必重新登錄驗(yàn)證
解決系統(tǒng)之間Session不共享問(wèn)題有一下幾種方案:
- Tomcat集群Session全局復(fù)制(最多支持5臺(tái)tomcat,不推薦使用)
- JWT(常見(jiàn))
- Oauth2
- CAS
- 自己實(shí)現(xiàn)(redis+token)
1.2 JWT解決單點(diǎn)登錄
現(xiàn)在有一個(gè)微服務(wù)的簡(jiǎn)單架構(gòu),如圖:
使用 jwt 解決單點(diǎn)登錄的流程如下:
因?yàn)檎?qǐng)求可能是直接訪問(wèn)微服務(wù),而不是靠網(wǎng)關(guān)轉(zhuǎn)發(fā)
但是使用網(wǎng)關(guān)進(jìn)行登錄 token 校驗(yàn)是有必要的
通過(guò)在網(wǎng)關(guān)層面進(jìn)行登錄 token 校驗(yàn)可以提前攔截非法請(qǐng)求和無(wú)效 token,減輕后續(xù)微服務(wù)的負(fù)擔(dān),提高系統(tǒng)的安全性和性能
雖然最終在微服務(wù)內(nèi)部也需要再次校驗(yàn) token,但通過(guò)在網(wǎng)關(guān)層面處理可以有效過(guò)濾掉一些無(wú)效請(qǐng)求,避免將這部分請(qǐng)求傳遞給后端微服務(wù)
在單個(gè)微服務(wù),還是得 SpringSecurity 或者攔截器,去處理一下校驗(yàn)token;
1.3 回答要點(diǎn)
-
先解釋什么是單點(diǎn)登錄
- 單點(diǎn)登錄的英文名叫做:Single Sign On(簡(jiǎn)稱(chēng)SSO)
-
介紹自己項(xiàng)目中涉及到的單點(diǎn)登錄(即使沒(méi)涉及過(guò),也可以說(shuō)實(shí)現(xiàn)的思路)
-
介紹單點(diǎn)登錄的解決方案,以 JWT 為例
- 用戶(hù)訪問(wèn)其他系統(tǒng),會(huì)在網(wǎng)關(guān)判斷token是否有效
- 如果token無(wú)效則會(huì)返回401(認(rèn)證失?。┣岸颂D(zhuǎn)到登錄頁(yè)面
- 用戶(hù)發(fā)送登錄請(qǐng)求,返回瀏覽器一個(gè)token,瀏覽器把token保存到cookie
- 再去訪問(wèn)其他服務(wù)的時(shí)候,都需要攜帶token(請(qǐng)求頭),由網(wǎng)關(guān)統(tǒng)一驗(yàn)證后路由到目標(biāo)服務(wù)
2.權(quán)限認(rèn)證是如何實(shí)現(xiàn)的
2.1 概述
后臺(tái)的管理系統(tǒng),更注重權(quán)限控制,最常見(jiàn)的就是RBAC模型來(lái)指導(dǎo)實(shí)現(xiàn)權(quán)限
RBAC(Role-Based Access Control)基于角色的訪問(wèn)控制
-
3個(gè)基礎(chǔ)部分組成:用戶(hù)、角色、權(quán)限
-
具體實(shí)現(xiàn)
-
5張表(用戶(hù)表、角色表、權(quán)限表、用戶(hù)角色中間表、角色權(quán)限中間表)
-
7張表(用戶(hù)表、角色表、權(quán)限表、菜單表、用戶(hù)角色中間表、角色權(quán)限中間表、權(quán)限菜單中間表)
- 菜單表 ==> 頁(yè)面的層級(jí)結(jié)果,每個(gè)模塊/按鈕,存儲(chǔ)的是樹(shù)(頁(yè)面的核心功能的 DOM 樹(shù))
- 權(quán)限菜單中間表 ==> 把頁(yè)面的模塊與權(quán)限關(guān)聯(lián)起來(lái),這樣就可以只展示一部分模塊給用戶(hù),避免用戶(hù)去訪問(wèn)沒(méi)有權(quán)限的接口(雖然哪怕展示了也訪問(wèn)不了)
-
2.2 RBAC權(quán)限模型
最常見(jiàn)的 5 張表的關(guān)系
數(shù)據(jù)流轉(zhuǎn)
張三具有什么權(quán)限呢?
流程:張三登錄系統(tǒng)—> 查詢(xún)張三擁有的角色列表—>再根據(jù)角色查詢(xún)擁有的權(quán)限
在實(shí)際的開(kāi)發(fā)中,也會(huì)使用權(quán)限框架完成權(quán)限功能的實(shí)現(xiàn),并且設(shè)置多種粒度,常見(jiàn)的框架有:
- Apache shiro
- Spring security(推薦)
2.3 回答要點(diǎn)
-
后臺(tái)管理系統(tǒng)的開(kāi)發(fā)經(jīng)驗(yàn)
-
介紹 RBAC 權(quán)限模型5張表的關(guān)系(用戶(hù)、角色、權(quán)限)
-
權(quán)限框架:Spring Security
3. 上傳數(shù)據(jù)的安全性你們?cè)趺纯刂疲?/h3>
3.1 概述
這里的安全性,主要說(shuō)的是,瀏覽器訪問(wèn)后臺(tái),需要經(jīng)過(guò)網(wǎng)絡(luò)傳輸,有可能會(huì)出現(xiàn)安全的問(wèn)題
解決方案:使用非對(duì)稱(chēng)加密(或?qū)ΨQ(chēng)加密),給前端一個(gè)公鑰讓他把數(shù)據(jù)加密后傳到后臺(tái),后臺(tái)負(fù)責(zé)解密后處理數(shù)據(jù)
3.2 對(duì)稱(chēng)加密
文件加密和解密使用相同的密鑰,即加密密鑰也可以用作解密密鑰
-
數(shù)據(jù)發(fā)信方將明文和加密密鑰一起經(jīng)過(guò)特殊的加密算法處理后,使其變成復(fù)雜的加密密文發(fā)送出去,
-
收信方收到密文后,若想解讀出原文,則需要使用加密時(shí)用的密鑰以及相同加密算法的逆算法對(duì)密文進(jìn)行解密,才能使其回復(fù)成可讀明文。
-
在對(duì)稱(chēng)加密算法中,使用的密鑰只有一個(gè),收發(fā)雙方都使用這個(gè)密鑰,這就需要解密方事先知道加密密鑰。
優(yōu)點(diǎn): 對(duì)稱(chēng)加密算法的優(yōu)點(diǎn)是算法公開(kāi)、計(jì)算量小、加密速度快、加密效率高。
缺點(diǎn): 沒(méi)有非對(duì)稱(chēng)加密安全.
用途: 一般用于保存用戶(hù)手機(jī)號(hào)、身份證等敏感但能解密的信息。
常見(jiàn)的對(duì)稱(chēng)加密算法有: AES、DES、3DES、Blowfish、IDEA、RC4、RC5、RC6、HS256
3.3 非對(duì)稱(chēng)加密
兩個(gè)密鑰:公開(kāi)密鑰(publickey)和私有密鑰,公有密鑰加密,私有密鑰解密
解釋: 同時(shí)生成兩把密鑰:私鑰和公鑰,私鑰隱秘保存,公鑰可以下發(fā)給信任客戶(hù)端.
加密與解密:
- 私鑰加密,持有公鑰才可以解密
- 公鑰加密,持有私鑰才可解密
簽名:
- 私鑰簽名, 持有公鑰進(jìn)行驗(yàn)證是否被篡改過(guò).
**優(yōu)點(diǎn): ** 非對(duì)稱(chēng)加密與對(duì)稱(chēng)加密相比,其安全性更好;
缺點(diǎn): 非對(duì)稱(chēng)加密的缺點(diǎn)是加密和解密花費(fèi)時(shí)間長(zhǎng)、速度慢,只適合對(duì)少量數(shù)據(jù)進(jìn)行加密。
用途: 一般用于簽名和認(rèn)證。私鑰服務(wù)器保存, 用來(lái)加密, 公鑰客戶(hù)拿著用于對(duì)于令牌或者簽名的解密或者校驗(yàn)使用.
常見(jiàn)的非對(duì)稱(chēng)加密算法有: RSA、DSA(數(shù)字簽名用)、ECC(移動(dòng)設(shè)備用)、RS256 (采用SHA-256 的 RSA 簽名)
參考HTTPS:【JavaEE】HTTPS加密原理-CSDN博客
當(dāng)然,還有另一種加密,就是防止用戶(hù)破解接口并寫(xiě)入惡意腳本,不屬于網(wǎng)絡(luò)傳輸?shù)姆矫媪?/strong>
用戶(hù)通過(guò)代理客戶(hù)端可以查看請(qǐng)求和響應(yīng),業(yè)就可以破解接口并寫(xiě)入惡意腳本
可以考慮以下方法增強(qiáng)接口的安全性:
- 數(shù)據(jù)加密:在客戶(hù)端和服務(wù)器之間進(jìn)行端到端的數(shù)據(jù)加密,即使用戶(hù)使用代理客戶(hù)端也無(wú)法輕易竊取敏感數(shù)據(jù)。
- 使用動(dòng)態(tài)令牌:引入動(dòng)態(tài)令牌機(jī)制,令每次請(qǐng)求的認(rèn)證令牌都是唯一且短暫的,有效期結(jié)束后自動(dòng)失效,降低了被破解的可能性。
- 反爬蟲(chóng)策略:識(shí)別和阻止惡意代理客戶(hù)端,并采取反爬蟲(chóng)策略,如驗(yàn)證碼、人機(jī)驗(yàn)證等,以識(shí)別和攔截惡意請(qǐng)求。
- 安全監(jiān)控和日志記錄:實(shí)時(shí)監(jiān)控接口請(qǐng)求情況,并記錄日志以追蹤異常行為,及時(shí)發(fā)現(xiàn)和應(yīng)對(duì)潛在的安全威脅。
- 多因素認(rèn)證:引入多因素認(rèn)證機(jī)制,如結(jié)合密碼、短信驗(yàn)證碼、指紋等多種因素進(jìn)行用戶(hù)身份驗(yàn)證,提高安全性。
3.4 回答要點(diǎn)
- 使用非對(duì)稱(chēng)加密(或?qū)ΨQ(chēng)加密),給前端一個(gè)公鑰讓他把數(shù)據(jù)加密后傳到后臺(tái),后臺(tái)解密后處理數(shù)據(jù)
- 傳輸?shù)臄?shù)據(jù)很大建議使用對(duì)稱(chēng)加密,不過(guò)不能保存敏感信息
- 傳輸?shù)臄?shù)據(jù)較小,要求安全性高,建議采用非對(duì)稱(chēng)加密
4. 你負(fù)責(zé)項(xiàng)目的時(shí)候遇到了哪些比較棘手的問(wèn)題
這個(gè)面試題主要考察的是,
- 你是否有過(guò)開(kāi)發(fā)經(jīng)驗(yàn)
- 是否是核心開(kāi)發(fā)人員
有4個(gè)方面可以回答,只要挑出一個(gè)回答就行了
4.1 設(shè)計(jì)模式
- 工廠模式+策略
- 責(zé)任鏈模式
回答思路
1,什么背景(技術(shù)問(wèn)題)
2,過(guò)程(解決問(wèn)題的過(guò)程)
3,最終落地方案
舉例:
①:介紹登錄業(yè)務(wù)(一開(kāi)始沒(méi)有用設(shè)計(jì)模式,所有的登錄方式都柔和在一個(gè)業(yè)務(wù)類(lèi)中,不過(guò),發(fā)現(xiàn)需求經(jīng)常改)
②:登錄方式經(jīng)常會(huì)增加或更換,每次都要修改業(yè)務(wù)層代碼,所以,經(jīng)過(guò)我的設(shè)計(jì),使用了工廠設(shè)計(jì)模式和策略模式,解決了,經(jīng)常修改業(yè)務(wù)層代碼的問(wèn)題
③:詳細(xì)介紹一下工廠模式和策略模式(參考前面設(shè)計(jì)模式的課程)
4.2 線上BUG
- CPU飆高
- 內(nèi)存泄漏
- 線程死鎖
- …
回答方式參考上面的回答思路,具體問(wèn)題可以參考前面的課程(JVM和多線程相關(guān)的面試題)
4.3 調(diào)優(yōu)
- 慢接口
- 慢SQL
- 緩存方案
4.4 組件封裝
- 分布式鎖
- 接口冪等
- 分布式事務(wù)
- 支付通用
封裝??成具體適用于本系統(tǒng)的組件,方便去解決一些問(wèn)題;
組件封裝是指將一組相關(guān)功能或代碼片段封裝在一個(gè)獨(dú)立的組件中,以便在項(xiàng)目中重復(fù)使用、提高代碼復(fù)用性和可維護(hù)性的做法。組件可以是包含特定功能的UI元素,也可以是執(zhí)行特定任務(wù)的函數(shù)或類(lèi)。
在軟件開(kāi)發(fā)中,組件封裝有助于將代碼模塊化,降低耦合度,提高整體代碼的可讀性和可維護(hù)性。通過(guò)將通用功能封裝成組件,可以在不同的地方多次使用,避免重復(fù)編寫(xiě)相同的代碼,減少出錯(cuò)的可能性,并且方便對(duì)組件進(jìn)行統(tǒng)一管理和更新。
常見(jiàn)的組件封裝方式包括類(lèi)、函數(shù)、模塊等形式。組件封裝還可以結(jié)合面向?qū)ο缶幊?、設(shè)計(jì)模式等技術(shù),使得代碼更加結(jié)構(gòu)化、靈活和可擴(kuò)展。
冪等性為例子,可以寫(xiě)個(gè)攔截器對(duì)指定的接口進(jìn)行冪等性的保證啊,寫(xiě)一些保證冪等性的接口方法呀:
5. 你們項(xiàng)目中日志怎么采集的
5.1 問(wèn)題
- 為什么要采集日志?
日志是定位系統(tǒng)問(wèn)題的重要手段,可以根據(jù)日志信息快速定位系統(tǒng)中的問(wèn)題
- 采集日志的方式有哪些?
- ELK:即Elasticsearch、Logstash和Kibana三個(gè)軟件的首字母
- 常規(guī)采集:按天保存到一個(gè)日志文件
5.2 ELK基本架構(gòu)
ELK即Elasticsearch、Logstash和Kibana三個(gè)開(kāi)源軟件的縮寫(xiě)
-
Elasticsearch
- Elasticsearch 全文搜索和分析引擎,對(duì)大容量的數(shù)據(jù)進(jìn)行接近實(shí)時(shí)的存儲(chǔ)、搜索和分析操作。
-
Logstash
- Logstash是一個(gè)數(shù)據(jù)收集引擎,它可以動(dòng)態(tài)的從各種數(shù)據(jù)源搜集數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行過(guò)濾、分析和統(tǒng)一格式等操作,并將輸出結(jié)果存儲(chǔ)到指定位置上
-
Kibana
- Kibana是一個(gè)數(shù)據(jù)分析和可視化平臺(tái),通常與Elasticsearch配合使用,用于對(duì)其中的數(shù)據(jù)進(jìn)行搜索、分析,并且以統(tǒng)計(jì)圖標(biāo)的形式展示。
5.3 參考回答
-
我們搭建了ELK日志采集系統(tǒng)
-
介紹ELK的三個(gè)組件:
- Elasticsearch是全文搜索分析引擎,可以對(duì)數(shù)據(jù)存儲(chǔ)、搜索、分析
- Logstash是一個(gè)數(shù)據(jù)收集引擎,可以動(dòng)態(tài)收集數(shù)據(jù),可以對(duì)數(shù)據(jù)進(jìn)行過(guò)濾、分析,將數(shù)據(jù)存儲(chǔ)到指定的位置
- Kibana是一個(gè)數(shù)據(jù)分析和可視化平臺(tái),配合Elasticsearch對(duì)數(shù)據(jù)進(jìn)行搜索,分析,圖表化展示
6. 查看日志的命令
目前采集日志的方式:按天保存到一個(gè)日志文件
也可以在logback配置文件中設(shè)置日志的目錄和名字
需要掌握的Linux中的日志:
- 實(shí)時(shí)監(jiān)控日志的變化
- 實(shí)時(shí)監(jiān)控某一個(gè)日志文件的變化:tail -f xx.log;實(shí)時(shí)監(jiān)控日志最后100行日志: tail –n 100 -f xx.log
-
按照行號(hào)查詢(xún)
-
查詢(xún)?nèi)罩疚膊孔詈?00行日志:tail – n 100 xx.log
-
查詢(xún)?nèi)罩绢^部開(kāi)始100行日志:head –n 100 xx.log
-
查詢(xún)某一個(gè)日志行號(hào)區(qū)間:cat -n xx.log | tail -n +100 | head -n 100 (查詢(xún)100行至200行的日志)
-
-
按照關(guān)鍵字找日志的信息
- 查詢(xún)?nèi)罩疚募邪琩ebug的日志行號(hào):cat -n xx.log | grep “debug”
-
按照日期查詢(xún)
- sed -n '/2023-05-18 14:22:31.070/,/ 2023-05-18 14:27:14.158/p’xx.log
-
日志太多,處理方式
-
分頁(yè)查詢(xún)?nèi)罩拘畔ⅲ篶at -n xx.log |grep “debug” | more
-
篩選過(guò)濾以后,輸出到一個(gè)文件:cat -n xx.log | grep “debug” >debug.txt
-
7. 生產(chǎn)問(wèn)題怎么排查
已經(jīng)上線的 bug 排查的思路:
- 檢查請(qǐng)求和響應(yīng)是否有問(wèn)題;
- 通過(guò)錯(cuò)誤現(xiàn)象初步確定處理方向,用相似的請(qǐng)求去讓 bug 更好的展示出來(lái),以此推理出來(lái)一些東西;
- 分析日志,通常在業(yè)務(wù)中都會(huì)有日志的記錄,如查看系統(tǒng)日/項(xiàng)目日志文件,然后定位問(wèn)題;
- 遠(yuǎn)程 debug,通常公司的正式環(huán)境(生產(chǎn)環(huán)境)是不允許遠(yuǎn)程 debug 的;一般遠(yuǎn)程 debug 都是公司的測(cè)試環(huán)境,方便調(diào)試代碼;
遠(yuǎn)程debug配置
前提條件:遠(yuǎn)程的代碼和本地的代碼要保持一致
- 遠(yuǎn)程代碼需要配置啟動(dòng)參數(shù),把項(xiàng)目打包放到服務(wù)器后啟動(dòng)項(xiàng)目的參數(shù):
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 project-1.0-SNAPSHOT.jar
-agentlib:jdwp 是通知JVM使用(java debug wire protocol)來(lái)運(yùn)行調(diào)試環(huán)境
transport=dt_socket 調(diào)試數(shù)據(jù)的傳送方式
server=y 參數(shù)是指是否支持在server模式
suspend=n 是否在調(diào)試客戶(hù)端建立起來(lái)后,再執(zhí)行JVM。
address=5005 調(diào)試端口設(shè)置為5005,其它端口也可以
- idea 中設(shè)置遠(yuǎn)程 debug ,找到 idea 中的 Edit Configurations…
-
idea中啟動(dòng)遠(yuǎn)程debug
-
訪問(wèn)遠(yuǎn)程服務(wù)器,在本地代碼中打斷點(diǎn)即可調(diào)試遠(yuǎn)程
8. 怎么快速定位系統(tǒng)的瓶頸
-
壓測(cè)(性能測(cè)試),項(xiàng)目上線之前測(cè)評(píng)系統(tǒng)的壓力
- 壓測(cè)目的:給出系統(tǒng)當(dāng)前的性能狀況;定位系統(tǒng)性能瓶頸或潛在性能瓶頸
- 指標(biāo):響應(yīng)時(shí)間、 QPS、并發(fā)數(shù)、吞吐量、 CPU利用率、內(nèi)存使用率、磁盤(pán)IO、錯(cuò)誤率
- 壓測(cè)工具:LoadRunner、Apache Jmeter …
- 后端工程師:根據(jù)壓測(cè)的結(jié)果進(jìn)行解決或調(diào)優(yōu)(接口慢、代碼報(bào)錯(cuò)、并發(fā)達(dá)不到要求…)
-
監(jiān)控工具、鏈路追蹤工具,項(xiàng)目上線之后監(jiān)控
- 監(jiān)控工具:Prometheus+Grafana
- 鏈路追蹤工具:skywalking、Zipkin
-
線上診斷工具Arthas(阿爾薩斯),項(xiàng)目上線之后監(jiān)控、排查
-
官網(wǎng):https://arthas.aliyun.com/
-
核心功能:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-849302.html
-
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-849302.html
到了這里,關(guān)于【企業(yè)場(chǎng)景】常見(jiàn)技術(shù)場(chǎng)景解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!