二面css
你有什麼問題想問個人嗎?html
一、自我介紹、工做經歷、技術棧前端
二、項目中你學到了什麼技術?java
三、微服務劃分的粒度?程序員
四、微服務的高可用怎麼保證的?web
負載均衡與反向代理,隔離,限流,降級,超時與重試,回滾,壓力測試與應急預案面試
五、經常使用的負載均衡,該怎麼用,你能說下嗎?算法
(1)http重定向sql
當http代理(好比瀏覽器)向web服務器請求某個URL後,web服務器能夠經過http響應頭信息中的Location標記來返回一個新的URL。這意味着HTTP代理須要繼續請求這個新的URL,完成自動跳轉。數據庫
(2)DNS負載均衡
DNS 負責提供域名解析服務,當訪問某個站點時,實際上首先須要經過該站點域名的DNS服務器來獲取域名指向的IP地址,在這一過程當中,DNS服務器完成了域名到IP地址的映射,一樣,這樣映射也能夠是一對多的,這時候,DNS服務器便充當了負載均衡調度器,它就像http重定向轉換策略同樣,將用戶的請求分散到多臺服務器上,可是它的實現機制徹底不一樣。
(3)IP負載均衡(LVS-NAT)
由於反向代理服務器工做在HTTP層,其自己的開銷就已經嚴重製約了可擴展性,從而也限制了它的性能極限。那可否在HTTP層面如下實現負載均衡呢?
NAT服務器:它工做在傳輸層,它能夠修改發送來的IP數據包,將數據包的目標地址修改成實際服務器地址
(4)直接路由(LVS-DR)
NAT是工做在網絡分層模型的傳輸層(第四層),而直接路由是工做在數據鏈路層(第二層),貌似更屌些。它經過修改數據包的目標MAC地址(沒有修改目標IP),將數據包轉發到實際服務器上,不一樣的是,實際服務器的響應數據包將直接發送給客戶羰,而不通過調度器
(5)IP隧道(LVS-TUN)
基於IP隧道的請求轉發機制:將調度器收到的IP數據包封裝在一個新的IP數據包中,轉交給實際服務器,而後實際服務器的響應數據包能夠直接到達用戶端。目前Linux大多支持,能夠用LVS來實現,稱爲LVS-TUN,與LVS-DR不一樣的是,實際服務器能夠和調度器不在同一個WANt網段,調度器經過 IP隧道技術來轉發請求到實際服務器,因此實際服務器也必須擁有合法的IP地址。
整體來講,LVS-DR和LVS-TUN都適合響應和請求不對稱的Web服務器,如何從它們中作出選擇,取決於你的網絡部署須要,由於LVS-TUN能夠將實際服務器根據須要部署在不一樣的地域,而且根據就近訪問的原則來轉移請求,因此有相似這種需求的,就應該選擇LVS-TUN。
六、網關可以爲後端服務帶來哪些好處?
後端服務器能夠專心處理業務請求,節省了大量鏈接管理的開銷
七、對象比較是否相同
equals一般用來比較兩個對象的內容是否相等,==用來比較兩個對象的地址是否相等
八、hashmap put 方法存放的時候怎麼判斷是不是重複的
先比較key的hashCode,再比較相等或equals的,因此重寫hashCode()和equals()方法便可實現添加劇復元素。
九、Set 和 List 區別?
Set(集):集合中的對象不按特定方式排序,而且沒有重複對象。它的有些實現類能對集合中的對象按特定方式排序。
List(列表):集合中的對象按索引位置排序,能夠有重複對象,容許按照對象在集合中的索引位置檢索對象。
十、ArrayList 和 LinkedList 區別
ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構
ArrayList 繼承AbstractList
LinkedList 繼承AbstractSequentialList
ArrayList 採用的是數組形式來保存對象的,這種方式將對象放在連續的位置中,因此最大的缺點就是插入刪除時很是麻煩
LinkedList 採用的將對象存放在獨立的空間中,並且在每一個空間中還保存下一個連接的索引 可是缺點就是查找很是麻煩 要叢第一個索引開始
十一、若是存取相同的數據,ArrayList 和 LinkedList 誰佔用空間更大?
對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針
對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據,若要從數組中刪除或插入某一個對象,須要移動後段的數組元素,從而會從新調整索引順序,調整索引順序會消耗必定的時間,相反,LinkedList是使用鏈表實現的,若要從鏈表中刪除或插入某一個對象,只須要改變先後對象的引用便可
十二、HashTable 你瞭解過嗎?
Hashtable既不支持Null key也不支持Null value。Hashtable的put()方法的註釋中有說明Hashtable是線程安全的,
Hashtable是線程安全的,它的每一個方法中都加入了Synchronize方法,效率比較低
Hashtable默認的初始大小爲11,以後每次擴充,容量變爲原來的2n+1。
Hashtable在計算元素的位置時須要進行一次除法運算,而除法運算是比較耗時的。
1三、synchronized、lock
synchronized是java中的一個關鍵字,也就是說是Java語言內置的特性
若是一個代碼塊被synchronized修飾了,當一個線程獲取了對應的鎖,並執行該代碼塊時,其餘線程便只能一直等待,等待獲取鎖的線程釋放鎖,而這裏獲取鎖的線程釋放鎖只會有兩種狀況:
1)獲取鎖的線程執行完了該代碼塊,而後線程釋放對鎖的佔有;
2)線程執行發生異常,此時JVM會讓線程自動釋放鎖
那麼若是這個獲取鎖的線程因爲要等待IO或者其餘緣由(好比調用sleep方法)被阻塞了,可是又沒有釋放鎖,其餘線程便只能乾巴巴地等待,試想一下,這多麼影響程序執行效率。
所以就須要有一種機制能夠不讓等待的線程一直無期限地等待下去(好比只等待必定的時間或者可以響應中斷),經過Lock就能夠辦到。
再舉個例子:當有多個線程讀寫文件時,讀操做和寫操做會發生衝突現象,寫操做和寫操做會發生衝突現象,可是讀操做和讀操做不會發生衝突現象。
可是採用synchronized關鍵字來實現同步的話,就會致使一個問題:
若是多個線程都只是進行讀操做,因此當一個線程在進行讀操做時,其餘線程只能等待沒法進行讀操做。
所以就須要一種機制來使得多個線程都只是進行讀操做時,線程之間不會發生衝突,經過Lock就能夠辦到。
另外,經過Lock能夠知道線程有沒有成功獲取到鎖。這個是synchronized沒法辦到的
1四、cas 操做
java.util.concurrent包中藉助CAS實現了區別於synchronized同步鎖的一種樂觀鎖
cas是比較並交換算法
CAS有3個操做數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改成B,不然什麼都不作
JDK提供了AtomicReference類來保證引用對象之間的原子性,就能夠把多個變量放在一個對象裏來進行CAS操做。
1五、lock 和 synchronized 的區別?
(1)Lock是一個接口,而synchronized是Java中的關鍵字,synchronized是內置的語言實現;
(2)synchronized在發生異常時,會自動釋放線程佔有的鎖,所以不會致使死鎖現象發生;而Lock在發生異常時,若是沒有主動經過unLock()去釋放鎖,則極可能形成死鎖現象,所以使用Lock時須要在finally塊中釋放鎖;
(3)Lock可讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不可以響應中斷;
(4)經過Lock能夠知道有沒有成功獲取鎖,而synchronized卻沒法辦到。
(5)Lock能夠提升多個線程進行讀操做的效率。
在性能上來講,若是競爭資源不激烈,二者的性能是差很少的,而當競爭資源很是激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優於synchronized。因此說,在具體使用時要根據適當狀況選擇。
1六、公平鎖和非公平鎖
公平和非公平鎖的隊列都基於鎖內部維護的一個雙向鏈表,表結點Node的值就是每個請求當前鎖的線程。公平鎖則在於每次都是依次從隊首取值
非公平鎖在等待鎖的過程當中, 若是有任意新的線程妄圖獲取鎖,都是有很大的概率直接獲取到鎖的
(在ReentrantLock中很明顯能夠看到其中同步包括兩種,分別是公平的FairSync和非公平的NonfairSync。公平鎖的做用就是嚴格按照線程啓動的順序來執行的,不容許其餘線程插隊執行的;而非公平鎖是容許插隊的。
默認狀況下ReentrantLock是經過非公平鎖來進行同步的,包括synchronized關鍵字都是如此,由於這樣性能會更好。由於從線程進入了RUNNABLE狀態,能夠執行開始,到實際線程執行是要比較久的時間的。並且,在一個鎖釋放以後,其餘的線程會須要從新來獲取鎖。其中經歷了持有鎖的線程釋放鎖,其餘線程從掛起恢復到RUNNABLE狀態,其餘線程請求鎖,得到鎖,線程執行,這一系列步驟。若是這個時候,存在一個線程直接請求鎖,可能就避開掛起到恢復RUNNABLE狀態的這段消耗,因此性能更優化)
1七、讀寫鎖設計主要解決什麼問題?
多線程,
讀操做能夠共享,寫操做是排他的,讀能夠有多個在讀,寫只有惟一個在寫,同時寫的時候不容許讀
解決了讀和讀能夠同時進行,讀和寫不能同時進行,寫和寫不能同時進行
1八、MySQL 分頁查詢語句
LIMIT [offset,] rows
offset指定要返回的第一行的偏移量,rows第二個指定返回行的最大數目
1九、MySQL 事務特性和隔離級別
事務的基本要素(ACID)
(1)原子性(Atomicity):事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執行過程當中出錯,會回滾到事務開始前的狀態,全部的操做就像沒有發生同樣。也就是說事務是一個不可分割的總體,就像化學中學過的原子,是物質構成的基本單位。
(2)一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。好比A向B轉帳,不可能A扣了錢,B卻沒收到。
(3)隔離性(Isolation):同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。
(4)持久性(Durability):事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾。
20、事務的併發問題
(1)髒讀:事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據
(2)不可重複讀:事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。
(3)幻讀:系統管理員A將數據庫中全部學生的成績從具體分數改成ABCDE等級,可是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺同樣,這就叫幻讀。
2一、sql having 的使用場景
若是須要對組函數的結果做爲條件,那麼不能使用where子句,必須使用having子句
2二、前端瀏覽器地址的一個 http 請求到後端整個流程是怎麼樣?
可以說下嗎?
域名解析 --> 發起TCP的3次握手 --> 創建TCP鏈接後發起http請求 -->服務器響應http請求,瀏覽器獲得html代碼 -->瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶
2三、http 默認端口,https 默認端口
HTTP協議代理服務器經常使用端口號:80/8080/3128/8081/9080
HTTPS服務器,默認的端口號爲443/tcp 443/udp
2四、DNS 你知道是幹嗎的嗎?
DNS是指:域名服務器(Domain Name Server)。在Internet上域名與IP地址之間是一一對應的,域名雖然便於人們記憶,但機器之間只能互相認識IP地址,它們之間的轉換工做稱爲域名解析,域名解析須要由專門的域名解析服務器來完成,DNS就是進行域名解析的服務器
完整面試題文檔獲取、最新精選錄播、Java資料、學習導圖免費提供給年後想要跳槽或想升職加薪的程序員,加微信13272413561備註資料便可免費獲取哦
獲取方式:
https://shimo.im/docs/TC9Jq63Tp6HvTXdg/