1. 什么是 spring cloud蹄咖?
spring cloud 是一系列框架的有序集合褐健。它利用 spring boot 的開(kāi)發(fā)便利性巧妙地簡(jiǎn)化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開(kāi)發(fā),如服務(wù)發(fā)現(xiàn)注冊(cè)澜汤、配置中心蚜迅、消息總線、負(fù)載均衡俊抵、斷路器谁不、數(shù)據(jù)監(jiān)控等,都可以用 spring boot 的開(kāi)發(fā)風(fēng)格做到一鍵啟動(dòng)和部署徽诲。
2. spring cloud 斷路器的作用是什么拍谐?
在分布式架構(gòu)中烛缔,斷路器模式的作用也是類似的,當(dāng)某個(gè)服務(wù)單元發(fā)生故障(類似用電器發(fā)生短路)之后轩拨,通過(guò)斷路器的故障監(jiān)控(類似熔斷保險(xiǎn)絲)践瓷,向調(diào)用方返回一個(gè)錯(cuò)誤響應(yīng),而不是長(zhǎng)時(shí)間的等待亡蓉。這樣就不會(huì)使得線程因調(diào)用故障服務(wù)被長(zhǎng)時(shí)間占用不釋放晕翠,避免了故障在分布式系統(tǒng)中的蔓延。
3. spring cloud 的核心組件有哪些砍濒?
Eureka:服務(wù)注冊(cè)于發(fā)現(xiàn)淋肾。
Feign:基于動(dòng)態(tài)代理機(jī)制,根據(jù)注解和選擇的機(jī)器爸邢,拼接請(qǐng)求 url 地址樊卓,發(fā)起請(qǐng)求。
Ribbon:實(shí)現(xiàn)負(fù)載均衡杠河,從一個(gè)服務(wù)的多臺(tái)機(jī)器中選擇一臺(tái)碌尔。
Hystrix:提供線程池,不同的服務(wù)走不同的線程池券敌,實(shí)現(xiàn)了不同服務(wù)調(diào)用的隔離唾戚,避免了服務(wù)雪崩的問(wèn)題。
Zuul:網(wǎng)關(guān)管理待诅,由 Zuul 網(wǎng)關(guān)轉(zhuǎn)發(fā)請(qǐng)求給對(duì)應(yīng)的服務(wù)叹坦。
4. SpringCloud和Dubbo
SpringCloud和Dubbo都是現(xiàn)在主流的微服務(wù)架構(gòu)
SpringCloud是Apache旗下的Spring體系下的微服務(wù)解決方案
Dubbo是阿里系的分布式服務(wù)治理框架
從技術(shù)維度上,其實(shí)SpringCloud遠(yuǎn)遠(yuǎn)的超過(guò)Dubbo,Dubbo本身只是實(shí)現(xiàn)了服務(wù)治理,而SpringCloud現(xiàn)在以及有21個(gè)子項(xiàng)目以后還會(huì)更多
所以其實(shí)很多人都會(huì)說(shuō)Dubbo和SpringCloud是不公平的
但是由于RPC以及注冊(cè)中心元數(shù)據(jù)等原因,在技術(shù)選型的時(shí)候我們只能二者選其一,所以我們常常為用他倆來(lái)對(duì)比
服務(wù)的調(diào)用方式Dubbo使用的是RPC遠(yuǎn)程調(diào)用,而SpringCloud使用的是 Rest API,其實(shí)更符合微服務(wù)官方的定義
服務(wù)的注冊(cè)中心來(lái)看,Dubbo使用了第三方的ZooKeeper作為其底層的注冊(cè)中心,實(shí)現(xiàn)服務(wù)的注冊(cè)和發(fā)現(xiàn),SpringCloud使用Spring Cloud Netflix Eureka實(shí)現(xiàn)注冊(cè)中心,當(dāng)然SpringCloud也可以使用ZooKeeper實(shí)現(xiàn),但一般我們不會(huì)這樣做
服務(wù)網(wǎng)關(guān),Dubbo并沒(méi)有本身的實(shí)現(xiàn),只能通過(guò)其他第三方技術(shù)的整合,而SpringCloud有Zuul路由網(wǎng)關(guān),作為路由服務(wù)器,進(jìn)行消費(fèi)者的請(qǐng)求分發(fā),SpringCloud還支持?jǐn)嗦菲?與git完美集成分布式配置文件支持版本控制,事務(wù)總線實(shí)現(xiàn)配置文件的更新與服務(wù)自動(dòng)裝配等等一系列的微服務(wù)架構(gòu)要素
從技術(shù)選型上講~
目前國(guó)內(nèi)的分布式系統(tǒng)選型主要還是Dubbo畢竟國(guó)產(chǎn),而且國(guó)內(nèi)工程師的技術(shù)熟練程度高,并且Dubbo在其他維度上的缺陷可以由其他第三方框架進(jìn)行集成進(jìn)行彌補(bǔ)
而SpringCloud目前是國(guó)外比較流行,當(dāng)然我覺(jué)得國(guó)內(nèi)的市場(chǎng)也會(huì)慢慢的偏向SpringCloud,就連劉軍作為Dubbo重啟的負(fù)責(zé)人也發(fā)表過(guò)觀點(diǎn),Dubbo的發(fā)展方向是積極適應(yīng)SpringCloud生態(tài),并不是起沖突
Rest和RPC對(duì)比
其實(shí)如果仔細(xì)閱讀過(guò)微服務(wù)提出者馬丁福勒的論文的話可以發(fā)現(xiàn)其定義的服務(wù)間通信機(jī)制就是Http Rest
RPC最主要的缺陷就是服務(wù)提供方和調(diào)用方式之間依賴太強(qiáng),我們需要為每一個(gè)微服務(wù)進(jìn)行接口的定義,并通過(guò)持續(xù)繼承發(fā)布,需要嚴(yán)格的版本控制才不會(huì)出現(xiàn)服務(wù)提供和調(diào)用之間因?yàn)榘姹静煌a(chǎn)生的沖突
而REST是輕量級(jí)的接口,服務(wù)的提供和調(diào)用不存在代碼之間的耦合,只是通過(guò)一個(gè)約定進(jìn)行規(guī)范,但也有可能出現(xiàn)文檔和接口不一致而導(dǎo)致的服務(wù)集成問(wèn)題,但可以通過(guò)swagger工具整合,是代碼和文檔一體化解決,所以REST在分布式環(huán)境下比RPC更加靈活
這也是為什么當(dāng)當(dāng)網(wǎng)的DubboX在對(duì)Dubbo的增強(qiáng)中增加了對(duì)REST的支持的原因
文檔質(zhì)量和社區(qū)活躍度
SpringCloud社區(qū)活躍度遠(yuǎn)高于Dubbo,畢竟由于梁飛團(tuán)隊(duì)的原因?qū)е翫ubbo停止更新迭代五年,而中小型公司無(wú)法承擔(dān)技術(shù)開(kāi)發(fā)的成本導(dǎo)致Dubbo社區(qū)嚴(yán)重低落,而SpringCloud異軍突起,迅速占領(lǐng)了微服務(wù)的市場(chǎng),背靠Spring混的風(fēng)生水起
Dubbo經(jīng)過(guò)多年的積累文檔相當(dāng)成熟,對(duì)于微服務(wù)的架構(gòu)體系各個(gè)公司也有穩(wěn)定的現(xiàn)狀
5. SpringBoot和SpringCloud
SpringBoot是Spring推出用于解決傳統(tǒng)框架配置文件冗余,裝配組件繁雜的基于Maven的解決方案,旨在快速搭建單個(gè)微服務(wù)
而SpringCloud專注于解決各個(gè)微服務(wù)之間的協(xié)調(diào)與配置,服務(wù)之間的通信,熔斷,負(fù)載均衡等
技術(shù)維度并相同,并且SpringCloud是依賴于SpringBoot的,而SpringBoot并不是依賴與SpringCloud,甚至還可以和Dubbo進(jìn)行優(yōu)秀的整合開(kāi)發(fā)
總結(jié):
SpringBoot專注于快速方便的開(kāi)發(fā)單個(gè)個(gè)體的微服務(wù)
SpringCloud是關(guān)注全局的微服務(wù)協(xié)調(diào)整理治理框架,整合并管理各個(gè)微服務(wù),為各個(gè)微服務(wù)之間提供,配置管理,服務(wù)發(fā)現(xiàn),斷路器,路由,事件總線等集成服務(wù)
SpringBoot不依賴于SpringCloud,SpringCloud依賴于SpringBoot,屬于依賴關(guān)系
SpringBoot專注于快速,方便的開(kāi)發(fā)單個(gè)的微服務(wù)個(gè)體,SpringCloud關(guān)注全局的服務(wù)治理框架
6. 微服務(wù)之間是如何獨(dú)立通訊的
1.遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Invocation):
也就是我們常說(shuō)的服務(wù)的注冊(cè)與發(fā)現(xiàn)
直接通過(guò)遠(yuǎn)程過(guò)程調(diào)用來(lái)訪問(wèn)別的service。
優(yōu)點(diǎn):
簡(jiǎn)單卑雁,常見(jiàn),因?yàn)闆](méi)有中間件代理募书,系統(tǒng)更簡(jiǎn)單
缺點(diǎn):
只支持請(qǐng)求/響應(yīng)的模式,不支持別的测蹲,比如通知莹捡、請(qǐng)求/異步響應(yīng)、發(fā)布/訂閱弛房、發(fā)布/異步響應(yīng)
降低了可用性道盏,因?yàn)榭蛻舳撕头?wù)端在請(qǐng)求過(guò)程中必須都是可用的
2.消息:
使用異步消息來(lái)做服務(wù)間通信。服務(wù)間通過(guò)消息管道來(lái)交換消息文捶,從而通信荷逞。
優(yōu)點(diǎn):
把客戶端和服務(wù)端解耦,更松耦合
提高可用性粹排,因?yàn)橄⒅虚g件緩存了消息种远,直到消費(fèi)者可以消費(fèi)
支持很多通信機(jī)制比如通知、請(qǐng)求/異步響應(yīng)顽耳、發(fā)布/訂閱坠敷、發(fā)布/異步響應(yīng)
缺點(diǎn):
消息中間件有額外的復(fù)雜
7. 負(fù)載均衡的意義是什么?
在計(jì)算中妙同,負(fù)載均衡可以改善跨計(jì)算機(jī),計(jì)算機(jī)集群膝迎,網(wǎng)絡(luò)鏈接粥帚,中央處理單元或磁盤驅(qū)動(dòng)器等多種計(jì)算資源的工作負(fù)載分布。負(fù)載均衡旨在優(yōu)化資源使用限次,最大吞吐量芒涡,最小響應(yīng)時(shí)間并避免任何單一資源的過(guò)載。使用多個(gè)組件進(jìn)行負(fù)載均衡而不是單個(gè)組件可能會(huì)通過(guò)冗余來(lái)提高可靠性和可用性卖漫。負(fù)載平衡通常涉及專用軟件或硬件费尽,例如多層交換機(jī)或域名系統(tǒng)服務(wù)進(jìn)程。
8. springcloud如何實(shí)現(xiàn)服務(wù)的注冊(cè)?
1.服務(wù)發(fā)布時(shí)羊始,指定對(duì)應(yīng)的服務(wù)名,將服務(wù)注冊(cè)到 注冊(cè)中心(eureka zookeeper)
2.注冊(cè)中心加@EnableEurekaServer,服務(wù)用@EnableDiscoveryClient旱幼,然后用ribbon或feign進(jìn)行服務(wù)直接的調(diào)用發(fā)現(xiàn)。
9. 什么是服務(wù)熔斷?什么是服務(wù)降級(jí)
在復(fù)雜的分布式系統(tǒng)中,微服務(wù)之間的相互調(diào)用,有可能出現(xiàn)各種各樣的原因?qū)е路?wù)的阻塞,在高并發(fā)場(chǎng)景下,服務(wù)的阻塞意味著線程的阻塞,導(dǎo)致當(dāng)前線程不可用,服務(wù)器的線程全部阻塞,導(dǎo)致服務(wù)器崩潰,由于服務(wù)之間的調(diào)用關(guān)系是同步的,會(huì)對(duì)整個(gè)微服務(wù)系統(tǒng)造成服務(wù)雪崩
為了解決某個(gè)微服務(wù)的調(diào)用響應(yīng)時(shí)間過(guò)長(zhǎng)或者不可用進(jìn)而占用越來(lái)越多的系統(tǒng)資源引起雪崩效應(yīng)就需要進(jìn)行服務(wù)熔斷和服務(wù)降級(jí)處理突委。
所謂的服務(wù)熔斷指的是某個(gè)服務(wù)故障或異常一起類似顯示世界中的“保險(xiǎn)絲"當(dāng)某個(gè)異常條件被觸發(fā)就直接熔斷整個(gè)服務(wù)柏卤,而不是一直等到此服務(wù)超時(shí)。
服務(wù)熔斷就是相當(dāng)于我們電閘的保險(xiǎn)絲,一旦發(fā)生服務(wù)雪崩的,就會(huì)熔斷整個(gè)服務(wù),通過(guò)維護(hù)一個(gè)自己的線程池,當(dāng)線程達(dá)到閾值的時(shí)候就啟動(dòng)服務(wù)降級(jí),如果其他請(qǐng)求繼續(xù)訪問(wèn)就直接返回fallback的默認(rèn)值
10. 微服務(wù)的優(yōu)缺點(diǎn)分別是什么?說(shuō)下你在項(xiàng)目開(kāi)發(fā)中碰到的坑
優(yōu)點(diǎn)
每一個(gè)服務(wù)足夠內(nèi)聚,代碼容易理解
開(kāi)發(fā)效率提高,一個(gè)服務(wù)只做一件事
微服務(wù)能夠被小團(tuán)隊(duì)單獨(dú)開(kāi)發(fā)
微服務(wù)是松耦合的,是有功能意義的服務(wù)
可以用不同的語(yǔ)言開(kāi)發(fā),面向接口編程
易于與第三方集成
微服務(wù)只是業(yè)務(wù)邏輯的代碼,不會(huì)和HTML,CSS或者其他界面組合
開(kāi)發(fā)中,兩種開(kāi)發(fā)模式
前后端分離
全棧工程師
可以靈活搭配,連接公共庫(kù)/連接獨(dú)立庫(kù)
缺點(diǎn)
分布式系統(tǒng)的負(fù)責(zé)性
多服務(wù)運(yùn)維難度,隨著服務(wù)的增加,運(yùn)維的壓力也在增大
系統(tǒng)部署依賴
服務(wù)間通信成本
數(shù)據(jù)一致性
系統(tǒng)集成測(cè)試
性能監(jiān)控
11. 你所知道的微服務(wù)技術(shù)棧鸯两?
維度(springcloud)
服務(wù)開(kāi)發(fā):springboot spring springmvc
服務(wù)配置與管理:Netfix公司的Archaiusm ,阿里的Diamond
服務(wù)注冊(cè)與發(fā)現(xiàn):Eureka,Zookeeper
服務(wù)調(diào)用:Rest RPC gRpc
服務(wù)熔斷器:Hystrix
服務(wù)負(fù)載均衡:Ribbon Nginx
服務(wù)接口調(diào)用:Fegin
消息隊(duì)列:Kafka Rabbitmq activemq
服務(wù)配置中心管理:SpringCloudConfig
服務(wù)路由(API網(wǎng)關(guān))Zuul
事件消息總線:SpringCloud Bus
12. Eureka和ZooKeeper都可以提供服務(wù)注冊(cè)與發(fā)現(xiàn)的功能,請(qǐng)說(shuō)說(shuō)兩個(gè)的區(qū)別
1.ZooKeeper保證的是CP,Eureka保證的是AP
ZooKeeper在選舉期間注冊(cè)服務(wù)癱瘓,雖然服務(wù)最終會(huì)恢復(fù),但是選舉期間不可用的
Eureka各個(gè)節(jié)點(diǎn)是平等關(guān)系,只要有一臺(tái)Eureka就可以保證服務(wù)可用,而查詢到的數(shù)據(jù)并不是最新的
自我保護(hù)機(jī)制會(huì)導(dǎo)致
Eureka不再?gòu)淖?cè)列表移除因長(zhǎng)時(shí)間沒(méi)收到心跳而應(yīng)該過(guò)期的服務(wù)
Eureka仍然能夠接受新服務(wù)的注冊(cè)和查詢請(qǐng)求,但是不會(huì)被同步到其他節(jié)點(diǎn)(高可用)
當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí),當(dāng)前實(shí)例新的注冊(cè)信息會(huì)被同步到其他節(jié)點(diǎn)中(最終一致性)
Eureka可以很好的應(yīng)對(duì)因網(wǎng)絡(luò)故障導(dǎo)致部分節(jié)點(diǎn)失去聯(lián)系的情況,而不會(huì)像ZooKeeper一樣使得整個(gè)注冊(cè)系統(tǒng)癱瘓
2.ZooKeeper有Leader和Follower角色,Eureka各個(gè)節(jié)點(diǎn)平等
3.ZooKeeper采用過(guò)半數(shù)存活原則,Eureka采用自我保護(hù)機(jī)制解決分區(qū)問(wèn)題
4.Eureka本質(zhì)上是一個(gè)工程,而ZooKeeper只是一個(gè)進(jìn)程
13. eureka自我保護(hù)機(jī)制是什么?
當(dāng)Eureka Server 節(jié)點(diǎn)在短時(shí)間內(nèi)丟失了過(guò)多實(shí)例的連接時(shí)(比如網(wǎng)絡(luò)故障或頻繁啟動(dòng)關(guān)閉客戶端)節(jié)點(diǎn)會(huì)進(jìn)入自我保護(hù)模式闷旧,保護(hù)注冊(cè)信息长豁,不再刪除注冊(cè)數(shù)據(jù)钧唐,故障恢復(fù)時(shí),自動(dòng)退出自我保護(hù)模式匠襟。
14. 什么是Ribbon钝侠?
ribbon是一個(gè)負(fù)載均衡客戶端,可以很好的控制htt和tcp的一些行為酸舍。feign默認(rèn)集成了ribbon帅韧。
15. 什么是feigin?它的優(yōu)點(diǎn)是什么啃勉?
1.feign采用的是基于接口的注解
2.feign整合了ribbon忽舟,具有負(fù)載均衡的能力
3.整合了Hystrix,具有熔斷的能力
使用:
1.添加pom依賴淮阐。
2.啟動(dòng)類添加@EnableFeignClients
3.定義一個(gè)接口@FeignClient(name=“xxx”)指定調(diào)用哪個(gè)服務(wù)
16. Ribbon和Feign的區(qū)別叮阅?
1.Ribbon都是調(diào)用其他服務(wù)的,但方式不同泣特。
2.啟動(dòng)類注解不同浩姥,Ribbon是@RibbonClient feign的是@EnableFeignClients
3.服務(wù)指定的位置不同,Ribbon是在@RibbonClient注解上聲明状您,F(xiàn)eign則是在定義抽象方法的接口中使用@FeignClient聲明勒叠。
4.調(diào)用方式不同兜挨,Ribbon需要自己構(gòu)建http請(qǐng)求,模擬http請(qǐng)求然后使用RestTemplate發(fā)送給其他服務(wù)眯分,步驟相當(dāng)繁瑣拌汇。Feign需要將調(diào)用的方法定義成抽象方法即可。
17. 什么是Spring Cloud Bus?
spring cloud bus 將分布式的節(jié)點(diǎn)用輕量的消息代理連接起來(lái)弊决,它可以用于廣播配置文件的更改或者服務(wù)直接的通訊担猛,也可用于監(jiān)控。
如果修改了配置文件丢氢,發(fā)送一次請(qǐng)求傅联,所有的客戶端便會(huì)重新讀取配置文件。
使用:
1.添加依賴
2.配置rabbimq
18. 什么是Hystrix?
防雪崩利器疚察,具備服務(wù)降級(jí)蒸走,服務(wù)熔斷,依賴隔離貌嫡,監(jiān)控(Hystrix Dashboard)
服務(wù)降級(jí):
雙十一 提示 哎喲喂比驻,被擠爆了。 app秒殺 網(wǎng)絡(luò)開(kāi)小差了岛抄,請(qǐng)稍后再試别惦。
優(yōu)先核心服務(wù),非核心服務(wù)不可用或弱可用夫椭。通過(guò)HystrixCommand注解指定掸掸。
fallbackMethod(回退函數(shù))中具體實(shí)現(xiàn)降級(jí)邏輯。
19. springcloud斷路器作用?
當(dāng)一個(gè)服務(wù)調(diào)用另一個(gè)服務(wù)由于網(wǎng)絡(luò)原因或自身原因出現(xiàn)問(wèn)題蹭秋,調(diào)用者就會(huì)等待被調(diào)用者的響應(yīng) 當(dāng)更多的服務(wù)請(qǐng)求到這些資源導(dǎo)致更多的請(qǐng)求等待扰付,發(fā)生連鎖效應(yīng)(雪崩效應(yīng))
斷路器有完全打開(kāi)狀態(tài):一段時(shí)間內(nèi) 達(dá)到一定的次數(shù)無(wú)法調(diào)用 并且多次監(jiān)測(cè)沒(méi)有恢復(fù)的跡象 斷路器完全打開(kāi) 那么下次請(qǐng)求就不會(huì)請(qǐng)求到該服務(wù)
半開(kāi):短時(shí)間內(nèi) 有恢復(fù)跡象 斷路器會(huì)將部分請(qǐng)求發(fā)給該服務(wù),正常調(diào)用時(shí) 斷路器關(guān)閉
關(guān)閉:當(dāng)服務(wù)一直處于正常狀態(tài) 能正常調(diào)用
20. 什么是SpringCloudConfig?
在分布式系統(tǒng)中仁讨,由于服務(wù)數(shù)量巨多羽莺,為了方便服務(wù)配置文件統(tǒng)一管理,實(shí)時(shí)更新洞豁,所以需要分布式配置中心組件盐固。在Spring Cloud中,有分布式配置中心組件spring cloud config 丈挟,它支持配置服務(wù)放在配置服務(wù)的內(nèi)存中(即本地)刁卜,也支持放在遠(yuǎn)程Git倉(cāng)庫(kù)中。在spring cloud config 組件中礁哄,分兩個(gè)角色长酗,一是config server,二是config client桐绒。
使用:
1夺脾、添加pom依賴
2之拨、配置文件添加相關(guān)配置
3、啟動(dòng)類添加注解@EnableConfigServer
21. 架構(gòu)咧叭?
在微服務(wù)架構(gòu)中蚀乔,需要幾個(gè)基礎(chǔ)的服務(wù)治理組件,包括服務(wù)注冊(cè)與發(fā)現(xiàn)菲茬、服務(wù)消費(fèi)吉挣、負(fù)載均衡、斷路器婉弹、智能路由睬魂、配置管理等,由這幾個(gè)基礎(chǔ)組件相互協(xié)作镀赌,共同組建了一個(gè)簡(jiǎn)單的微服務(wù)系統(tǒng)
在Spring Cloud微服務(wù)系統(tǒng)中氯哮,一種常見(jiàn)的負(fù)載均衡方式是,客戶端的請(qǐng)求首先經(jīng)過(guò)負(fù)載均衡(zuul商佛、Ngnix)喉钢,再到達(dá)服務(wù)網(wǎng)關(guān)(zuul集群),然后再到具體的服良姆。肠虽,服務(wù)統(tǒng)一注冊(cè)到高可用的服務(wù)注冊(cè)中心集群,服務(wù)的所有的配置文件由配置服務(wù)管理玛追,配置服務(wù)的配置文件放在git倉(cāng)庫(kù)税课,方便開(kāi)發(fā)人員隨時(shí)改配置。
以上就是二十一到SpringCloud面試題及答案豹缀,當(dāng)你被面試官問(wèn)到SpringCloud問(wèn)題時(shí)希望這篇文章能對(duì)你有幫助伯复。
下面是一些資料截圖慨代,需要獲取更多學(xué)習(xí)資料的讀者朋友們可以關(guān)注我邢笙,私信“資料”免費(fèi)領(lǐng)取