SpringCloud常見面試題(2020最新版)

2021-02-21 Java知音
為什麼需要學習Spring Cloud

不論是商業應用還是用戶應用,在業務初期都很簡單,我們通常會把它實現為單體結構的應用。但是,隨著業務逐漸發展,產品思想會變得越來越複雜,單體結構的應用也會越來越複雜。這就會給應用帶來如下的幾個問題:

代碼結構混亂:業務複雜,導致代碼量很大,管理會越來越困難。同時,這也會給業務的快速迭代帶來巨大挑戰;

開發效率變低:開發人員同時開發一套代碼,很難避免代碼衝突。開發過程會伴隨著不斷解決衝突的過程,這會嚴重的影響開發效率;

排查解決問題成本高:線上業務發現 bug,修復 bug 的過程可能很簡單。但是,由於只有一套代碼,需要重新編譯、打包、上線,成本很高。

由於單體結構的應用隨著系統複雜度的增高,會暴露出各種各樣的問題。近些年來,微服務架構逐漸取代了單體架構,且這種趨勢將會越來越流行。Spring Cloud是目前最常用的微服務開發框架,已經在企業級開發中大量的應用。

什麼是Spring Cloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現註冊、配置中心、智能路由、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。

Spring Cloud並沒有重複製造輪子,它只是將各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。

設計目標與優缺點 設計目標

協調各個微服務,簡化分布式系統開發。

優缺點

微服務的框架那麼多比如:dubbo、Kubernetes,為什麼就要使用Spring Cloud的呢?

優點:

產出於Spring大家族,Spring在企業級開發框架中無人能敵,來頭很大,可以保證後續的更新、完善

組件豐富,功能齊全。Spring Cloud 為微服務架構提供了非常完整的支持。例如、配置管理、服務發現、斷路器、微服務網關等;

Spring Cloud 社區活躍度很高,教程很豐富,遇到問題很容易找到解決方案

服務拆分粒度更細,耦合度比較低,有利於資源重複利用,有利於提高開發效率

減輕團隊的成本,可以並行開發,不用關注其他人怎麼開發,先關注自己的開發

缺點:

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

總的來說優點大過於缺點,目前看來Spring Cloud是一套非常完善的分布式框架,目前很多企業開始用微服務、Spring Cloud的優勢是顯而易見的。因此對於想研究微服務架構的同學來說,學習Spring Cloud是一個不錯的選擇。

Spring Cloud發展前景

Spring Cloud對於中小型網際網路公司來說是一種福音,因為這類公司往往沒有實力或者沒有足夠的資金投入去開發自己的分布式系統基礎設施,使用Spring Cloud一站式解決方案能在從容應對業務發展的同時大大減少開發成本。

同時,隨著近幾年微服務架構和Docker容器概念的火爆,也會讓Spring Cloud在未來越來越「雲」化的軟體開發風格中立有一席之地,尤其是在五花八門的分布式解決方案中提供了標準化的、全站式的技術方案,意義可能會堪比當年Servlet規範的誕生,有效推進服務端軟體系統技術水平的進步。

整體架構 主要項目

Spring Cloud的子項目,大致可分成兩類,一類是對現有成熟框架"Spring Boot化"的封裝和抽象,也是數量最多的項目;第二類是開發了一部分分布式系統的基礎設施的實現,如Spring Cloud Stream扮演的就是kafka, ActiveMQ這樣的角色。

Spring Cloud Config

集中配置管理工具,分布式系統中統一的外部配置管理,默認使用Git來存儲配置,可以支持客戶端配置的刷新及加密、解密操作。

Spring Cloud Netflix

Netflix OSS 開源組件集成,包括Eureka、Hystrix、Ribbon、Feign、Zuul等核心組件。

Eureka:服務治理組件,包括服務端的註冊中心和客戶端的服務發現機制;

Ribbon:負載均衡的服務調用組件,具有多種負載均衡調用策略;

Hystrix:服務容錯組件,實現了斷路器模式,為依賴服務的出錯和延遲提供了容錯能力;

Feign:基於Ribbon和Hystrix的聲明式服務調用組件;

Zuul:API網關組件,對請求提供路由及過濾功能。

Spring Cloud Bus

用於傳播集群狀態變化的消息總線,使用輕量級消息代理連結分布式系統中的節點,可以用來動態刷新集群中的服務配置。

Spring Cloud Consul

基於Hashicorp Consul的服務治理組件。

Spring Cloud Security

安全工具包,對Zuul代理中的負載均衡OAuth2客戶端及登錄認證進行支持。

Spring Cloud Sleuth

Spring Cloud應用程式的分布式請求鏈路跟蹤,支持使用Zipkin、HTrace和基於日誌(例如ELK)的跟蹤。

Spring Cloud Stream

輕量級事件驅動微服務框架,可以使用簡單的聲明式模型來發送及接收消息,主要實現為Apache Kafka及RabbitMQ。

Spring Cloud Task

用於快速構建短暫、有限數據處理任務的微服務框架,用於向應用中添加功能性和非功能性的特性。

Spring Cloud Zookeeper

基於Apache Zookeeper的服務治理組件。

Spring Cloud Gateway

API網關組件,對請求提供路由及過濾功能。

Spring Cloud OpenFeign

基於Ribbon和Hystrix的聲明式服務調用組件,可以動態創建基於Spring MVC註解的接口實現用於服務調用,在Spring Cloud 2.0中已經取代Feign成為了一等公民。

Spring Cloud的版本關係

Spring Cloud是一個由許多子項目組成的綜合項目,各子項目有不同的發布節奏。為了管理Spring Cloud與各子項目的版本依賴關係,發布了一個清單,其中包括了某個Spring Cloud版本對應的子項目版本。

為了避免Spring Cloud版本號與子項目版本號混淆,Spring Cloud版本採用了名稱而非版本號的命名,這些版本的名字採用了倫敦地鐵站的名字,根據字母表的順序來對應版本時間順序,例如Angel是第一個版本,Brixton是第二個版本。

當Spring Cloud的發布內容積累到臨界點或者一個重大BUG被解決後,會發布一個"service releases"版本,簡稱SRX版本,比如Greenwich.SR2就是Spring Cloud發布的Greenwich版本的第2個SRX版本。目前Spring Cloud的最新版本是Hoxton。

Spring Cloud和SpringBoot版本對應關係

Spring Cloud和各子項目版本對應關係

注意:Hoxton版本是基於SpringBoot 2.2.x版本構建的,不適用於1.5.x版本。隨著2019年8月SpringBoot 1.5.x版本停止維護,Edgware版本也將停止維護。

SpringBoot和SpringCloud的區別?

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

SpringCloud是關注全局的微服務協調整理治理框架,它將SpringBoot開發的一個個單體微服務整合併管理起來,

為各個微服務之間提供,配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分布式會話等等集成服務

SpringBoot可以離開SpringCloud獨立使用開發項目, 但是SpringCloud離不開SpringBoot ,屬於依賴的關係

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

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

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

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

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

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

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

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

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

當我們開始一個項目時,我們通常在屬性文件中進行所有的配置。隨著越來越多的服務開發和部署,添加和修改這些屬性變得更加複雜。有些服務可能會下降,而某些位置可能會發生變化。手動更改屬性可能會產生問題。

Eureka 服務註冊和發現可以在這種情況下提供幫助。由於所有服務都在 Eureka 伺服器上註冊並通過調用 Eureka 伺服器完成查找,因此無需處理服務地點的任何更改和處理。

Spring Cloud 和dubbo區別?

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

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

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

負載平衡的意義什麼?

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

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

Hystrix 是一個延遲和容錯庫,旨在隔離遠程系統,服務和第三方庫的訪問點,當出現故障是不可避免的故障時,停止級聯故障並在複雜的分布式系統中實現彈性。

通常對於使用微服務架構開發的系統,涉及到許多微服務。這些微服務彼此協作。

思考以下微服務

img

假設如果上圖中的微服務 9 失敗了,那麼使用傳統方法我們將傳播一個異常。但這仍然會導致整個系統崩潰。

隨著微服務數量的增加,這個問題變得更加複雜。微服務的數量可以高達 1000.這是 hystrix 出現的地方 我們將使用 Hystrix 在這種情況下的 Fallback 方法功能。我們有兩個服務 employee-consumer 使用由 employee-consumer 公開的服務。

簡化圖如下所示

img

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

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

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

img

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

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

Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 啟發的 java 客戶端聯編程序。

Feign 的第一個目標是將約束分母的複雜性統一到 http apis,而不考慮其穩定性。

在 employee-consumer 的例子中,我們使用了 employee-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 Feign 使呼叫變得更加輕鬆和清潔。如果 Netflix Ribbon 依賴關係也在類路徑中,那麼 Feign 默認也會負責負載平衡。

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

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

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

img

如果假設 GIT 中的 Eureka 註冊屬性更改為指向另一臺 Eureka 伺服器,會發生什麼情況。在這種情況下,我們將不得不重新啟動服務以獲取更新的屬性。

還有另一種使用執行器端點/刷新的方式。但是我們將不得不為每個模塊單獨調用這個 url。例如,如果 Employee Producer1 部署在埠 8080 上,則調用 http:// localhost:8080 / refresh。同樣對於 Employee Producer2 http://localhost:8081 / refresh 等等。這又很麻煩。這就是 Spring Cloud Bus 發揮作用的地方。

img

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

Spring Cloud斷路器的作用

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

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

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

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

什麼是Spring Cloud Config?

在分布式系統中,由於服務數量巨多,為了方便服務配置文件統一管理,實時更新,所以需要分布式配置中心組件。在Spring Cloud中,有分布式配置中心組件spring cloud config ,它支持配置服務放在配置服務的內存中(即本地),也支持放在遠程Git倉庫中。在spring cloud config 組件中,分兩個角色,一是config server,二是config client。

使用:

(1)添加pom依賴

(2)配置文件添加相關配置

(3)啟動類添加註解@EnableConfigServer

什麼是Spring Cloud Gateway?

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

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

相關焦點

  • Spring Cloud 2020.0.0 正式發布,移除大量模塊
    踩著 2020 的尾巴 Spring Cloud 2020 (代號"Ilford",伊爾福德)版本正式發布,目前已可以從 maven
  • Java 最常見的 200+ 面試題:面試必備
    聊回面試題這件事,這份面試清單原本是我們公司內部使用的,可到後來有很多朋友在微信上聯繫到我,讓我幫他們找一些面試方面的資料,而且這些關係也不太好拒絕,一呢,是因為這些找我,要面試題的人,不是我的好朋友的弟弟妹妹,就是我的弟弟妹妹們;二呢,我也不能馬馬虎虎的對付,受人之事忠人之命,我也不能辜負這份信任。
  • 2019 最新 200 道 Java 面試題
    ,我做了大量的「功課」,首先我研究了幾乎所有大廠的面試題,還和負責招聘工作的幾個朋友,詳細的探討了 Java 面試所要涉及的知識點,於是就有了今天大家看到的這 200 多道面試題。有了這些面試題不意味著,死記硬背之後就能進入企業工作,尤其是 BAT 等工作崗位競爭更為激烈,這些面試題只能成為面試體系中的一道「開胃菜」,從而提高了整個 Java 面試的壁壘,讓願與學的人,變的更加優秀,從而和懶惰的人拉開差距,讓企業也能更輕易的甄別。這些面試題包含哪些內容?
  • 阿里P8大佬整理總結的:2020年最新BATJ面試真題,適合java高崗
    前言2020這一年及其的不容易,因為疫情,不僅企業面臨著巨大的挑戰,而且程式設計師也面臨著很大的挑戰,很多廠子都已倒閉,很多人都已經被裁員。很明顯金三銀四已經泡湯了,大家也不要氣餒,金九銀十很快就要來了,疫情也過去了。
  • Spring Cloud-Hystrix 斷路器
    org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.netflix.feign.EnableFeignClients;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate
  • 使用Spring Cloud Data Flow 來實現數據流處理
    SCDF目前(截止2020/6)的最新版為2.5,官網地址為: https://dataflow.spring.io/ 概述 SCDF中的數據微服務應用仍然是Spring Boot應用,通過Spring Cloud Stream抽象了流處理/消息機制,Spring
  • Spring Cloud Alibaba 發布 GA 版本,新增 4 個模塊
    版本概要概要: 增加了 4 個新的模塊:spring-cloud-alibaba-dubbo、spring-cloud-alibaba-seata、spring-cloud-alibaba-sentinel-zuul 以及 spring-cloud-alicloud-sms。
  • springcloud五大組件
    首先我們來看springcloud是什麼?它是微服務架構集大成者,基於springboot構建,可以將一系列優秀組件進行完美整合。對熟悉的程式設計師來說,上手不麻煩,對新手來說,就需要了解springcloud架構再去學習。
  • 阿里巴巴SpringCloud開源教程、文檔合集,趕緊收藏
    Spring Boot作為下一代 web 框架,Spring Cloud 作為最新最火的微服務的翹楚,你還有什麼理由拒絕。趕快上船吧,老船長帶你飛。終章不是最後一篇,它是一個匯總,未來還會寫很多篇。不要問我為什麼?你們要學習我也要學習啊,共享讓人快了,缺點總是要有被人指點出來的!
  • 2021-Java後端工程師面試指南-(SpringBoot+SpringCloud)
    前言「文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/bin392328206/six-finger種一棵樹最好的時間是十年前,其次是現在」Tips面試指南系列,很多情況下不會去深挖細節,是小六六以被面試者的角色去回顧知識的一種方式,所以我默認大部分的東西,作為面試官的你,肯定是懂的
  • springcloud實踐二:gateway網關詳解
    spring-boot和spring-cloud版本spring-cloud Hoxton.SR8spring-boot 2.3.3.RELEASEspring-cloud-starter-gateway 2.2.5.RELEASE(不需要在pom指定,跟隨spring cloud即可)下面我會演示下實際的項目代碼以及效果
  • 安全的Spring Cloud配置
    我的GitHub存儲庫sample-spring-cloud-security在分支secure_config中提供了示例應用程式原始碼:https : //github.com/piomin/sample-spring-cloud-security/tree/secure_config。
  • 5w 字 | 172 圖 | 超級賽亞級 Spring Cloud 實戰
    PassJava 是一款 Java 面試刷題 的開源系統,可以用零碎時間利用小程序查看常見面試題,夯實 Java 基礎。=passjava-memberspring.cloud.nacos.config.server-addr=127.0.0.1:8848spring.cloud.nacos.config.namespace=passjava-memberspring.cloud.nacos.config.group=prodspring.cloud.nacos.config.extension-configs
  • SpringCloud 必知的18道面試題
    今天跟大家分享下SpringCloud常見面試題的知識。
  • 4年 46 個版本,一文讀懂 Spring Cloud 發展歷史
    後續 IaasS 廠商對應的 Spring Cloud 項目會移出 Spring Cloud 組織,各自單獨維護(spring-cloud-azure 一直都是單獨維護,spring-cloud-alibaba 孵化在 Spring Cloud 組織,畢業後單獨維護);API 重構,會帶來重大的改變(Spring Cloud Hoxton 版本新增了
  • Tomcat面試題(2020最新版)
    反應時間不如進程內但伸縮性和穩定性比進程內優;進入Tomcat的請求可以根據Tomcat的工作模式分為如下兩類:Tomcat作為應用程式伺服器:請求來自於前端的web伺服器,這可能是Apache, IIS, Nginx等;Tomcat作為獨立伺服器:請求來自於web瀏覽器;面試時問到Tomcat相關問題的機率並不高
  • .net core+Spring Cloud學習之路 一
    我採用的是java的Spring cloud + .net core。先打開idea創建一個Spring boot項目,在pom文件中添加如下maven依賴:<dependencyManagement>        <dependencies>            <dependency>                <groupId>org.springframework.cloud
  • SpringCloud Gateway動態路由
    上邊介紹的幾種發布方案,主要是引出我們接下來介紹的 spring-cloud-gateway 動態路由,我們可以基於動態路由、負載均衡和策略加載去實現灰度發布。當然現在有很多開源的框架可以實現灰度發布,這裡只是研究學習。
  • Spring Boot 常見錯誤及解決方法
    下面根據我們自身遇到的問題,加上用戶提供的一些反饋,來大致梳理下 Spring Boot 的常見錯誤及解決方法。找不到配置?配置不對?配置被覆蓋?IP,可以通過 -Dspring.cloud.nacos.discovery.ip=xxx(-D 參數配置的優先級比配置文件要高)。
  • 使用redis在SpringCloud getway中進行速率限制
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>