前言
職場上的風(fēng)云涌動(dòng),求職者的連連碰壁,面試官的一崗難尋,求職者也是一職難求。本來面試方與求職者即為互惠互利的兩者,但是為什么會(huì)出現(xiàn)這種情況呢?
確實(shí)!現(xiàn)在很不難看出,一些崗位的稀缺性和不可替代性,在招聘啟事上比比皆是。
當(dāng)然啦,程序員肯定也是算在此列人員中的,其實(shí)我們在對比中也不難看出,程序員的薪資水平是遠(yuǎn)遠(yuǎn)大于同時(shí)期其它工種水平的,也正因?yàn)樗奶厥庑?,?dǎo)致近年來進(jìn)入該行業(yè)的人員絡(luò)繹不絕。
而大批量的人員涌入帶來的就是如今行業(yè)的待價(jià)而沽,同一崗位的要求越來越高,薪資水平卻仍還在原地徘徊! 但大量勞動(dòng)力的涌入,卻還是讓這種情況愈演愈烈,面對同是求職者的競爭,大批量的求職者在這個(gè)行業(yè)碰壁,出現(xiàn)了失業(yè)、找工作難、就業(yè)壓力大、工作強(qiáng)度高等等......
當(dāng)然,有爭議就會(huì)有非議
相信大家也不難看出,網(wǎng)絡(luò)上的輿論對于程序員是有多么的不友好,“脫發(fā)”“早衰”“老實(shí)人”“程序狗”...一大堆可能有些不太好聽的的稱號(hào)接踵而至。 雖然確實(shí)不好聽,但卻句句扎心了!
不過人嘛! 只有正視不好的,才能微笑面對人生。
節(jié)選自———《阿博的人生格言》
哈哈,給大家開個(gè)玩笑。活躍下氣氛,不然老說這么嚴(yán)肅的東西,會(huì)影響大家閱讀體驗(yàn)感的!
不過也說了這么多,就會(huì)有人問了:阿博阿博! 你說的面試經(jīng)驗(yàn)到底是什么啊,趕快給我們大家講講啊,就別賣關(guān)子了。
行! 那咱就別整這么多虛的了,直接給你們整點(diǎn)實(shí)在的~
還是那句老話:佛咯密~
簡歷篇
排版注意事項(xiàng):
這個(gè)是比較重要的,尤其是現(xiàn)在的面試簡歷基本都是網(wǎng)投,面試官往往一天就要看上幾十甚至上百份簡歷,當(dāng)千篇一律的簡歷之中突然閃出一份,格式清晰,分段優(yōu)美,簡潔卻又不失美觀的簡歷時(shí),勢必會(huì)停下多看兩眼,你的面試幾率也會(huì)大大提高哦!
所以,阿博給大家總結(jié)了如下幾點(diǎn):
**1. **盡量簡潔,不要太花里胡哨;
**2. **一些技術(shù)名詞不要弄錯(cuò)了大小寫比如MySQL不要寫成mysql,Java不要寫成java。這個(gè)在我看來還
是比較忌諱的,所以一定要注意這個(gè)細(xì)節(jié);
**3. **中文和數(shù)字英文之間加上空格的話看起來會(huì)舒服一點(diǎn);
4. 盡量避免主觀表述,少一點(diǎn)語義模糊的形容詞,盡量要簡潔明了,邏輯結(jié)構(gòu)清晰。
5. 如果自己有博客或者個(gè)人技術(shù)棧點(diǎn)的話,寫上去會(huì)為你加分很多。
6. 如果自己的Github比較活躍的話,寫上去也會(huì)為你加分很多。
7. 注意簡歷真實(shí)性,一定不要寫自己不會(huì)的東西,或者帶有欺騙性的內(nèi)容
**8. **項(xiàng)目經(jīng)歷建議以時(shí)間倒序排序,另外項(xiàng)目經(jīng)歷不在于多,而在于有亮點(diǎn)。
**9. **如果內(nèi)容過多的話,不需要非把內(nèi)容壓縮到一頁,保持排版干凈整潔就可以了。
**10. **簡歷最后最好能加上:“感謝您花時(shí)間閱讀我的簡歷,期待能有機(jī)會(huì)和您共事?!边@句話,顯得你會(huì)
很有禮貌
如何正確記錄項(xiàng)目,該如何正確書寫:
相信大家只要去面試,簡歷上有一兩個(gè)項(xiàng)目經(jīng)歷都是再正常不過的,但如何才能真正的把項(xiàng)目經(jīng)歷正確的呈現(xiàn)給面試官又是另外一件事了。
對于項(xiàng)目經(jīng)歷的描寫,大家可以看看我之前那篇文章,《為什么90%的程序員都能贏在簡歷上!》
(以下內(nèi)容也節(jié)選自該文章部分):
1. 對項(xiàng)目整體設(shè)計(jì)的一個(gè)感受
2. 在這個(gè)項(xiàng)目中你負(fù)責(zé)了什么、做了什么、擔(dān)任了什么角色
3. 從這個(gè)項(xiàng)目中你學(xué)會(huì)了那些東西,使用到了那些技術(shù),學(xué)會(huì)了那些新技術(shù)的使用
4. 另外項(xiàng)目描述中,最好可以體現(xiàn)自己的綜合素質(zhì),比如你是如何協(xié)調(diào)項(xiàng)目組成員協(xié)同開發(fā)的或者在
遇到某一個(gè)棘手的問題的時(shí)候你是如何解決的又或者說你在這個(gè)項(xiàng)目用了什么技術(shù)實(shí)現(xiàn)了什么功能
比如:用redis做緩存提高訪問速度和并發(fā)量、使用消息隊(duì)列削峰和降流等等。
專業(yè)技能又該怎么寫呢?
1:首先先問一下你自己會(huì)什么,然后看看你意向的公司需要什么。一般HR可能并不太懂技術(shù),所以他在篩選
2、簡歷的時(shí)候可能就盯著你專業(yè)技能的關(guān)鍵詞來看。對于公司有要求而你不會(huì)的技能,你可以花幾天時(shí)間準(zhǔn)備一下。
3、在簡歷上可以寫上自己了解這個(gè)技能。比如你可以這樣寫(下面這部分內(nèi)容摘自我的簡
歷,大家可以根據(jù)自己的情況做一些修改和完善):
計(jì)算機(jī)網(wǎng)絡(luò)、數(shù)據(jù)結(jié)構(gòu)、算法、操作系統(tǒng)等課內(nèi)基礎(chǔ)知識(shí):掌握
Java 基礎(chǔ)知識(shí):掌握
JVM 虛擬機(jī)(Java內(nèi)存區(qū)域、虛擬機(jī)垃圾算法、虛擬垃圾收集器、JVM內(nèi)存管理):掌握
高并發(fā)、高可用、高性能系統(tǒng)開發(fā):掌握
Struts2、Spring、Hibernate、Ajax、Mybatis、JQuery :掌握
SSH 整合、SSM 整合、 SOA 架構(gòu):掌握
Dubbo: 掌握
Zookeeper: 掌握
常見消息隊(duì)列: 掌握
Linux:掌握
MySQL常見優(yōu)化手段:掌握
Spring Boot +Spring Cloud +Docker:了解
Hadoop 生態(tài)相關(guān)技術(shù)中的 HDFS、Storm、MapReduce、Hive、Hbase :了解
Python 基礎(chǔ)、一些常見第三方庫比如OpenCV、wxpy、wordcloud、matplotlib:熟悉
簡明扼要的兩個(gè)點(diǎn),如果你都能滿足! 那很好,騷年,你已經(jīng)邁出了第一步,坐等收面試通知吧。
不過簡歷投放切忌好高騖遠(yuǎn),還是以實(shí)事求是為主,有多大能力干多大活,量力而行哦!
面經(jīng)實(shí)戰(zhàn)篇
說到面經(jīng)實(shí)戰(zhàn)篇,那就有的嗶嗶了,從Java基礎(chǔ)到kafka、分布式、spring、MyBatis、ZooKeeper、微服務(wù),都能說到明年去,就是我想說,估計(jì)大家也不想看到我的手打字打到殘廢吧!
開個(gè)玩笑,既然說是面經(jīng)實(shí)戰(zhàn)篇,怎么闊能沒有實(shí)戰(zhàn)呢?
接下來的內(nèi)容就是阿博搜集了今年整個(gè)上半年各一線熱門大廠的面試真題集! 不過由于篇幅有限,只能給大家先列舉出部分,后續(xù)如有需要獲取完整面經(jīng)資料可關(guān)注@阿博的Java棧后臺(tái)私信:面經(jīng)PDF 即可! 再說一遍,需要獲取的后臺(tái)私信:**面經(jīng)PDF **即可!
那么,開整?。。。ㄒ韵聝?nèi)容僅例舉部分)
Java反射篇
1、除了使用new創(chuàng)建對象之外,還可以用什么方法創(chuàng)建對象?
使用Java反射可以創(chuàng)建對象!
2、Java反射創(chuàng)建對象效率高還是通過new創(chuàng)建對象的效率高?
通過new創(chuàng)建對象的效率比較高。通過反射時(shí),先找查找類資源,使用類加載器創(chuàng)建,過程比較繁瑣,所以效率較低
3、java反射的作用
反射機(jī)制是在運(yùn)行時(shí),對于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對于任意個(gè)對象,都能夠調(diào)用它的任意一個(gè)方法。在java
中,只要給定類的名字,就可以通過反射機(jī)制來獲得類的所有信息。
這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對象的方法的功能稱為Java語言的反射機(jī)制。
4、哪里會(huì)用到反射機(jī)制?
jdbc就是典型的反射
這就是反射。如hibernate,struts等框架使用反射實(shí)現(xiàn)的。
5、反射的實(shí)現(xiàn)方式:
第一步:獲取Class對象,有4中方法:
1)Class.forName(“類的路徑”);
2)類名.class
3)對象名.getClass()
4)基本類型的包裝類,可以調(diào)用包裝類的Type屬性來獲得該包裝類的Class對象
Java序列化篇
1、什么是java序列化,如何實(shí)現(xiàn)java序列化?
序列化就是一種用來處理對象流的機(jī)制,所謂對象流也就是將對象的內(nèi)容進(jìn)行流化??梢詫α骰蟮膶ο筮M(jìn)行讀寫操作,也可將流化后的對
象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對對象流進(jìn)行讀寫操作時(shí)所引發(fā)的問題。序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable接
口,該接口沒有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對象是可被序列化的,然后使用一個(gè)輸出流(如:
FileOutputStream)來構(gòu)造一個(gè)ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法
就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。
2、保存(持久化)對象及其狀態(tài)到內(nèi)存或者磁盤
Java 平臺(tái)允許我們在內(nèi)存中創(chuàng)建可復(fù)用的 Java 對象,但一般情況下,只有當(dāng) JVM 處于運(yùn)行時(shí),這些對象才可能存在,即,這些對象的生命
周期不會(huì)比 JVM 的生命周期更長。 但在現(xiàn)實(shí)應(yīng)用中,就可能要求在JVM停止運(yùn)行之后能夠保存(持久化)指定的對象,并在將來重新讀取被保
存的對象。Java 對象序列化就能夠幫助我們實(shí)現(xiàn)該功能。
3、序列化對象以字節(jié)數(shù)組保持-靜態(tài)成員不保存
使用 Java 對象序列化, 在保存對象時(shí),會(huì)把其狀態(tài)保存為一組字節(jié),在未來, 再將這些字節(jié)組裝成對象。必須注意的是, 對象序列化保存
的是對象的”狀態(tài)”,即它的成員變量。由此可知,對象序列化不會(huì)關(guān)注類中的靜態(tài)變量。
4、序列化用戶遠(yuǎn)程對象傳輸
除了在持久化對象時(shí)會(huì)用到對象序列化之外,當(dāng)使用 RMI(遠(yuǎn)程方法調(diào)用),或在網(wǎng)絡(luò)中傳遞對象時(shí),都會(huì)用到對象序列化。 Java序列化API
為處理對象序列化提供了一個(gè)標(biāo)準(zhǔn)機(jī)制,該API簡單易用。
5、Serializable 實(shí)現(xiàn)序列化
在 Java 中, 只要一個(gè)類實(shí)現(xiàn)了 java.io.Serializable 接口,那么它就可以被序列化。ObjectOutputStream 和 ObjectInputStream 對對象進(jìn)
行序列化及反序列化通過 ObjectOutputStream 和 ObjectInputStream 對對象進(jìn)行序列化及反序列化。
JVM篇
1、java中會(huì)存在內(nèi)存泄漏嗎,請簡單描述。
會(huì)。自己實(shí)現(xiàn)堆載的數(shù)據(jù)結(jié)構(gòu)時(shí)有可能會(huì)出現(xiàn)內(nèi)存泄露,可參看effffective java.
2、64 位 JVM 中,int 的長度是多數(shù)?
Java 中,int 類型變量的長度是一個(gè)固定值,與平臺(tái)無關(guān),都是 32 位。意思就是說,在 32 位 和 64 位 的 Java 虛擬機(jī)中,int 類型的長度是
相同的。
3、Serial 與 Parallel GC 之間的不同之處?
Serial 與 Parallel 在 GC 執(zhí)行的時(shí)候都會(huì)引起 stop-the-world。它們之間主要不同 serial 收集器是默認(rèn)的復(fù)制收集器,執(zhí)行 GC 的時(shí)候只有
一個(gè)線程,而parallel 收集器使用多個(gè) GC 線程來執(zhí)行。
4、32 位和 64 位的 JVM,int 類型變量的長度是多數(shù)?
32 位和 64 位的 JVM 中,int 類型變量的長度是相同的,都是 32 位或者 4個(gè)字節(jié)。
5、Java 中 WeakReference 與 SoftReference 的區(qū)別?
雖然 WeakReference 與 SoftReference 都有利于提高 GC 和 內(nèi)存的效率,但是 WeakReference ,一旦失去最后一個(gè)強(qiáng)引用,就會(huì)被 GC
回收,而軟引用雖然不能阻止被回收,但是可以延遲到 JVM 內(nèi)存不足的時(shí)候。
Memcached篇
1、Memcached 是什么,有什么作用?
Memcached 是一個(gè)開源的,高性能的內(nèi)存綬存軟件,從名稱上看 Mem 就是內(nèi)存的意思,而 Cache 就是緩存的意思。Memcached 的作
用:通過在事先規(guī)劃好的內(nèi)存空間中臨時(shí)綬存數(shù)據(jù)庫中的各類數(shù)據(jù),以達(dá)到減少業(yè)務(wù)對數(shù)據(jù)庫的直接高并發(fā)訪問,從而達(dá)到提升數(shù)據(jù)庫的訪
問性能,加速網(wǎng)站集群動(dòng)態(tài)應(yīng)用服務(wù)的能力。 2、memcached 服務(wù)在企業(yè)集群架構(gòu)中有哪些應(yīng)用場景?
一、作為數(shù)據(jù)庫的前端緩存應(yīng)用
a、完整緩存(易),靜態(tài)緩存
例如:商品分類(京東),以及商品信息,可事先放在內(nèi)存里,然后再對外提供數(shù)據(jù)訪問,這種先放到內(nèi)存,我們稱之為預(yù)熱,(先把數(shù)據(jù)
存緩存中),用戶訪問時(shí)可以只讀取 memcached 緩存,不讀取數(shù)據(jù)庫了。
b、執(zhí)點(diǎn)緩存(難)
需要前端 web 程序配合,只緩存熱點(diǎn)的數(shù)據(jù),即緩存經(jīng)常被訪問的數(shù)據(jù)。先預(yù)熱數(shù)據(jù)庫里的基礎(chǔ)數(shù)據(jù),然后在動(dòng)態(tài)更新,選讀取緩存,如
果緩存里沒有對應(yīng)的數(shù)據(jù),程序再去讀取數(shù)據(jù)庫,然后程序把讀取的新數(shù)據(jù)放入緩存存儲(chǔ)。
特殊說明 :
如果碰到電商秒殺等高并發(fā)的業(yè)務(wù),一定要事先預(yù)熱,或者其它思想實(shí)現(xiàn),例如:秒殺只是獲取資格,而不是瞬間秒殺到手商品。
那么什么是獲取資格?
就是在數(shù)據(jù)庫中,把 0 標(biāo)成 1.就有資格啦。再慢慢的去領(lǐng)取商品訂單。因?yàn)槊霘⑦^程太長會(huì)占用服務(wù)器資源。
如果數(shù)據(jù)更新,同時(shí)觸發(fā)緩存更新,防止給用戶過期數(shù)據(jù)。
對于持久化緩存存儲(chǔ)系統(tǒng),例如:redis,可以替代一部分?jǐn)?shù)據(jù)庫的存儲(chǔ),一些簡單的數(shù)據(jù)業(yè)務(wù),投票,統(tǒng)計(jì),好友關(guān)注,商品分類等。
nosql= not onlysql
二、作業(yè)集群的 session 會(huì)話共享存儲(chǔ)。
Memcached 服務(wù)在不同企業(yè)業(yè)務(wù)應(yīng)用場景中的工作流程
當(dāng) web 程序需要訪問后端數(shù)據(jù)庫獲取數(shù)據(jù)時(shí)會(huì)優(yōu)先訪問 Memcached 內(nèi)存緩存,如果緩存中有數(shù)據(jù)就直接獲取返回前端服務(wù)及用戶,如
果沒有數(shù)據(jù)(沒有命中),在由程序請求后端的數(shù)據(jù)庫服務(wù)器,獲取到對應(yīng)的數(shù)據(jù)后,除了返回給前端服務(wù)及用戶數(shù)據(jù)外,還會(huì)把數(shù)據(jù)放到
Memcached 內(nèi)存中進(jìn)行緩存,等待下次請求被訪問,Memcache 內(nèi)存始終是數(shù)據(jù)庫的擋箭牌,從而大大的減輕數(shù)據(jù)庫的訪問壓力,提高
整個(gè)網(wǎng)站架構(gòu)的響應(yīng)速度,提升了用戶體驗(yàn)。
當(dāng)程序更新,修改或刪除數(shù)據(jù)庫中已有的數(shù)據(jù)時(shí),會(huì)同時(shí)發(fā)送請求通知Memcached 已經(jīng)緩存的同一個(gè) ID 內(nèi)容的舊數(shù)據(jù)失效,從而保證
Memcache中數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)一致。
如果在高并發(fā)場合,除了通知 Memcached 過程的緩存失效外,還會(huì)通過相關(guān)機(jī)制,使得在用戶訪問新數(shù)據(jù)前,通過程序預(yù)先把更新過的
數(shù)據(jù)推送到memcache 中緩存起來,這樣可以減少數(shù)據(jù)庫的訪問壓力,提升 Memcached中緩存命中率。
數(shù)據(jù)庫插件可以在寫入更新數(shù)據(jù)庫后,自動(dòng)拋給 MC 緩存起來,自身不Cache.
2、Memcached 服務(wù)分布式集群如何實(shí)現(xiàn)?
特殊說明:Memcached 集群和 web 服務(wù)集群是不一樣的,所有 Memcached 的數(shù)據(jù)總和才是數(shù)據(jù)庫的數(shù)據(jù)。每臺(tái) Memcached 都是部分
數(shù)據(jù)。(一臺(tái) memcached 的數(shù)據(jù),就是一部分 mysql 數(shù)據(jù)庫的數(shù)據(jù))
a、程序端實(shí)現(xiàn)
程序加載所有 mc 的 ip 列表,通過對 key 做 hash (一致性哈希算法)
例如:web1 (key)===>對應(yīng) A,B,C,D,E,F,G…..若干臺(tái)服務(wù)器。(通過哈希算法實(shí)現(xiàn))
b、負(fù)載均衡器
通過對 key 做 hash (一致性哈希算法)一致哈希算法的目的是不但保證每個(gè)對象只請求一個(gè)對應(yīng)的服務(wù)器,而且當(dāng)節(jié)點(diǎn)宕機(jī),緩存服務(wù)器的
更新重新分配比例降到最低。
3、Memcached 服務(wù)特點(diǎn)及工作原理是什么?
a、完全基于內(nèi)存緩存的
b、節(jié)點(diǎn)之間相互獨(dú)立
c、C/S 模式架構(gòu),C 語言編寫,總共 2000 行代碼。
d、異步I/O 模型,使用 libevent 作為事件通知機(jī)制。
e、被緩存的數(shù)據(jù)以 key/value 鍵值對形式存在的。
f、全部數(shù)據(jù)存放于內(nèi)存中,無持久性存儲(chǔ)的設(shè)計(jì),重啟服務(wù)器,內(nèi)存里的數(shù)據(jù)會(huì)丟失。
g、當(dāng)內(nèi)存中緩存的數(shù)據(jù)容量達(dá)到啟動(dòng)時(shí)設(shè)定的內(nèi)存值時(shí),就自動(dòng)使用 LRU 算法刪除過期的緩存數(shù)據(jù)。
h、可以對存儲(chǔ)的數(shù)據(jù)設(shè)置過期時(shí)間,這樣過期后的數(shù)據(jù)自動(dòng)被清除,服務(wù)本身不會(huì)監(jiān)控過期,而是在訪問的時(shí)候查看 key 的時(shí)間戳,判斷是
否過期。
j、memcache 會(huì)對設(shè)定的內(nèi)存進(jìn)行分塊,再把塊分組,然后再提供服務(wù)
Spring Boot篇
1、什么是 Spring Boot?
多年 來, 隨著 新功 能的 增加 ,spring 變得 越來 越復(fù) 雜。 只需 訪問https://spring.io/projects 頁面 ,我們 就會(huì) 看到 可以 在我 們的 應(yīng)
用 程序 中使 用的所有 Spring 項(xiàng)目 的不 同功 能。 如果 必須 啟動(dòng) 一個(gè) 新的 Spring 項(xiàng)目 ,我 們必 須添加構(gòu) 建路 徑或 添加 Maven 依賴
關(guān)系 ,配 置應(yīng) 用程 序服 務(wù)器 ,添 加 spring 配置 。因此 ,開始 一個(gè) 新的 spring 項(xiàng)目 需要 很多 努力 ,因?yàn)?我們 現(xiàn)在 必須 從頭 開始
做所有事 情。
Spring Boot 是解 決這 個(gè)問 題的 方法 。Spring Boot 已經(jīng) 建立 在現(xiàn) 有 spring 框架之上 。使用 spring 啟動(dòng) ,我們 避免 了之 前我 們必 須
做 的所 有樣 板代 碼和 配置 。因此, Spring Boot 可以 幫助 我們 以最 少的 工作 量, 更加 健壯 地使 用現(xiàn) 有的 Spring功能
2、為什么要用SpringBoot
Spring Boot 優(yōu)點(diǎn)非常多,如:
一、獨(dú)立運(yùn)行
Spring Boot而且內(nèi)嵌了各種servlet容器,Tomcat、Jetty等,現(xiàn)在不再需要打成war包部署到容器中,Spring Boot只要打成一個(gè)可執(zhí)行的
jar包就能獨(dú)立運(yùn)行,所有的依賴包都在一個(gè)jar包內(nèi)。
二、簡化配置
spring-boot-starter-web啟動(dòng)器自動(dòng)依賴其他組件,減少了maven的配置。三、自動(dòng)配置
Spring Boot能根據(jù)當(dāng)前類路徑下的類、jar包來自動(dòng)配置bean,如添加一個(gè)spring-boot-starter-web啟動(dòng)器就能擁有web的功能,無需其他
配置。
四、無代碼生成和XML配置
Spring Boot配置過程中無代碼生成,也無需XML配置文件就能完成所有配置工作,這一切都是借助于條件注解完成的,這也是Spring4.x的
核心功能之一。
五、應(yīng)用監(jiān)控
Spring Boot提供一系列端點(diǎn)可以監(jiān)控服務(wù)及應(yīng)用,做健康檢測
3、Spring Boot 有哪些優(yōu)點(diǎn)?
Spring Boot 的優(yōu)點(diǎn)有:
1、減少開發(fā),測試時(shí)間和努力。
2、使用 JavaConfifig 有助于避免使用 XML。
3、避免大量的 Maven 導(dǎo)入和各種版本沖突。
4、提供意見發(fā)展方法。
5、通過提供默認(rèn)值快速開始開發(fā)。
6、沒有單獨(dú)的 Web 服務(wù)器需要。這意味著你不再需要啟動(dòng) Tomcat,Glassfifish或其他任何東西。
7、需要更少的配置 因?yàn)闆]有 web.xml 文件。只需添加用@ Confifiguration 注釋的類,然后添加用@Bean 注釋的方法,Spring 將自動(dòng)加載
對象并像以前一樣對其進(jìn)行管理。您甚至可以將@Autowired 添加到 bean 方法中,以使 Spring 自動(dòng)裝入需要的依賴關(guān)系中。
8、基于環(huán)境的配置 使用這些屬性,您可以將您正在使用的環(huán)境傳遞到應(yīng)用程序:-Dspring.profifiles.active = {enviornment}。在加載主應(yīng)
用程序?qū)傩晕募?,Spring 將在(application{environment} .properties)中加載后續(xù)的應(yīng)用程序?qū)傩晕募?/p>
4、Spring Boot 的核心注解是哪個(gè)?它主要由哪幾個(gè)注解組成的?
啟動(dòng)類上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要組合包含了以下
3 個(gè)注解:
@SpringBootConfifiguration:組合了 @Confifiguration 注解,實(shí)現(xiàn)配置文件的功能。
@EnableAutoConfifiguration:打開自動(dòng)配置的功能,也可以關(guān)閉某個(gè)自動(dòng)配置的選項(xiàng),如關(guān)閉數(shù)據(jù)源自動(dòng)配置功能:
@SpringBootApplication(exclude = { DataSourceAutoConfifiguration.class })。
@ComponentScan:Spring組件掃描
RabbitMQ篇
1、什么是 rabbitmq
采用 AMQP 高級消息隊(duì)列協(xié)議的一種消息隊(duì)列技術(shù),最大的特點(diǎn)就是消費(fèi)并不需要確保提供方存在,實(shí)現(xiàn)了服務(wù)之間的高度解耦
2、為什么要使用 rabbitmq
1、在分布式系統(tǒng)下具備異步,削峰,負(fù)載均衡等一系列高級功能;
2、擁有持久化的機(jī)制,進(jìn)程消息,隊(duì)列中的信息也可以保存下來。
3、實(shí)現(xiàn)消費(fèi)者和生產(chǎn)者之間的解耦。
4、對于高并發(fā)場景下,利用消息隊(duì)列可以使得同步訪問變?yōu)榇性L問達(dá)到一定量的限流,利于數(shù)據(jù)庫的操作。5.可以使用消息隊(duì)列達(dá)到異步下單的效果,排隊(duì)中,后臺(tái)進(jìn)行邏輯下單。
3、使用 rabbitmq 的場景
1、服務(wù)間異步通信
2、順序消費(fèi)
3、定時(shí)任務(wù)
4、請求削峰
4、如何確保消息正確地發(fā)送至 RabbitMQ? 如何確保消息接收方消費(fèi)了消息?
發(fā)送方確認(rèn)模式
將信道設(shè)置成 confifirm 模式(發(fā)送方確認(rèn)模式),則所有在信道上發(fā)布的消息都會(huì)被指派一個(gè)唯一的 ID。
一旦消息被投遞到目的隊(duì)列后,或者消息被寫入磁盤后(可持久化的消息),信道會(huì)發(fā)送一個(gè)確認(rèn)給生產(chǎn)者(包含消息唯一 ID)。
如果 RabbitMQ 發(fā)生內(nèi)部錯(cuò)誤從而導(dǎo)致消息丟失,會(huì)發(fā)送一條 nack(notacknowledged,未確認(rèn))消息。發(fā)送方確認(rèn)模式是異步的,生產(chǎn)
者應(yīng)用程序在等待確認(rèn)的同時(shí),可以繼續(xù)發(fā)送消息。當(dāng)確認(rèn)消息到達(dá)生產(chǎn)者應(yīng)用程序,生產(chǎn)者應(yīng)用程序的回調(diào)方法就會(huì)被觸發(fā)來處理確認(rèn)消
息。
接收方確認(rèn)機(jī)制
接收方消息確認(rèn)機(jī)制
消費(fèi)者接收每一條消息后都必須進(jìn)行確認(rèn)(消息接收和消息確認(rèn)是兩個(gè)不同操作)。只有消費(fèi)者確認(rèn)了消息,RabbitMQ 才能安全地把消息
從隊(duì)列中刪除。這里并沒有用到超時(shí)機(jī)制,RabbitMQ 僅通過 Consumer 的連接中斷來確認(rèn)是否需要重新發(fā)送消息。也就是說,只要連接
不中斷,RabbitMQ 給了 Consumer 足夠長的時(shí)間來處理消息。保證數(shù)據(jù)的最終一致性;
下面羅列幾種特殊情況
如果消費(fèi)者接收到消息,在確認(rèn)之前斷開了連接或取消訂閱,RabbitMQ 會(huì)認(rèn)為消息沒有被分發(fā),然后重新分發(fā)給下一個(gè)訂閱的消費(fèi)者。
(可能存在消息重復(fù)消費(fèi)的隱患,需要去重)如果消費(fèi)者接收到消息卻沒有確認(rèn)消息,連接也未斷開,則 RabbitMQ 認(rèn)為該消費(fèi)者繁忙,將
不會(huì)給該消費(fèi)者分發(fā)更多的消息。
ZooKeeper篇
1、什么是Zookeeper?
ZooKeeper 是一個(gè)開放源碼的分布式協(xié)調(diào)服務(wù),它是集群的管理者,監(jiān)視著集群中各個(gè)節(jié)點(diǎn)的狀態(tài)根據(jù)節(jié)點(diǎn)提交的反饋進(jìn)行下一步合理操作。最終,將簡單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。分布式應(yīng)用程序可以基于 Zookeeper 實(shí)現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱、負(fù)載均衡、命名服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊(duì)列等功能。
2、Zookeeper 如何保證了分布式一致性特性?
1、順序一致性
2、原子性
3、單一視圖
4、可靠性
5、實(shí)時(shí)性(最終一致性)
客戶端的讀請求可以被集群中的任意一臺(tái)機(jī)器處理,如果讀請求在節(jié)點(diǎn)上注冊了監(jiān)聽器,這個(gè)監(jiān)聽器也是由所連接的 zookeeper 機(jī)器來處理。對于寫請求,這些請求會(huì)同時(shí)發(fā)給
其他 zookeeper 機(jī)器并且達(dá)成一致后,請求才會(huì)返回成功。因此,隨著 zookeeper 的集群機(jī)器增多,讀請求的吞吐會(huì)提高但是寫請求的吞吐會(huì)下降。有序性是 zookeeper 中非
常重要的一個(gè)特性,所有的更新都是全局有序的,每個(gè)更新都有一個(gè)唯一的時(shí)間戳,這個(gè)時(shí)間戳稱為 zxid(Zookeeper Transaction Id)。而讀請求只會(huì)相對于更新有序,也就
是讀請求的返回結(jié)果中會(huì)帶有這個(gè)
zookeeper 最新的 zxid
3、ZooKeeper 提供了什么?
1、文件系統(tǒng)
2、通知機(jī)制
4、Zookeeper 文件系統(tǒng)
Zookeeper 提供一個(gè)多層級的節(jié)點(diǎn)命名空間(節(jié)點(diǎn)稱為 znode)。與文件系統(tǒng)不同的是,這些節(jié)點(diǎn)都可以設(shè)置關(guān)聯(lián)的數(shù)據(jù),而文件系統(tǒng)中只有文件節(jié)點(diǎn)可以存放數(shù)據(jù)而目錄節(jié)點(diǎn)
不行。
Zookeeper 為了保證高吞吐和低延遲,在內(nèi)存中維護(hù)了這個(gè)樹狀的目錄結(jié)構(gòu),這種特性使得 Zookeeper 不能用于存放大量的數(shù)據(jù),每個(gè)節(jié)點(diǎn)的存放數(shù)據(jù)上限為1M。
5、ZAB 協(xié)議?ZAB 協(xié)議包括兩種基本的模式:崩潰恢復(fù)和消息廣播 。
當(dāng)整個(gè) zookeeper 集群剛剛啟動(dòng)或者 Leader 服務(wù)器宕機(jī)、重啟或者網(wǎng)絡(luò)故障導(dǎo)致不存在過半的服務(wù)器與 Leader 服務(wù)器保持正常通信時(shí),所有進(jìn)程(服務(wù)器)進(jìn)入崩潰恢復(fù)模
式,首先選舉產(chǎn)生新的 Leader 服務(wù)器,然后集群中 Follower 服務(wù)器開始與新的 Leader 服務(wù)器進(jìn)行數(shù)據(jù)同步,當(dāng)集群中超過半數(shù)機(jī)器與該 Leader服務(wù)器完成數(shù)據(jù)同步之后,退
出恢復(fù)模式進(jìn)入消息廣播模式,Leader 服務(wù)器開始接收客戶端的事務(wù)請求生成事物提案來進(jìn)行事務(wù)請求處理
微服務(wù)篇
微服務(wù),又稱微服務(wù) 架構(gòu),是一種架構(gòu)風(fēng)格,它將應(yīng)用程序構(gòu)建為以業(yè)務(wù)領(lǐng)域?yàn)槟P偷男⌒妥灾畏?wù)集合 。
通俗地說,你必須看到蜜蜂如何通過對齊六角形蠟細(xì)胞來構(gòu)建它們的蜂窩狀物。他們最初從使用各種材料的小部分開始,并繼續(xù)從中構(gòu)建一個(gè)大型蜂箱。這些細(xì)胞形成圖案,產(chǎn)
生堅(jiān)固的結(jié)構(gòu),將蜂窩的特定部分固定在一起。這里,每個(gè)細(xì)胞獨(dú)立于另一個(gè)細(xì)胞,但它也與其他細(xì)胞相關(guān)。這意味著對一個(gè)細(xì)胞的損害不會(huì)損害其他細(xì)胞,因此,蜜蜂可以在不影響完整蜂箱的情況下重建這些細(xì)胞。
圖 1:微服務(wù)的蜂窩表示 – 微服務(wù)訪談問題
請參考上圖。這里,每個(gè)六邊形形狀代表單獨(dú)的服務(wù)組件。與蜜蜂的工作類似,每個(gè)敏捷團(tuán)隊(duì)都使用可用的框架和所選的技術(shù)堆棧構(gòu)建單獨(dú)的服務(wù)組件。就像在蜂箱中一樣,每
個(gè)服務(wù)組件形成一個(gè)強(qiáng)大的微服務(wù)架構(gòu),以提供更好的可擴(kuò)展性。此外,敏捷團(tuán)隊(duì)可以單獨(dú)處理每個(gè)服務(wù)組件的問題,而對整個(gè)應(yīng)用程序沒有影響或影響最小。
2、微服務(wù)架構(gòu)有哪些優(yōu)勢?
圖 2:微服務(wù)的 優(yōu)點(diǎn) – 微服務(wù)訪談問題
- 獨(dú)立開發(fā) – 所有微服務(wù)都可以根據(jù)各自的功能輕松開發(fā)
- 獨(dú)立部署 – 基于其服務(wù),可以在任何應(yīng)用程序中單獨(dú)部署它們
- 故障隔離 – 即使應(yīng)用程序的一項(xiàng)服務(wù)不起作用,系統(tǒng)仍可繼續(xù)運(yùn)行
- 混合技術(shù)堆棧 – 可以使用不同的語言和技術(shù)來構(gòu)建同一應(yīng)用程序的不同服務(wù)
- 粒度縮放 – 單個(gè)組件可根據(jù)需要進(jìn)行縮放,無需將所有組件縮放在一起
圖 3:微服務(wù)的 特點(diǎn) – 微服務(wù)訪談問題
- 解耦 – 系統(tǒng)內(nèi)的服務(wù)很大程度上是分離的。因此,整個(gè)應(yīng)用程序可以輕松構(gòu)建,更改和擴(kuò)展
- 組件化 – 微服務(wù)被視為可以輕松更換和升級的獨(dú)立組件
- 業(yè)務(wù)能力 – 微服務(wù)非常簡單,專注于單一功能
- 自治 – 開發(fā)人員和團(tuán)隊(duì)可以彼此獨(dú)立工作,從而提高速度
- 持續(xù)交付 – 通過軟件創(chuàng)建,測試和批準(zhǔn)的系統(tǒng)自動(dòng)化,允許頻繁發(fā)布軟件
- 責(zé)任 – 微服務(wù)不關(guān)注應(yīng)用程序作為項(xiàng)目。相反,他們將應(yīng)用程序視為他們負(fù)責(zé)的產(chǎn)品
- 分散治理 – 重點(diǎn)是使用正確的工具來做正確的工作。這意味著沒有標(biāo)準(zhǔn)化模式或任何技術(shù)模式。開發(fā)人員可以自由選擇最有用的工具來解決他們的問題
- 敏捷 – 微服務(wù)支持敏捷開發(fā)。任何新功能都可以快速開發(fā)并再次丟棄
以上就是本次面經(jīng)的概括內(nèi)容了,大家還有什么疑問的話歡迎在底部評論區(qū)留言,最后,還是重復(fù)一下這句老話:世上無難事,只怕有心人,相信自己,面試神馬的,真的很簡單,阿博已經(jīng)把畢生結(jié)晶都總結(jié)在里面了??! 能悟多少就看你自己了。
什么,看完你就忘了,很好,看來你已經(jīng)融會(huì)貫通了......
好了,最后真的不多嗶嗶了,還是老規(guī)矩,給大家總結(jié)到這里就結(jié)束了,需要本文真題PDF資料的朋友們。記得轉(zhuǎn)發(fā)+關(guān)注后私信:面經(jīng)PDF 即可, 記得是轉(zhuǎn)發(fā)+關(guān)注+私信才能獲取的哦!