北京小廠 三三云軟 面經(jīng)
北京小廠 ?三三云軟 ? 面經(jīng):

編輯切換為居中
1.SpringCloud分布式系統(tǒng)中用戶登錄這一塊的設計?(6min)
在Spring Cloud分布式系統(tǒng)中,用戶登錄的設計可以按照以下步驟進行:
用戶提交登錄請求:用戶在前端頁面輸入用戶名和密碼后,點擊登錄按鈕,將登錄請求發(fā)送給后端。
鑒權中心:可以使用OAuth2或者JWT等鑒權機制來進行用戶身份驗證和授權。一種常見的方式是使用單獨的認證服務作為鑒權中心,其他微服務通過調(diào)用認證服務來驗證用戶身份。
認證服務:認證服務負責驗證用戶的用戶名和密碼是否正確,并生成一個令牌(Token)作為用戶的憑證。可以使用Spring Security等框架來實現(xiàn)認證服務。
令牌的生成和管理:令牌可以使用JWT(JSON Web Token)來生成,其中包含了用戶的身份信息和權限等。認證服務在驗證通過后,將生成的令牌返回給用戶。
令牌的校驗和刷新:其他微服務在接收到用戶請求時,需要對令牌進行校驗,確保令牌的有效性和合法性??梢跃帉懸粋€全局過濾器或者攔截器,在請求到達微服務之前對令牌進行校驗。如果令牌過期,可以使用刷新令牌的方式來獲取新的令牌。
用戶信息的存儲和管理:可以使用數(shù)據(jù)庫或者其他緩存技術來存儲用戶的基本信息,如用戶名、密碼、權限等。認證服務在驗證用戶身份時,可以通過查詢數(shù)據(jù)庫或者緩存來獲取用戶信息。
安全性考慮:在用戶登錄設計中,需要注意對用戶密碼的安全存儲,可以使用加密算法對密碼進行加密存儲。同時,為了防止惡意攻擊,可以采用一些安全策略,如登錄失敗次數(shù)限制、驗證碼等。
以上是一個基本的用戶登錄設計思路,具體的實現(xiàn)可以根據(jù)項目需求和技術選型進行調(diào)整和擴展。
2.計網(wǎng)七層模型介紹?(4min)
計算機網(wǎng)絡七層模型,也稱為OSI模型(Open Systems Interconnection),是一種將計算機網(wǎng)絡協(xié)議劃分為不同層次的體系結構。每一層都有特定的功能,各層之間通過接口進行通信和協(xié)作。以下是對每一層的簡要介紹:
物理層(Physical Layer):負責傳輸比特流,即將數(shù)據(jù)從一個節(jié)點物理上傳輸?shù)搅硪粋€節(jié)點。它定義了電氣、物理和功能規(guī)范,如傳輸介質(zhì)、連接器類型、數(shù)據(jù)傳輸率等。
數(shù)據(jù)鏈路層(Data Link Layer):提供可靠的點到點數(shù)據(jù)傳輸,將比特流劃分為幀,實現(xiàn)幀的傳輸和錯誤檢測。該層通常包括物理尋址、數(shù)據(jù)幀同步、流控制和差錯糾正等功能。
網(wǎng)絡層(Network Layer):負責將數(shù)據(jù)分組(或稱為數(shù)據(jù)包)從源節(jié)點傳送到目的節(jié)點。該層主要處理路由選擇、擁塞控制和邏輯尋址等問題,如IP協(xié)議就是在網(wǎng)絡層工作。
傳輸層(Transport Layer):提供端到端的可靠數(shù)據(jù)傳輸服務,主要負責數(shù)據(jù)的分段和重組,以及錯誤檢測和糾正。常見的傳輸層協(xié)議有TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。
會話層(Session Layer):為應用程序之間建立和維護通信會話,處理會話控制和同步問題,如會話的建立、終止和管理。
表示層(Presentation Layer):負責數(shù)據(jù)的格式化和編碼,以確保不同設備之間的數(shù)據(jù)能夠正確解釋和理解。該層還負責數(shù)據(jù)的加密和解密等安全機制。
應用層(Application Layer):提供網(wǎng)絡服務給最終用戶,包括各種應用協(xié)議,如HTTP、FTP、SMTP等。應用層是用戶直接接觸的網(wǎng)絡層次,用于實現(xiàn)特定的網(wǎng)絡應用和功能。
七層模型的設計使得不同層之間的功能和責任得以清晰劃分,以便于不同廠商和組織開發(fā)和實施網(wǎng)絡協(xié)議。同時,它也為網(wǎng)絡故障排查和協(xié)議分析提供了方便和指導。
3.Spring中的常用注解?(5min)
Spring框架中有很多常用的注解,以下是其中一些常見的注解:
@Component: 用于標記一個類為Spring容器的組件,讓Spring進行管理。
@Controller: 用于標記一個類為Spring MVC的控制器,處理用戶請求。
@Service: 用于標記一個類為服務層組件,通常用于定義業(yè)務邏輯。
@Repository: 用于標記一個類為數(shù)據(jù)訪問層組件,通常用于對數(shù)據(jù)庫進行操作。
@Autowired: 用于進行依賴注入,通過類型進行自動裝配。
@Qualifier: 用于指定具體的bean名稱進行裝配,配合@Autowired使用。
@Value: 用于注入屬性值,可以從配置文件中讀取。
@RequestMapping: 用于映射URL和方法的關系,定義請求的路徑和HTTP方法。
@PathVariable: 用于獲取URL路徑中的參數(shù)值。
@RequestParam: 用于獲取請求參數(shù)的值。
@ResponseBody: 用于將方法返回的對象轉(zhuǎn)化為JSON格式返回給客戶端。
@Validated: 用于實現(xiàn)數(shù)據(jù)校驗,配合JSR 303/349規(guī)范的校驗注解使用。
@Transactional: 用于事務管理,在方法或類上添加該注解可以開啟事務。
@Aspect: 用于定義切面,結合其他注解實現(xiàn)面向切面編程。
@Configuration: 用于標記一個類為配置類,替代XML配置文件。
這些注解是Spring框架中被廣泛應用的一部分,通過合理使用這些注解可以簡化開發(fā)工作,提高代碼的可讀性和可維護性。需要根據(jù)具體的需求選擇合適的注解進行使用。
4.緩存擊穿?(2min)
緩存擊穿是指在使用緩存的系統(tǒng)中,當某個緩存的數(shù)據(jù)過期或者被刪除時,恰好有大量的并發(fā)請求訪問該數(shù)據(jù),導致這些請求都繞過緩存,直接訪問數(shù)據(jù)庫或其他存儲介質(zhì),從而導致數(shù)據(jù)庫壓力激增,系統(tǒng)性能下降的一種情況。
通常情況下,緩存是通過設置一定的過期時間來自動刷新的,當數(shù)據(jù)過期時,會觸發(fā)緩存的更新操作,重新從數(shù)據(jù)庫中獲取最新數(shù)據(jù)并更新緩存。然而,如果在緩存更新之前,大量的請求同時到達,就會導致這些請求都無法命中緩存,而直接訪問數(shù)據(jù)庫,從而造成數(shù)據(jù)庫壓力激增,甚至可能導致數(shù)據(jù)庫宕機。
為了避免緩存擊穿問題,可以采取以下幾種策略:
延遲緩存失效時間:在緩存失效之后,不立即更新緩存,而是先設置一個較短的過期時間,然后再異步更新緩存。這樣可以防止大量并發(fā)請求直接訪問數(shù)據(jù)庫。
使用互斥鎖:在緩存失效的情況下,通過互斥鎖來控制只有一個請求能夠訪問數(shù)據(jù)庫,并將更新后的數(shù)據(jù)存入緩存。其他請求在獲取鎖之后,直接從緩存中獲取數(shù)據(jù)。
熱點數(shù)據(jù)預加載:將熱點數(shù)據(jù)在系統(tǒng)啟動時或者低峰期預先加載到緩存中,避免在緩存失效時才去查詢數(shù)據(jù)庫。
增加緩存容量:增加緩存服務器的數(shù)量和容量,以應對更多的請求訪問。
綜上所述,為了避免緩存擊穿問題,需要根據(jù)具體的場景和需求選擇適當?shù)牟呗?,并結合監(jiān)控和調(diào)優(yōu)來維護系統(tǒng)的性能和穩(wěn)定性。
5,Redis 嵌套(面試官讀音是“死肉”)還是啥來著忘記了,尬住了....(下次記得不會說不會)
沒問題,Redis是一個開源的內(nèi)存數(shù)據(jù)庫,是Remote Dictionary Server的縮寫。
Redis是一個高性能的鍵值存儲系統(tǒng),支持豐富的數(shù)據(jù)結構,如字符串、哈希表、列表、集合和有序集合等。它以內(nèi)存作為數(shù)據(jù)存儲介質(zhì),可以快速地讀取和寫入數(shù)據(jù),因此具有非常高的讀寫性能。
除了內(nèi)存存儲,Redis還支持持久化功能,可以將數(shù)據(jù)定期或?qū)崟r保存到磁盤上,以實現(xiàn)數(shù)據(jù)的持久化。這樣即使在Redis重啟時,數(shù)據(jù)也不會丟失。
Redis還提供了一些高級功能,如發(fā)布-訂閱模式、事務支持和分布式鎖等,使其更適用于復雜的應用場景。
在分布式系統(tǒng)中,Redis可以作為緩存、消息隊列和計數(shù)器等使用,可以提高系統(tǒng)的性能和可擴展性。
關于Redis的嵌套,可能是指Redis的數(shù)據(jù)結構之間的嵌套使用,如在哈希表中存儲列表或集合。這樣可以更靈活地組織和管理數(shù)據(jù),以滿足不同的業(yè)務需求。
希望這個回答對你有所幫助,如果還有其他問題,請隨時提問。
6,介紹動態(tài)代理,你會如何實現(xiàn)?(jdk)(2min)
動態(tài)代理是指在運行時動態(tài)生成代理對象的技術,通過代理對象來間接訪問目標對象,實現(xiàn)對目標對象的增強或控制。
在JDK中,動態(tài)代理主要通過java.lang.reflect.Proxy類來實現(xiàn)。以下是一種簡單實現(xiàn)動態(tài)代理的方式:
通過實現(xiàn)InvocationHandler接口創(chuàng)建代理類,該接口中有一個invoke方法,用于在代理對象方法被調(diào)用時進行增強處理。
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicProxy implements InvocationHandler { ? ?private Object target; ? ?public DynamicProxy(Object target) { ? ? ? ?this.target = target; ? ?} ? ?@Override ? ?public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { ? ? ? ?// 前置增強 ? ? ? ?// ... ? ? ? ?Object result = method.invoke(target, args); ? ? ? ?// 后置增強 ? ? ? ?// ... ? ? ? ?return result; ? ?} }
在需要生成代理對象的地方,使用Proxy的newProxyInstance方法來創(chuàng)建代理對象。
public class Main { ? ?public static void main(String[] args) { ? ? ? ?RealObject realObject = new RealObject(); ? ? ? ?DynamicProxy dynamicProxy = new DynamicProxy(realObject); ? ? ? ?// 通過Proxy的newProxyInstance方法創(chuàng)建代理對象 ? ? ? ?Object proxyObject = Proxy.newProxyInstance( ? ? ? ? ? ? ? ?realObject.getClass().getClassLoader(), ? ? ? ? ? ? ? ?realObject.getClass().getInterfaces(), ? ? ? ? ? ? ? ?dynamicProxy); ? ? ? ?// 通過代理對象調(diào)用方法 ? ? ? ?((SomeInterface) proxyObject).someMethod(); ? ?} }
在上述代碼中,當代理對象的方法被調(diào)用時,實際執(zhí)行的是DynamicProxy中的invoke方法,在invoke方法中可以進行前后置增強的操作,如日志記錄、權限驗證等。
需要注意的是,動態(tài)代理只能代理接口,如果要代理具體的類,可以使用第三方庫,如CGLib。
以上是基于JDK實現(xiàn)動態(tài)代理的簡單介紹,實際使用時還需根據(jù)具體業(yè)務需求進行擴展和優(yōu)化。