SpringCloud元件詳解(對於基礎的一些面試也是有用的)
這篇部落格也是因為一個朋友參加面試,回來後說今天面試官上來就問了微服務,為了鞏固自己,也為了方便一下廣大技術愛好者,我這裡根據面試官向他提問的問題,對微服務做了一個簡單的總結。
由於本人也是菜鳥一枚,有些知識點也是看了網上的一些資料,並沒有進行實際操作,所以整個文章中我就省略了程式碼和配置檔案。如果有什麼不對的地方,歡迎留言,不吝賜教。下面上正文吧。
SpringCloud元件介紹
這個元件我百度了一下,我看網上有些不一樣的,我這裡就不管那麼多了。有問題歡迎各位大牛留言,謝謝。外附一個連結
連結: link.
先介紹一下什麼是SpringCloud的吧:SpringCloud通俗易懂的理解方式,就是一系列框架的集合,內部整合了很多元件。核心元件主要有:
Eureka(註冊中心)
一個服務註冊與發現的元件。Eureka的體系主要包括服務的提供者,服務的消費者,服務註冊中心。服務的提供者和消費者都是Eureka的客戶端,服務註冊中心作為Eureka的服務端。我們在使用Eureka的時候,通過配置檔案的方式,將我們的API介面註冊到Eureka的註冊中心上,我們的服務的消費者可以向Eureka註冊中心拉取服務列表,然後根據獲取的服務列表選擇一個服務的提供者進行消費服務。
聽起來可能有人會覺得這跟Zookeeper差不多,Dubbo就是以Zookeeper作為註冊中心的。但是這兩者還是有區別的,(要不豈不是沒有Eureka什麼事了):
Dubbo只是實現了服務治理,而SpringCloud的子專案分別覆蓋了微服務架構的很多元件。
Dubbo的效率略高於SpringCloud。因為Dubbo底層使用了RPC通訊協議,而SpringCloud使用的RESTful完成的通訊協議。大型的微服務架構專案,還是推薦使用SpringCloud。
Eureka可以通過搭建叢集實現Eureka的高可用,防止Eureka掛掉,導致Eureka的不可用。這我們需要注意搭叢集的時候,要保證每個Eureka服務註冊中心之間要實現相互註冊,防止資料的不一致或者資料丟失。這裡主要是通過配置檔案的方式進行實現,不過多解釋,可以查詢其他資料。
如何從EurekaServer中動態的獲取服務提供方的IP和端
1.注入DiscoveryClient物件,啟用
2.呼叫getInstances()方法
最後提一下Eureka的自我保護機制
Eureka的自我保護機制
Eureka的自我保護機制:Eureka客戶端會定時的向 Eureka服務端傳送心跳包,預設是30S傳送一次,目的是告訴 Eureka服務端當前客戶端例項還處於存活狀態,如果Eureka服務端在一定時間內沒有收到例項的心跳,便會把該例項從登錄檔中刪除(預設是90S),但是,如果短時間內丟失大量的例項心跳,便會觸發Eureka服務端的自我保護機制的 ,預設自我保護機制處於開啟狀態。
這裡不多解釋了,參考這條連結
連結: link.
感謝link.
Ribbon(負載均衡)
一個基於HTTP和TCP的負載均衡工具,可以簡化我們的遠端呼叫。這裡有必要提一下負載均衡:
服務端的負載均衡:負載均衡演算法在服務端,由負載均衡器維護服務地址列表。在某些情況下,比如我們要搭叢集,實現伺服器端的高可用。我們需要配置多臺伺服器,每個伺服器都有不同的服務請求地址。當我們的客戶端向服務端傳送請求的時候,不會直接去訪問我們的伺服器,會先經過一個負載均衡器,內部通過負載均衡演算法,幫我們去訪問不同的伺服器。這主要是服務端的負載均衡。
還有客戶端負載均衡:我們的服務的消費者通過Eureka訪問我們的服務生產者(這裡我們配置了多個生產者,實現了高可用的叢集環境),然後我們的服務消費者通過Eureka將服務的提供者的路徑地址儲存在服務消費者內部,然後通過服務消費者自己寫的負載均衡演算法選擇不同的節點,和服務的提供者建立連線。
這裡我們提一下負載均衡的策略:隨機,輪詢(這也是Ribbon預設使用的負載均衡策略),最小併發,過濾,輪詢重試,效能可用性等。而我們的Ribbon也可以通過配置檔案的方式設定負載均衡策略。
這裡由於是配置檔案的方式,不過多闡述,有興趣的可以去查閱資料瞭解一下。以下文章涉及編碼和配置的全部省略。
那麼Ribbon是怎麼簡化遠端呼叫的呢?
這裡我就只做簡述,涉及的程式碼後期有時間再補上
1.我們在宣告RestTemplate的時候,新增一個@LoadBalanced註解。
2.在使用RestTemplate傳送請求,定義url時,host:port可以替換為服務提供者的應用名稱。
這裡就不過多闡述了,大家有時間可以去看其他的資料。
Feign
一個宣告式的REST客戶端,使用了基於註解的方式,方便了我們客戶端的配置。簡單總結一句話:Feign 的出現使得Eureka和Ribbon的使用更為簡單,同時支援SpringMVC註解。引入feign依賴,編寫Feign呼叫介面,啟動類新增@EnableFeignClients註解,開啟Feign功能。這裡具體的配置和程式碼不做講解了,後期有時間我會單獨寫一篇部落格補上來。
Hystrix(熔斷器)
這裡先提一下服務雪崩:
服務雪崩
服務雪崩: 在分散式系統或者微服務的架構下,各個系統之間的關係錯綜複雜,相互依賴。如果一個服務出現問題,可能會導致整個系統出錯,會造成一種雪崩的情況。所謂的雪崩就是一個服務失敗了,導致整條鏈路的服務都失敗的情形。這個時候,可以使用Hystrix(熔斷器)隔離遠端服務。
Hystrix(熔斷器)就是一個延遲容錯庫,用於隔離遠端服務、第三方庫,防止出現級聯失敗(雪崩)。
服務隔離:
執行緒池隔離:我們將執行緒池中的執行緒分別進行隔離,拆分成多個小的執行緒池,每個執行緒池中有若干執行緒。當一個服務掛掉以後,只會導致當前服務相對應的執行緒池中無可用執行緒。不會影響其他的服務。
訊號量隔離:限制我們的訪問量,訪問次數。
服務降級:
在進行程式開發的時候,我們要預判到我們的程式失敗的情況並進行處理。當程式服務出現失敗的情況後,我們採用我們的降級方案,遮蔽一下錯誤情況,進行一些友好提示。不管是服務的提供方還是消費方我們都需要進行降級方案的處理。防止消費方在對服務提供方呼叫之前就出現錯誤情況。
服務熔斷:
可以監控我們微服務的呼叫情況,當失敗的次數達到某個閾值的時候,會自動開啟斷路器,拒絕所有的請求,直到恢復正常。
這裡簡單提一下斷路器:斷路器有三種狀態:關閉,開啟,半開。預設是關閉的,當我們請求失敗次數達到閾值的時候,斷路器會自動開啟,拒絕所有的請求,開啟5秒以後,會切換為半開狀態,判斷請求是否正確。確定是否關閉斷路器。
服務限流
技術不夠,部落格來湊
連結:link.
zull(微服務閘道器)
連結:link.
感謝link.
Spring Cloud Zuul通過與Spring Cloud Eureka進行整合,將自身註冊為Eureka服務治理下的應用,同時從Eureka中獲得了所有其他微服務的例項資訊。對於路由規則的維護,Zuul預設會將通過以服務名作為ContextPath的方式來建立路由對映。Zuul提供了一套過濾器機制,可以支援在API閘道器無附上進行統一呼叫來對微服務介面做前置過濾,已實現對微服務介面的攔截和校驗。
Spring Cloud Config
這個就不說了,直接看這個連結吧,我也不是特別的懂
連結:link.
Gateway(閘道器)
通過閘道器去配置後臺微服務的地址,使用者直接跟閘道器打交道,將請求傳送給閘道器,閘道器再將請求傳送給對應的微服務。旨在為微服務架構提供一種簡單而有效的統一的API路由管理方式。
閘道器就是一個系統的入口,封裝了程式的內部結構。一些認證、監控、許可權驗證、快取等公共的邏輯可以在閘道器中實現。
Gateway的靜態路由: 通過Gateway進行請求轉發的時候,我們配置檔案中的uri地址是寫死的。
Gateway的動態路由(Gateway怎麼實現動態路由):
當我們的一個微服務的uri發生變化的時候,閘道器的配置就要進行更改,顯然很不方便。所以我們需要配置動態路由。我們的微服務的IP埠會註冊到Eureak,閘道器可以直接從Eureak中拉取就可以了,這裡我們只需要讓閘道器成為Eureak的一個客戶端就行了。
將我們配置檔案中的uri改為:
uri:lb://Eureak中註冊的服務名稱
Gateway(閘道器)過濾器
Gateway中可以定義多個過濾器,形成一種過濾器鏈,對我們的請求和相應進行攔截,然後完成一些通用的操作。
兩種過濾器方式:pre 和 post
pre:在轉發之前執行
post:在轉發之後執行
兩種型別的過濾器:
GatewayFilter(區域性過濾器,針對的單個路由):在配置檔案中進行配置生效。
GlobalFilter(全域性過濾器,針對所有路由):不需要進行配置,系統初始化時載入。
如有不妥之處,希望各位技術大牛多多指教,及時留言,個人不吝賜教。
如有不妥之處,希望各位技術大牛多多指教,及時留言,個人不吝賜教。
如有不妥之處,希望各位技術大牛多多指教,及時留言,個人不吝賜教。
相關文章
- PHP 詳細面試總結 (三 Redis 基礎詳解)PHP面試Redis
- Spring 原始碼解析十五:SpringCloud 的基礎元件Spring原始碼GCCloud元件
- 2019 JavaScript面試題詳解(基礎+進階)JavaScript面試題
- Python常見的一些面試題,太有用啦!Python面試題
- Java基礎面試題型整理,附帶答案詳解Java面試題
- 幾本對於筆試和麵試有用的書(乾貨~)筆試
- 谷歌的時間序列預測的基礎模型TimesFM詳解和對比測試谷歌模型
- 對於封裝react元件的一些思考封裝React元件
- 《SpringCloud設計思想》1-雲服務的基礎元件SpringGCCloud元件
- 關於最近面試的一些心得面試
- 基於React的大檔案上傳元件的開發詳解React元件
- 【對線面試官】Kafka基礎入門面試Kafka
- 面對以前沒有用過的技術——
- Vue 3 元件基礎與模板語法詳解Vue元件
- 關於面試的一些個人看法面試
- [今日白學]元件的基礎的基礎的基礎元件
- SpringCloud基礎篇AOP之攔截優先順序詳解SpringGCCloud
- SpringCloud微服務:基於Nacos元件,整合Dubbo框架SpringGCCloud微服務元件框架
- 面試必刷:最有用的Mysql面試題,面試了無數公司總結的MySql面試題
- Mybatis執行SQL的4大基礎元件詳解(圖文並茂)MyBatisSQL元件
- JS基礎面試JS面試
- 面試:計算機網路基礎詳解(一)面試計算機網路
- 面試成功源於基礎和經驗(iOS)面試iOS
- 一些關於網路的基礎知識
- BAT面試必問細節:關於Netty中的ByteBuf詳解BAT面試Netty
- 一些有用的Python庫Python
- 一些有用的網站網站
- 一些有用的連結
- 【對線面試官】Java多執行緒基礎面試Java執行緒
- Java基礎:throw和throws的詳解Java
- node基礎(4)---Stream的用法詳解
- 深入mysql基礎知識的詳解MySql
- 美團面試,問的都是基礎啊!面試
- 軟體測試——面試指南,磨刀不誤砍柴工,看完對你絕對有用!面試
- 解決基於TypeScript 的 RN專案相對路徑引入元件的問題TypeScript元件
- java基礎面試題Java面試題
- Android 面試基礎篇Android面試
- 對於效能測試的一些想法,歡迎交流