很多人都說現在是云原生、大模型的時代,微服務已經過時了,但現實的是,很多人開發多年,都沒有在實際的開發中用過微服務,更別提搭建微服務框架和技術選型了。
面試的時候都會問,怎么辦?
今天分享一張微服務的丐版架構圖,讓你可以和面試官掰扯掰扯~
腦中有圖,口若懸河,一套組合拳下來,面試官只能拍案叫好,大呼快哉,HR更是驚呼,我勒個乖乖,完全聽不懂。
話不多說,直接上圖。
由此可見,Spring Cloud微服務架構是由多個組件一起組成的,各個組件的交互流程如下。
- 瀏覽器通過查詢DNS服務器,獲取可用的服務實例的網絡位置信息,從而實現服務的自動發現和動態更新。
- 通過CDN獲取靜態資源,提高訪問速度,解決跨地域請求速度慢的問題。
- 通過LVS負載均衡器,實現負載均衡和網絡協議。
- 通過Nginx反向代理服務器,將請求轉發到gateway做路由轉發和安全驗證。
- 訪問注冊中心和配置中心Nacos,獲取后端服務和配置項。
- 通過Sentinel進行限流。
- 通過redis進行緩存服務、會話管理、分布式鎖控制。
- 通過Elasticsearch進行全文搜索,存儲日志,配合Kibana,對ES中的數據進行實時的可視化分析。
一、域名系統DNS
在微服務中,域名系統DNS的作用主要是進行服務發現和負載均衡。
- 每個微服務實例在啟動時,將自己的IP地址和端口號等信息注冊到DNS服務器,瀏覽器通過查詢DNS服務器,獲取可用的服務實例的網絡位置信息,從而實現服務的自動發現和動態更新。
- DNS服務器可以根據一定的策略,比如輪詢、隨機等,將請求分發到不同的負載均衡器LVS上,提高系統的并發處理能力和容錯性。
二、LVS(linux Virtual Server),Linux虛擬服務器
LVS是一個開源的負載均衡軟件,基于Linux操作系統實現。它在Linux內核中實現負載均衡的功能,通過運行在用戶空間的用戶進程實現負載均衡的策略。
- LVS支持多種負載均衡算法,例如輪詢、隨機、加權輪詢、加權隨機等。
- LVS支持多種網絡協議,例如TCP、HTTP、HTTPS,可以滿足不同應用的需求。
- LVS具有高可用和可擴展性。它支持主從備份和冗余配置,當主服務器出現故障時,備份服務器可以自動接管負載,確保服務的連續性。此外,LVS還支持動態添加和刪除服務器節點,方便管理員進行擴容和縮容的操作。
三、CDN靜態資源
CDN靜態資源圖片、視頻、JAVAScript文件、css文件、靜態html文件等。這些靜態資源的特點是讀請求量極大,對訪問速度的要求很高,并占據了很高的寬帶。如果處理不當,可能導致訪問速度慢,寬帶被占滿,進而影響動態請求的處理。
CDN的作用是將這些靜態資源分發到多個地理位置的機房的服務器上。讓用戶就近選擇訪問,提高訪問速度,解決跨地域請求速度慢的問題。
四、Nginx反向代理服務器
1、Nginx的主要作用體現在以下幾個方面:
- 反向代理,Nginx可以作為反向代理服務器,接收來自客戶端的請求,然后將請求轉發到后端的微服務實例。
- 負載均衡,Nginx可以根據配置,將請求分發到微服務不同的實例上,實現負載均衡。
- 服務路由,Nginx可以根據不同的路徑規則,將請求路由到不同的微服務上。
- 靜態資源服務,Nginx可以提供靜態資源服務,如圖片、視頻、JavaScript文件、CSS文件、HTML靜態文件等,減輕后端服務的壓力,提高系統的響應速度和性能。
2、Nginx靜態資源服務和CDN靜態資源服務,如何選擇?
在選擇Nginx靜態資源服務和CDN靜態資源服務時,可以根據以下幾個因素進行權衡和選擇:
- 性能和速度:CDN靜態資源服務通常具有更廣泛的分布式節點和緩存機制,可以更快地響應用戶的請求,并減少傳輸距離和網絡擁塞。如果靜態資源的加載速度和性能是首要考慮因素,CDN可能是更好的選擇。
- 控制和自定義能力:Nginx靜態資源服務提供更高的靈活性和控制能力,可以根據具體需求進行定制和配置。如果需要更精細的控制和自定義能力,或者在特定的網絡環境下進行部署,Nginx可能更適合。
- 成本和預算:CDN靜態資源服務通常需要支付額外的費用,而Nginx靜態資源服務可以自行搭建和部署,成本相對較低。在考慮選擇時,需要綜合考慮成本和預算的因素。
- 內容分發和全球覆蓋:如果靜態資源需要分發到全球各地的用戶,CDN靜態資源服務的分布式節點可以更好地滿足這個需求,提供更廣泛的內容分發和全球覆蓋。
選擇Nginx靜態資源服務還是CDN靜態資源服務取決于具體的需求和場景。如果追求更好的性能和全球覆蓋,可以選擇CDN靜態資源服務;如果更需要控制和自定義能力,且對性能要求不是特別高,可以選擇Nginx靜態資源服務。
五、Gateway網關
在微服務架構中,Gateway的作用如下:
- 統一入口:Gateway作為整個微服務架構的統一入口,所有的請求都會經過Gateway,這樣做可以隱藏內部微服務的細節,降低后臺服務受攻擊的概率。
- 路由和轉發:Gateway根據請求的路徑、參數等信息,將請求路由到相應的微服務實例。這樣可以讓服務解耦,讓各個微服務可以獨立的開發、測試、部署。
- 安全和認證:Gateway通常集成了身份驗證和權限驗證的功能,確保只有經過驗證的請求才能訪問微服務。Gateway還具備防爬蟲、限流、熔斷的功能。
- 協議轉換:由于微服務架構中可以使用不同的技術和協議,Gateway可以作為協議轉換中心,實現不同協議之間的轉換和兼容性。
- 日志和監控,Gateway可以記錄所有的請求和響應日志,為后續的故障排查、性能分析、安全審計提供數據支持。Gateway還集成了監控和報警功能:實時反饋系統的運行狀態。
- 服務聚合:在某些場景中,Gateway可以將來自多個微服務的數據進行聚合,然后一次性返回給客戶端,減少客戶端和微服務之間的交互次數,提高系統性能。
六、注冊中心Nacos
在微服務架構中,Nacos的作用主要體現在注冊中心、配置中心、服務健康檢查等方面。
- 注冊中心:Nacos支持基于DNS和RPC的服務發現,微服務可以將接口服務注冊到Nacos中,客戶端通過nacos查找和調用這些服務實例。
- 配置中心:Nacos提供了動態配置服務,可以動態的修改配置中心中的配置項,不需要重啟后臺服務,即可完成配置的修改和發布,提高了系統的靈活性和可維護性。
- 服務健康檢查:Nacos提供了一系列的服務治理功能,比如服務健康檢查、負載均衡、容錯處理等。服務健康檢查可以阻止向不健康的主機或服務實例發送請求,保證了服務的穩定性和可靠性。負載均衡可以根據一定的策略,將請求分發到不同的服務實例中,提高系統的并發處理能力和性能。
七、Redis緩存
1、在微服務架構中,Redis的作用主要體現在以下幾個方面:
- 緩存服務:Redis可以作為高速緩存服務器,將常用的數據存儲在內存中,提高數據訪問速度和響應時間,減輕數據庫的訪問壓力,并加速后臺數據的查詢。
- 會話管理:Redis可以存儲會話信息,并實現分布式會話管理。這使會話信息可以在多個服務之間共享和訪問,提供一致的用戶體驗。
- 分布式鎖:Redis提供了分布式鎖機制,可以確保微服務中多個節點對共享資源的訪問的合理性和有序性,避免競態條件和資源沖突。
- 消息隊列:Redis支持發布訂閱模式和消息隊列模式,可以作為消息中間件使用。微服務之間可以通過Redis實現異步通信,實現解耦和高可用性。
2、競態條件
競態條件是指在同一個程序的多線程訪問同一個資源的情況下,如果對資源的訪問順序敏感,就存在競態條件。競態條件可能會導致執行結果出現各種問題,例如計算機死機、出現非法操作提示并結束程序、錯誤的讀取舊的數據或錯誤的寫入新數據。在串行的內存和存儲訪問能防止這種情況,當讀寫命令同時發生的時候,默認是先執行讀操作的。
競態條件也可能在網絡中出現,當兩個用戶同時試圖訪問同一個可用信道的時候就會發生,系統同意訪問之前沒有計算機能得到信道被占用的提示。統計上說這種情況通常是發生在有相當長的延遲時間的網絡里,比如使用地球同步衛星。
為了防止這種競態條件發生,需要制定優先級列表,比如用戶的用戶名在字母表里排列靠前可以得到相對較高的優先級。黑客可以利用競態條件這一弱點來贏得非法訪問網絡的權利。
競態條件是由于多個線程或多個進程同時訪問共享資源而引發的問題,它可能會導致不可預測的結果和不一致的狀態。解決競態條件的方法包括使用鎖、同步機制、優先級列表等。
3、Redis會話管理如何實現?
Redis會話管理的一般實現步驟:
- 會話創建:當用戶首次訪問應用時,可以在Redis中創建一個新的會話,會話可以是一個具有唯一標識符的數據結構,例如哈希表或字符串。
- 會話信息存儲:將會話信息關聯到會話ID存儲到Redis中,會話信息可以包括用戶身份、登錄狀態、權限等。
- 會話過期時間設置:為會話設置過期時間,以確保會話在一定時間后自動失效。Redis提供了設置鍵值對過期時間的機制,可以通過EXPIRE命令為會話設置過期時間。
- 會話訪問和更新:在每次用戶訪問應用時,通過會話ID獲取相應的會話信息,并對其進行驗證和更新。如果會話已過期,可以要求用戶重新登錄。
- 會話銷毀:當用戶主動退出或會話到期后,需要銷毀會話,通過刪除Redis中存儲的會話信息即可。
八、Elasticsearch全文搜索引擎
在微服務架構中,Elasticsearch全文搜索引擎的應用主要體現在如下幾個方面:
- 全文搜索引擎:ES是一個分布式的全文搜索引擎,它可以對海量的數據進行實時的全文搜索,返回與關鍵詞相關的結果;
- 分布式存儲:ES提供了分布式的實時文件存儲功能,每個字段都可以被索引并可被搜索,這使得數據在ES中的存儲和查詢都非常高效。
- 數據分析:配合Kibana,對ES中的數據進行實時的可視化分析,為數據決策提供數據支持。
- 日志和監控:ES可以作為日志和監控數據的存儲和分析平臺。通過收集系統的日志信息,存入ES,可以實現實時的日志查詢、分析、告警、展示。
- 擴展性:ES具有很好的擴展性,可以水平擴展到數百臺服務器,處理PB級別的數據,使得ES能夠應對海量數據的挑戰。
九、感覺Redis和Elasticsearch很像?微服務中Redis和Elasticsearch的區別
- 數據存儲和查詢方式:Redis是一種基于鍵值對的存儲系統,它提供高性能的讀寫操作,適用于存儲結構簡單、查詢條件同樣簡單的應用場景。而Elasticsearch是一個分布式搜索和分析引擎,適用于全文搜索、數據分析等復雜場景,能夠處理更復雜的查詢需求。
- 數據結構與處理能力:Redis支持豐富的數據結構,如字符串、哈希、列表、集合等,并提供了原子性的操作,適用于實現緩存、消息隊列、計數器等功能。而Elasticsearch則是基于倒排索引的數據結構,提供了強大的搜索和分析能力。但相對于Redis,Elasticsearch的寫入效率較低。
- 實時性和一致性:Redis提供了很高的實時性,Redis將數據存儲到內存中,能夠很快的進行讀寫操作;而Elasticsearch是一個近實時的搜索平臺,實時性不如Redis。
- 擴展性:Redis是通過增加Redis實例的形式實現擴展,對非常大的數據集可能要進行數據分片;而Elasticsearch具有水平擴展的能力,可以通過添加更多的節點來提高系統的處理能力,適用于大量數據的場景。