1. 程式人生 > 實用技巧 >面試題目相關解答

面試題目相關解答

SpringCloud

Spring cloud是一個基於Spring Boot實現的服務治理工具包,在微服務架構中用於管理和協調服務的。

常問元件:

Eureka:負責服務的註冊與實現。各個服務啟動時,Eureka Client都會將服務註冊到Eureka Server,並且Eureka Client還可以反過來從Eureka Server拉取登錄檔,從而知道其他服務在哪裡。

Ribbon:服務間發起請求的時候,基於Ribbon做負載均衡,從一個服務的多臺機器中選擇一臺。

Feign:基於Feign的動態代理機制,根據註解和選擇的機器,拼接請求URL地址,發起請求。

Hystrix:發起請求是通過Hystrix的執行緒池來走的,不同的服務走不同的執行緒池,實現了不同服務呼叫的隔離,避免了服務雪崩的問題。

Zuul:如果前端、移動端要呼叫後端系統,統一從Zuul閘道器進入,由Zuul閘道器轉發請求給對應的服務。

springcloud
優點:

1、服務拆分粒度更細,有利於資源重複利用,有利於提高開發效率

2、可以更精準的制定優化服務方案,提高系統的可維護性

3、微服務架構採用去中心化思想,服務之間採用Restful等輕量級通訊,比ESB更輕量

4、適於網際網路時代,產品迭代週期更短

缺點:

1、微服務過多,治理成本高,不利於維護系統

2、分散式系統開發的成本高(容錯,分散式事務等)對團隊挑戰大

SpringCloud入門

JWT 是什麼? 加密和簽名?對稱加密和非對稱加密的區別?JWT 的優缺點?

JWT:跨域身份驗證解決方案。

  • jwt驗證方式是將使用者資訊通過加密生成token,每次請求服務端只需要使用儲存的金鑰驗證token的正確性,不用再儲存任何session資料了,進而服務端變得無狀態,容易實現拓展。(這個規範允許我們使用JWT在使用者和伺服器之間傳遞安全可靠的資訊。 簡稱JWT,在HTTP通訊過程中,進行身份認證。
  • 一個token分為3部分:
    • 頭部(header):JWT的頭部分是一個JSON物件,描述元資料
    • 載荷(payload):用來存放實際需要傳遞的資料資訊,也是一個JSON物件。
    • 簽名(signature):對前兩部分(頭部,載荷)的簽名,防止資料篡改。
  • JWT 使用
    1、服務端根據使用者登入狀態,將使用者資訊加密到token中,返給客戶端
    2、客戶端收到服務端返回的token,儲存在cookie中
    3、客戶端和服務端每次通訊都帶上token,可以放在http請求頭資訊中,如:Authorization欄位裡面
    4、服務端解密token,驗證內容,完成相應邏輯

加密與簽名

  • token應用:

    • 避免使用者多次輸入密碼

    • 實現自動登陸

    • 避免在終端直接儲存使用者的密碼

    • 標示客戶端的請求是否合法

  • 加密:加密的主要作用就是避免明文傳輸,就算被截獲報文,截獲方也不知道報文的具體內容

    • 在客戶端與伺服器進行互動時,必然涉及到互動的報文(或者通俗的講,請求資料與返回資料),如果不希望報文進行明文傳輸,則需要進行報文的加密與解密
    • 用的比較多的加密演算法主要是對稱加密中的 3DES 加密與非對稱加密中的 RSA
  • 簽名:

    • 在客戶端與伺服器進行互動時,報文雖然加密了,但我們並不能確認這個報文是誰發過來的。例如,與第三方伺服器B進行互動時,我方收到了一個已加密的請求,但我方並不能確認是伺服器B傳送的這個報文,此時我們可以用數字簽名的方式來進行驗證。作用:認證資料來源

    • 如果我方收到一個B伺服器簽名的請求,那麼B伺服器也無法否認這個請求,因為帶有它的簽名,作用:抗否認性

    • 我方收到一個B伺服器簽名的請求,但我方並不能確認這個請求是否被篡改過(雖然報文加了密,也可能被篡改),此時即可用簽名,驗證簽名中的報文與傳過來的報文是否一致。作用:保證了資料的完整性

平時工作中用的最多的簽名演算法是:RSA。

  • 使用加解密為了保證資料的安全性,公鑰加密私鑰解密;私鑰加密公鑰解密。
  • 簽名機制是為了保證資料通訊的可靠性,私鑰簽名公鑰驗籤。

對稱加密和非對稱加密的區別

  • 對稱加密
    對稱加密採用了對稱密碼編碼技術,它的特點是檔案加密和解密使用相同的金鑰加密
    也就是金鑰也可以用作解密金鑰,這種方法在密碼學中叫做對稱加密演算法,對稱加密演算法使用起來簡單快捷,金鑰較短,且破譯困難,除了資料加密標準(DES),另一個對稱金鑰加密系統是國際資料加密演算法(IDEA),它比DES的加密性好,而且對計算機功能要求也沒有那麼高

  • 非對稱加密
    與對稱加密演算法不同,非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰(privatekey)。

    公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法

    非對稱加密演算法實現機密資訊交換的基本過程是:甲方生成一對金鑰並將其中的一把作為公用金鑰向其它方公開;得到該公用金鑰的乙方使用該金鑰對機密資訊進行加密後再發送給甲方;甲方再用自己儲存的另一把專用金鑰對加密後的資訊進行解密。甲方只能用其專用金鑰解密由其公用金鑰加密後的任何資訊。

  • 對稱加密解密的速度比較快,適合資料比較長時的使用。非對稱加密和解密花費的時間長、速度相對較慢,只適合對少量資料的使用。

  • 傳輸的安全性不同

    對稱加密的過程中無法確保金鑰被安全傳遞,密文在傳輸過程中是可能被第三方截獲的,如果密碼本也被第三方截獲,則傳輸的密碼資訊將被第三方破獲,安全性相對較低

    非對稱加密演算法中私鑰是基於不同的演算法生成不同的隨機數,私鑰通過一定的加密演算法推匯出公鑰,但私鑰到公鑰的推導過程是單向的,也就是說公鑰無法反推匯出私鑰。所以安全性較高

JWT 優缺點

好處
那Token相對於Cookie的好處:

  • 支援跨域訪問: Cookie是不允許垮域訪問的,token支援
  • 無狀態: token無狀態,session有狀態的
  • 去耦: 不需要繫結到一個特定的身份驗證方案。Token可以在任何地方生成,只要在 你的API被呼叫的時候, 你可以進行Token生成呼叫即可.
  • 更適用於移動應用: Cookie不支援手機端訪問的
  • 效能: 在網路傳輸的過程中,效能更好
  • 基於標準化: 你的API可以採用標準化的 JSON Web Token (JWT). 這個標準已經存在 多個後端庫(.NET, Ruby, Java,Python, PHP)和多家公司的支援(如: Firebase,Google, Microsoft)

缺陷

  • 佔頻寬
    正常情況下要比 session_id 更大,需要消耗更多流量,擠佔更多頻寬,假如你的網站每月有 10 萬次的瀏覽器,就意味著要多開銷幾十兆的流量。聽起來並不多,但日積月累也是不小一筆開銷。實際上,許多人會在 JWT 中儲存的資訊會更多。

  • 無法在服務端登出,那麼久很難解決劫持問題

  • 效能問題
    JWT 的賣點之一就是加密簽名,由於這個特性,接收方得以驗證 JWT 是否有效且被信任。但是大多數 Web 身份認證應用中,JWT 都會被儲存到 Cookie 中,這就是說你有了兩個層面的簽名。聽著似乎很牛逼,但是沒有任何優勢,為此,你需要花費兩倍的 CPU 開銷來驗證簽名。對於有著嚴格效能要求的 Web 應用,這並不理想,尤其對於單執行緒環境。

JWT概述
JWT
簽名與加密
對稱與非對稱加密
對稱與非對稱加密2
JWT 優缺點

synchronized 鎖升級

在這裡插入圖片描述

https://blog.csdn.net/tongdanping/article/details/79647337

CAS存在的問題

CAS 操作包含三個運算元 —— 記憶體位置(V)、預期原值(A)和新值(B)。

ABA問題
因為CAS需要在操作值的時候檢查下值有沒有發生變化,如果沒有發生變化則更新,但是如果一個值原來是A,變成了B,又變成了A,那麼使用CAS進行檢查時會發現它的值沒有發生變化,但是實際上卻變化了。ABA問題的解決思路就是使用版本號。
在變數前面追加上版本號,每次變數更新的時候把版本號加一,那麼A-B-A 就會變成1A-2B-3A

CAS

分散式:session 存在的問題?

相關文章

Redis 事務和 MySQL 事務的區別?

在這裡插入圖片描述

Redis

  • Redis事務沒有隔離級別的概念
  • Redis不保證原子性:
  • Redis事務的三個階段:
    1.開始事務
    2.命令入隊
    3.執行事務
    參考文章1
    參考文章2

Redis 實現分散式鎖?

參考文章

TCP 協議?協議中的狀態(TIME_WAIT 等)?TIME_WAIT 為什麼要 2MSL 時間?

主動關閉一方最後的狀態是 TIME_WAIT。

第一,為了保證A傳送的最後一個ACK報文能夠到達B。這個ACK報文段有可能丟失,因而使處在LAST-ACK狀態的B收不到對已傳送的FIN+ACK報文段的確認。B會超時重傳這個FIN+ACK報文段,而A就能在2MSL時間內收到這個重傳的FIN+ACK報文段。如果A在TIME-WAIT狀態不等待一段時間,而是在傳送完ACK報文段後就立即釋放連線,就無法收到B重傳的FIN+ACK報文段,因而也不會再發送一次確認報文段。這樣,B就無法按照正常的步驟進入CLOSED狀態。

第二,A在傳送完ACK報文段後,再經過2MSL時間,就可以使本連線持續的時間所產生的所有報文段都從網路中消失。這樣就可以使下一個新的連線中不會出現這種舊的連線請求的報文段。

https://blog.csdn.net/qq_28098067/article/details/80811938
https://blog.csdn.net/q1007729991/article/details/69686781
https://blog.csdn.net/yrx420909/article/details/104483591/
https://blog.csdn.net/weixin_43728446/article/details/100121446

Mac地址和IP地址的區別?

一、bai地址性質不du同

MAC地址是實體地址,IP地址是邏輯地zhi址。MAC地址是不可改變dao的,IP地址是可以更改的。

二、可變性

MAC地址具有唯一性,每個硬體出廠時候的MAC地址是固定的;IP地址不具備唯一性,因此,很多應用軟體是圍繞MAC地址開發的。

三、工作層次不同

二層基於MAC地址轉發資料幀,三層基於IP地址轉發報文。二層交換機基於MAC地址錶轉發資料,路由器基於路由表(IP地址)轉發資料。

四、長度定義

MAC地址是Ethernet網絡卡上帶的地址,長度為48位,IP地址目前主流是32位長。IP地址和MAC地址通過ARP協議聯絡到一起。

五、分配依據不同

IP地址的分配是基於網路拓撲,MAC地址的分配是基於製造商。

相關文章

OSI七層模型和TCP四層模型,各層之間資料包如何傳送?

在這裡插入圖片描述

參考文章

閘道器的作用是什麼?

  • 易於監控,可以在閘道器收集監控資料並將其推送到外部系統進行分析;
  • 易於認證,可以在閘道器進行認證,然後再將請求轉發到後端的微服務,而無需在每個微服務中進行認證;
  • 減少客戶端和各個微服務之間的互動次數。

參考文章

Mysql索引失效的情況?

  • 1、like 以%開頭,索引無效;當like字首沒有%,字尾有%時,索引有效。
  • 2、or語句前後沒有同時使用索引。當or左右查詢欄位只有一個是索引,該索引失效,只有當or左右查詢欄位均為索引時,才會生效。
  • 3、組合索引,不是使用第一列索引,索引失效。
  • 4、資料型別出現隱式轉化。如varchar不加單引號的話可能會自動轉換為int型,使索引無效,產生全表掃描。
  • 5、在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以這樣的操作不能使用索引,可以用其他的辦法處理,例如:數字型別,判斷大於0,字串型別設定一個預設值,判斷是否等於預設值即可。(此處是錯誤的!)
  • 6、在索引欄位上使用not,<>,!=。不等於操作符是永遠不會用到索引的,因此對它的處理只會產生全表掃描。 優化方法: key<>0 改為 key>0 or key<0。
  • 7、對索引欄位進行計算操作、欄位上使用函式。(索引為 emp(ename,empno,sal))
  • 8、當全表掃描速度比索引速度快時,mysql會使用全表掃描,此時索引失效。

程式碼演示參考

Spring模組

在這裡插入圖片描述

核心容器(Spring Core)

核心容器提供Spring框架的基本功能。Spring以bean的方式組織和管理Java應用中的各個元件及其關係。Spring使用BeanFactory來產生和管理Bean,它是工廠模式的實現。BeanFactory使用控制反轉(IoC)模式將應用的配置和依賴性規範與實際的應用程式程式碼分開。

應用上下文(Spring Context)

Spring上下文是一個配置檔案,向Spring框架提供上下文資訊。Spring上下文包括企業服務,如JNDI、EJB、電子郵件、國際化、校驗和排程功能。

面向切面程式設計(Spring AOP)

AOP(Aspect Oriented Programming)

通過配置管理特性,Spring AOP 模組直接將面向方面的程式設計功能整合到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何物件支援 AOP。Spring AOP 模組為基於 Spring 的應用程式中的物件提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 元件,就可以將宣告性事務管理整合到應用程式中。

JDBC和DAO模組(Spring DAO)

JDBC、DAO的抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理,和不同資料庫供應商所丟擲的錯誤資訊。異常層次結構簡化了錯誤處理,並且極大的降低了需要編寫的程式碼數量,比如開啟和關閉連結。

物件實體對映(Spring ORM)

ORM(Object Relational Mapping)

Spring框架插入了若干個ORM框架,從而提供了ORM物件的關係工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,所有這些都遵從Spring的通用事物和DAO異常層次結構。

Web模組(Spring Web)

Web上下文模組建立在應用程式上下文模組之上,為基於web的應用程式提供了上下文。所以Spring框架支援與Struts整合,web模組還簡化了處理多部分請求以及將請求引數繫結到域物件的工作。

MVC模組(Spring Web MVC)

MVC(Model View Controller)

MVC框架是一個全功能的構建Web應用程式的MVC實現。通過策略介面,MVC框架變成為高度可配置的。MVC容納了大量檢視技術,其中包括JSP、POI等,模型來有JavaBean來構成,存放於m當中,而檢視是一個街口,負責實現模型,控制器表示邏輯程式碼,由c的事情。Spring框架的功能可以用在任何J2EE伺服器當中,大多數功能也適用於不受管理的環境。Spring的核心要點就是支援不繫結到特定J2EE服務的可重用業務和資料的訪問的物件,毫無疑問這樣的物件可以在不同的J2EE環境,獨立應用程式和測試環境之間重用。