2020必須掌握的Spring Cloud

Spring Cloud面試題萬字解析(2020面試必備)

程序員追風
前言

關於Spring Cloud的知識總結了一個思維導圖分享給大家

1、什麼是 Spring Cloud ?

Spring cloud 流應用程序啓動器是 於 Spring Boot 的 Spring 集成應用程序,提供與外部系統的集成。Spring cloud Task,一個生命週期短暫的微服務框架,用於快速構建執行有限數據處理的應用程序。

2、使用 Spring Cloud 有什麼優勢?

使用 Spring Boot 開發分佈式微服務時,我們面臨以下問題

(1)與分佈式系統相關的複雜性-這種開銷包括網絡問題,延遲開銷,帶寬問題,安全問題。

(2)服務發現-服務發現工具管理羣集中的流程和服務如何查找和互相交談。它涉及一個服務目錄,在該目錄中註冊服務,然後能夠查找並連接到該目錄中的服務。

(3)冗餘-分佈式系統中的冗餘問題。

(4)負載平衡 --負載平衡改善跨多個計算資源的工作負荷,諸如計算機,計算機集羣,網絡鏈路,中央處理單元,或磁盤驅動器的分佈。

(5)性能-問題 於各種運營開銷導致的性能問題。

(6)部署複雜性 evops 技能的要求。

3、服務註冊和發現是什麼意思?Spring Cloud 如何實現?

當我們開始一個項目時,我們通常在屬性文件中進行所有的配置。隨着越來越多的服務開發和部署,添加和修改這些屬性變得更加複雜。有些服務可能會下降,而某些位置可能會發生變化。手動更改屬性可能會產生問題。 Eureka 服務註冊和發現可以在這種情況下提供幫助。由於所有服務都在 Eureka 服務器上註冊並通過調用 Eureka 服務器完成查找,因此無需處理服務地點的任何更改和處理。

4、負載平衡的意義什麼?

在計算中,負載平衡可以改善跨計算機,計算機集羣,網絡鏈接,中央處理單元或磁盤驅動器等多種計算資源的工作負載分佈。負載平衡旨在優化資源使用,最大化吞吐量,最小化響應時間並避免任何單一資源的過載。使用多個組件進行負載平衡而不是單個組件可能會通過冗餘來提高可靠性和可用性。負載平衡通常涉及專用軟件或硬件,例如多層交換機或域名系統服務器進程。

5、什麼是 Hystrix?它如何實現容錯?

Hystrix 是一個延遲和容錯庫,旨在隔離遠程系統,服務和第三方庫的訪問點,當出現故障是不可避免的故障時,停止級聯故障並在複雜的分佈式系統中實現彈性。通常對於使用微服 構開發的系統,涉及到許多微服務。這些微服務彼此協作。思考以下微服務

假設如果上圖中的微服務 9 失敗了,那麼使用傳統方法我們將傳播一個異常。但這仍然會導致整個系統崩潰。 隨着微服務數量的增加,這個問題變得更加複雜。微服務的數量可以高達 1000.這是 hystrix 出現的地方 我們將使 Hystrix 在這種情況下的 Fallback 方法功能。我們有兩個服務 employee-consumer 使用由 employee-consumer 公開的服務。簡化圖如下所示

image.png

現在假設由於 原因,employee-producer 公開的服務會拋出異常。我們在這種情況下使用 Hystrix定義了一個回退方法。這種後備方法應該具有與公開服務相同的返回類型。如果暴露服務中出現異常,則回退方法將返回一些值。

6、什麼是 Hystrix 斷路器?我們需要它嗎?

由於某些原因,employee-consumer 公開服務會引發異常。在這種情況下使用Hystrix 我們定義了一個回退方法。如果在公開服務中發生異常,則回退方法返回一些默認值。

如果 firstPage method() 中的異常繼續發生,則 Hystrix 電 ,並且員工使用者將一起跳過firtsPage 方法,並直接調用回退方法。 斷路器的目的是給第一 方法或第一頁方法可能調用的其他方法留出時間,並導致異常恢復。可能發生的情況是,在負載較小的情況下,導致異常的問題有更好的恢復機會 。

7、什麼是 Netflix Feign?它的優點是什麼?

Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 啓發的 java 客戶端聯編程序。Feign 的第一個目標是將約束分母的複雜性統一到 http apis,而不考慮其穩定性。在 employee-consumer 的例子中,我們使用了 emplo e-producer 使用 REST模板公開的 REST 服務。

但是我們必須編寫大量代碼才能執行以下步驟

1、使用功能區進行負載平衡。

2、獲取服務實例,然後獲取基本 URL。

3、利用 REST 模板來使用服務。 前面的代碼如下

@Controller
public class ConsumerControllerClient {
    @Autowired
    private LoadBalancerClient loadBalancer;
    public void getEmployee() throws RestClientException, IOException {
        ServiceInstance serviceInstance=loadBalancer.choose("employee-
producer");
        System.out.println(serviceInstance.getUri());
        String baseUrl=serviceInstance.getUri().toString();
        baseUrl=baseUrl+"/employee";
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response=null;
        try{
            response=restTemplate.exchange(baseUrl,
            HttpMethod.GET, getHeaders(),String.class);
        }
        catch (Exception ex)
        {
            System.out.println(ex);
        }
        System.out.println(response.getBody());
    }
}

之前的代碼,有像 NullPointer 這樣的例外的機會,並不是最優 。我們將看到如何使用 Netflix Fe n使呼叫變得更加輕鬆和清潔。如果 Netflix Ribbon 依賴關係 徑中,那麼 Feign 默認也會負載平衡。

8、什麼是 Spring Cloud Bus?我們需要它嗎?

考慮以下情況:我們有多個應用程序使用 Spr ng Cloud Config 讀取屬性,而S ring Cloud Config 從GIT 讀取這些屬性。

下面的例子中多個員工生產者模塊從 Employee Config Module 獲取 Eureka 註冊的財產

如果假設 GIT 中的 Eureka 註冊屬性更改爲指向另一臺 Eureka 服務器,會發生什麼情況。在這種情況下,我們將不得不重新啓動服務以獲取更新的屬性。還有另一種使用執行器端點/刷新的方式。但是我們將不得不爲每個模塊單獨調用這個 url。例如,如果 Employee Producer1 部署在端口 8080 上,則調用 http:// localhost:8080 / refresh。同樣對於 Employee Producer2 http://localhost:8081 /refresh 等等。這又很麻煩。這就是 Spring Cloud Bus 發揮作用的地方。

Spring Cloud Bus 提供了跨多個實例刷新配置的功能。因此,在上面的 中,如果我們刷新Employee Producer1,則會自動刷 所有其他必需的模塊。如果我們有 個微服務啓動並運行,這特別有用。這是通過將所有微服務連 到單個消息代理來實現的。無論何時刷新實例,此事件都會訂閱到偵聽此代理的所有微服務,並且它們也會刷新。可以通過使用端點/總線/刷新來實現對任何單個實例的刷新

9、什麼是微服務

微服務架構是一種架構模式或者說是一種架構風格,它提倡將單一應用程序劃分爲一組小的服務,每個服務運行在其獨立的自己的進程中,服務之間相互協調、互相配合,爲用戶提供最終價值。服務之間採用輕量級的通信機制互相溝通(通常是基於HTTP的RESTful API),每個服務都圍繞着具體的業務進行構建,並且能夠被獨立的構建在生產環境、類生產環境等。另外,應避免統一的、集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合適的語言、工具對其進行構建,可以有一個非常輕量級的集中式管理來協調這些服務,可以使用不同的語言來編寫服務,也可以使用不同的數據存儲。

10、什麼是服務熔斷?什麼是服務降級

熔斷機制是應對雪崩效應的一種微服務鏈路保護機制。當某個微服務不可用或者響應時間太長時,會進行服務降級,進而熔斷該節點微服務的調用,快速返回“錯誤”的響應信息。當檢測到該節點微服務調用響應正常後恢復調用鏈路。在SpringCloud框架裏熔斷機制通過Hystrix實現,Hystrix會監控微服務間調用的狀況,當失敗的調用到一定閾值,缺省是5秒內調用20次,如果失敗,就會啓動熔斷機制。

服務降級,一般是從整體負荷考慮。就是當某個服務熔斷之後,服務器將不再被調用,此時客戶端可以自己準備一個本地的fallback回調,返回一個缺省值。這樣做,雖然水平下降,但好歹可用,比直接掛掉強。

11、Eureka和zookeeper都可以提供服務註冊與發現的功能,請說說兩個的區別?

Zookeeper保證了CP(C:一致性,P:分區容錯性),Eureka保證了AP(A:高可用)

(1)當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的信息,但不能容忍直接down掉不可用。也就是說,服務註冊功能對高可用性要求比較高,但zk會出現這樣一種情況,當master節點因爲網絡故障與其他節點失去聯繫時,剩餘節點會重新選leader。問題在於,選取leader時間過長,30 ~120s,且選取期間zk集羣都不可用,這樣就會導致選取期間註冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk集羣失去master節點是較大概率會發生的事,雖然服務能夠恢復,但是漫長的選取時間導致的註冊長期不可用是不能容忍的。

(2)Eureka保證 用性,Eureka各個節點是平等的,幾個節點掛掉不會影響正常節點的工作,剩餘的節點仍然可以提供註冊和查詢服務。而Eureka的客戶端向某個Eureka註冊或發現時發生連接失敗,則會自動切換到其他節點,只要有一臺Eureka還在,就能保證註冊服務可用,只是查到的信息可能不是最新的。除此之外,Eureka還有自我保護機制,如果在15分鐘內超過85%的節點沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心發生了網絡故障,此時會出現以下幾種情況:

①、Eureka不在從註冊列表中移除因爲長時間沒有收到心跳而應該過期的服務。

②、Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其他節點上(即保證當前節點仍然可用)

③、當網絡穩定時,當前實例新的註冊信息會被同步到其他節點。因此,Eureka可以很好的應對因網絡故障導致部分節點失去聯繫的情況,而不會像Zookeeper那樣使整個微服務癱瘓

12、SpringBoot和SpringCloud的區別?

SpringBoot專注於快速方便的開發單個個體微服務。

SpringCloud是關注全局的微服務協調整理治理框架,它將SpringBoot開發的一個個單體微服務整合並管理起來,爲各個微服務之間提供,配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分佈式會話等等集成服務SpringBoot可以離開SpringCloud獨立使用開發項目, 但是SpringCloud離不開SpringBoot ,屬於依賴的關係.

SpringBoot專注於快速、方便的開發單個微服務個體,SpringCloud關注全局的 治理框架

13、什麼是Hystrix斷路器?我們需要它嗎

由於某些原因,employee-consumer公開服務會引發異常。 情況下使用Hystrix我們定義了回退方法。如果在公開服務中發生異常,則回退方法返回一些默認值 。

如果firstPage method() 中的異常繼續發生,則Hystrix電路將中斷,並且員工使用者將一起跳過firtsPage方法,並直接調用回退方法。 斷路器的目的是給第一頁方法或第一頁方法可能調用的其他方法留出時間,並導致異常恢復。可能發生的情況是,在負載較小的情況下,導致異常的問題有更好的恢復機會 。

14、說說 RPC 的實現原理

首先需要有處理網絡連接通訊的模塊,負責連接建立、管理和消息的傳輸。其次需要有編解碼的模塊,因爲網絡通訊都是傳輸的字節碼,需要將我們使用的對象序列化和反序列化。剩下的就是客戶端和服務器端的部分,服務器端暴露要開放的服務接口,客戶調用服務接口的一個代理實現,這個代理實現負責收集數據、編碼並傳輸給服務器然後等待結果返回。

15、微服務的優點缺點?說下開發項目中遇到的坑?

優點:

(1)每個服務直接足夠內聚,代碼容易理解

(2)開發效率高,一個服務只做一件事,適合小團隊開發

(3)鬆耦合,有功能意義的服務。

(4)可以用不同語言開發,面向接口編程。

(5)易於第三方集成

(6)微服務只是業務邏輯的代碼,不會和HTML,CSS或其他界

(7)可以靈活搭配,連接公共庫/連接獨立庫

缺點:

(1)分佈式系統的責任性

(2)多服務運維難度加大。

(3)系統部署依賴,服務間通信成本,數據一致 ,系統集成測試,性能監控。

16、spring cloud 和d bbo區別?

(1)服務調用方式 dubbo是RPC spri cloud Rest Api

(2)註冊中心,dubbo 是zookeep r springcloud是eureka,也可以是zookeeper

(3)服務網關,dubbo本身沒有實現,只能通過其他第三方技術整合,springcloud有Zuul路由網關,作爲路由服務器,進行消費者的請求分發,springcloud支持斷路器,與git完美集成配置文件支持版本控制,事物總線實現配置文 的更新與服務自動裝配等等一系列的微服務架構要素。

17、REST 和RPC對比

(1)RPC主要的缺陷是服務提供方和調用方式之間的依賴太強,需要對每一個微服務進行接口的定義,並通過持續繼承發佈,嚴格版本控制纔不會出現衝突。

(2)REST是輕量級的接口,服務的提供和調用不存在代碼之間的耦合,只需要一個約定進行規範。

18、你所知道的微服務技術棧?

維度(springcloud)

服務開發:springboot spring springmvc

服務配置與管理:Netfix公司的Archaiusm ,阿里的Diamond

服務註冊與發現:Eureka,Zookeeper

服務調用:Rest RPC gRpc

服務熔斷器:Hystrix

服務負載均衡:Ribbon Nginx

服務接口調用:Fegin

消息隊列:Kafka Rabbitmq activemq

服務配置中心管理:SpringCloudConfig

服務路由(API網關)Zuul

事件消息總線:SpringCloud Bus

19、微服務之間是如何獨立通訊的?

(1)遠程調用,比如feign調用,直接通過遠程過程調用來訪問別的service。

(2)消息中間件

20、springcloud如何實現服務的註冊?

(1)服務發佈時,指定對應的服務名,將服務註冊到 註冊中心(eureka zookeeper)

(2)註冊中心加@EnableEurekaServer,服務用@EnableDiscoveryClient,然後用ribbon或feign進行服務直接的調用發現。

21、Eureka和Zookeeper區別

(1)Eureka取CAP的AP,注重可用性,Zookeeper取CAP的CP注重一致性。

(2)Zookeeper在選舉期間註冊服務癱瘓,雖然服務最終會恢復,但選舉期間不可用。

(3)eureka的自我保護機制,會導致一個結果就是不會再從註冊列表移除因長時間沒收到心跳而過期的服務。依然能接受新服務的註冊和查詢請求,但不會被同步到其他節點。不會服務癱瘓。

(4)Zookeeper有Leader和Follower角色,Eureka各個節點平等。

(5)Zookeeper採用過半數存活原則, reka採用自我保護機制解決分區 。

(6)eureka本質是一個工程,Zookeeper只是一個進程。

22、eureka自我保護機制是什麼?

當Eureka Server 點在短時間內丟失了過多實例的連接時(比如網絡故障或頻繁啓動關閉客戶端)節點會進入自我保護模式,保護註冊信息,不再刪除註冊數據,故障恢復時,自動退出自我保護模式。

23、什麼是Ribbon?

ribbon是一個負載均衡客戶端,可以很好的控制htt和tcp的一些行爲。feign默認集成了ribbon。

24、什麼是feigin?它的優點是什麼?

(1)feign採用的是基於接口的註解

(2)feign整合了ribbon,具有負載均衡的能力

(3)整合了Hystrix,具有熔斷的能力

使用:

(1)添加pom依賴。

(2)啓動類添加@EnableFeignClients

(3)定義一個接口@FeignClient(name=“xxx”)指定調用哪個服務

25、Ribbon和Feign的區別?

(1)Ribbon都是調用其他服務的,但方式不同。

(2)啓動類註解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients

(3)服務指定的位置不同,Ribbon是在@RibbonClient註解上聲明,Feign則是在定義抽象方法的接口中使用@FeignClient聲明。

(4)調用方式不同,Ribbon需要自己構建http請求,模擬http請求然後使用RestTemplate發送給其他服務,步驟相當繁瑣。Feign需要將調用的方法定義成抽象方法即可。

26、什麼是Spring Cloud Bus?

spring cloud bus 將分佈式的節點用輕量的消息代理連接起來,它可以用於廣播配置文件的更改或者服務直接的通訊,也可用於監控。

如果修改了配置文件,發送一次請求,所有的客戶端便會重新讀取配置文件。

使用:

(1)添加依賴

(2)配置rabbimq

27、springcloud斷路器作用?

當一個服務調用另一個服務由於網絡原因或自 原因出現問題,調用者就會等 調用者的響應 當更多的服務請求到這些資源導致更多的請求等待,發生連鎖效應(雪崩效應)

斷路器有完全打開狀態:一段時間內 到一定的次數無法調用 並且多次監 沒有恢復的跡象 斷路器完全打開 那麼下次請求就不會請求到該服務

半開:短時間內 有恢復跡象 斷路器會將部分請求發給該服務,正常調用時 斷路器關閉

關閉:當服務一直處於正常狀 能正常調用

28、Spring Cloud Gateway?

Spring Cloud Gateway是Spring Cloud官方推出的第二代網關框架,取代Zuul網關。網關作爲流量的,在微服務系統中有着非常作用,網關常見的功能有路由轉發、權限校驗、限流控制等作用。

使用了一個RouteLocatorBuilder的bean去創建路由,除了創建路由RouteLocatorBuilder可以讓你添加各種predicates和filters,predicates斷言的意思,顧名思義就是根據具體的請求的規則,由具體的route去處理,filters是各種過濾器,用來對請求做各種判斷和修改。

29、作爲 務註冊中心,Eureka比Zookeeper好在哪裏?

(1)Eureka保證的是可用性和分區容錯性,Zookeeper 保證的是一致性和分區容錯性 。

(2)Eureka還有一種自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障。而不會像zookeeper那樣使整個註冊服務癱瘓。

30、什麼是 Ribbon負載均衡?

(1)Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端 負載均衡的工具。

(2)Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer(簡稱LB)後面所有的機器,Ribbon會自動的幫助你基於某種規則(如簡單輪詢,隨機連接等)去連接這些機器。我們也很容易使用Ribbon實現自定義的負載均衡算法。

31、Ribbon負載均衡能幹什麼?

(1)將用戶的請求平攤的分配到多個服務上

(2)集中式LB即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬件,如F5, 也可以是軟件,如nginx), 由該設施負責把訪問請求通過某種策略轉發至服務的提供方;

(3)進程內LB將LB邏輯集成到消費方,消費方從服務註冊中心獲知有哪些地址可用,然後自己再從這些地址中選擇出一個合適的服務器。

注意: Ribbon就屬於進程內LB,它只是一個類庫,集成於消費方進程,消費方 它來獲取到服務提供方的地址。

32、什麼是 zuul路由網關

(1)Zuul 包含了對請求的路由和過濾兩個最主要的功能:其中 責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎而過濾器功能則負 請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎、

(2)Zuul和Eureka進行整合,將Zuul自身註冊爲Eureka服務治理下的應用,同時從Eureka中獲得其他微服務的消息,也即以後的訪問微服務都是通過Zuul跳轉後獲得。

注意: Zuul服務最終還是會註冊進Eureka 提供=代理+路由+過濾 三大功能

33、分佈式配置中心能幹嘛?

(1)集中管理配置文件不同環境不同配置,動態化的配置更新,分環境部署比如

dev/test/prod/beta/release

(2)運行期間動態調整 置,不再需要在每個服務部署的機器上編寫配置文件,服務會向配置中心統一拉取配置自己的信息

(3)當配置發生變動時,服務不需要重啓即可感知到配置的變化並應用新的配置將配置信息以REST接口的形式暴露

34、Hystrix相關注解

@EnableHystrix:開啓熔斷

@HystrixCommand(fallbackMethod=”XXX”):聲明一個失敗回滾處理函數XXX,當被註解的方法執行超時(默認是 0毫秒),就會執行fallback函數,返回錯誤提示。

image.png

35、Eureka和zookeeper都可以提供服務註冊與發現的功能,請說說兩個的區別?

Zookeeper保證了CP(C:一致性,P:分區容錯性),Eureka保證了AP(A:高可用)

(1)當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的信息,但不能容忍直接down掉不可用。 就是說,服務註冊功能對高可用性要求比較高,但zk會出現這樣一種情況,當master節點因爲網絡故障與其他節點失去聯繫時,剩餘節點會重新選leader。問題在於,選取leader時間過長,30 ~ 120s,且選取期間zk集羣都不可用,這樣就會導致選取期間註冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk集羣失去master節點是較大概率會發生的事,雖然服務能夠恢復,但是漫長的選取時間導致的註冊長期不可用是不能容忍的。

(2)Eureka保證了可用性,Eureka各個節點是平等的,幾個節點掛掉不會影響正常節點的工作,剩餘的節點仍然可以提供註冊和查詢服務。而Eureka的客戶端向某個Eureka註冊或發現時發生連接失敗,則會自動切換到其他節點,只要有一臺Eureka還在,就能保證註冊服務可用,只是查到的信息可能不是最新的。除此之外,Eureka還有自我保護機制,如果在15分鐘內超過85%的節點沒有正常的心跳,那麼Eureka就認爲 戶端與註冊中心發生了網絡故障,此時會出現以下幾種情況:

①、Eureka不 從註冊列表中移除因爲長時間沒有收到心跳而應該過期的服務。

②、Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其他節點上(即保證當前節點仍然可用)

③、當網絡穩定時,當前實例新的註冊信息會被同步到其他節點。

因此,Eureka可以很好的應對因網絡故障導致部分節點失去聯繫的情況,而不會像Zookeeper那樣使整個微服務癱瘓。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章