1.什么是Spring Cloud
這個(gè)可以從我們服務(wù)的一個(gè)演變過程來說起:單體->集群->soa->微服務(wù)渣窜,而微服務(wù)它只是一種架構(gòu)思想布讹,我們?yōu)榱藢?shí)現(xiàn)這種思想枢里,就需要技術(shù)落地账锹,而springcloud就應(yīng)運(yùn)而生雁比,他是一個(gè)用來治理微服務(wù)的框架淳蔼,單個(gè)服務(wù)的實(shí)現(xiàn)就要用到SpringBoot侧蘸。SpringCloud里面有幾個(gè)比較重要的組件 Eureka 注冊中心 、zuul網(wǎng)關(guān)鹉梨、config配置中心讳癌、feign服務(wù)與服務(wù)之間的調(diào)用、ribbon負(fù)載均衡
2.什么是微服務(wù)
微服務(wù)是一種架構(gòu)思想存皂,隨著單體項(xiàng)目的不斷更新迭代晌坤,包含的業(yè)務(wù)功能代碼越來越多,導(dǎo)致編譯部署困難等問題,因此以業(yè)務(wù)功能作為邊界將一個(gè)完整服務(wù)拆分成多個(gè)可以獨(dú)立開發(fā)運(yùn)維部署的子服務(wù)泡仗。
優(yōu)點(diǎn):
1.每個(gè)服務(wù)直接足夠內(nèi)聚埋虹,代碼容易理解
2.開發(fā)效率高,一個(gè)服務(wù)只做一件事娩怎,適合小團(tuán)隊(duì)開發(fā)
3.松耦合搔课,有功能意義的服務(wù)。
4.可以用不同語言開發(fā)截亦,面向接口編程爬泥。
5.易于第三方集成
6.微服務(wù)只是業(yè)務(wù)邏輯的代碼,不會和HTML,CSS或其他界面結(jié)合.
7.可以靈活搭配崩瓤,連接公共庫/連接獨(dú)立庫
缺點(diǎn):
1.分布式系統(tǒng)的責(zé)任性
2.多服務(wù)運(yùn)維難度加大袍啡。
3.系統(tǒng)部署依賴,服務(wù)間通信成本却桶,數(shù)據(jù)一致性境输,系統(tǒng)集成測試,性能監(jiān)控颖系。
3.服務(wù)注冊和發(fā)現(xiàn)
隨著我們服務(wù)的增多嗅剖,為了方便統(tǒng)一管理微服務(wù)的通信地址,就有了服務(wù)的注冊和發(fā)現(xiàn)嘁扼;
微服務(wù)在啟動的時(shí)候會向注冊中心提交自己的通信地址清單如:服務(wù)名,ip,端口信粮,在注冊中心會形成一個(gè)微服務(wù)的通信地址列表 --- 這叫服務(wù)注冊
微服務(wù)會定期的從注冊中心拉取一份微服務(wù)通信地址列表緩存到本地。一個(gè)微服務(wù)在向另一個(gè)微服務(wù)發(fā)起調(diào)用的時(shí)候會根據(jù)目標(biāo)服務(wù)的服務(wù)名找到其通信地址清單趁啸,然后基于HTTP協(xié)議向目標(biāo)服務(wù)發(fā)起請求。---這叫服務(wù)發(fā)現(xiàn)
4.SpringBoot和SpringCloud的區(qū)別
SpringBoot專注于快速方便的開發(fā)單個(gè)個(gè)體微服務(wù)不傅。SpringCloud關(guān)注的是服務(wù)與服務(wù)之間的一個(gè)協(xié)調(diào)旅掂,它將SpringBoot開發(fā)的一個(gè)個(gè)單體微服務(wù)整合并管理起來。
SpringBoot可以離開SpringCloud獨(dú)立使用開發(fā)項(xiàng)目访娶, 但是SpringCloud離不開SpringBoot 辞友,屬于依賴的關(guān)系.
5.Spring Cloud 和dubbo區(qū)別
服務(wù)調(diào)用方式 dubbo是RPC springcloud Rest Api
注冊中心,dubbo 是zookeeper springcloud是eureka,也可以是zookeeper
服務(wù)網(wǎng)關(guān),dubbo本身沒有實(shí)現(xiàn)震肮,只能通過其他第三方技術(shù)整合,springcloud有Zuul路由網(wǎng)關(guān)留拾,作為路由服務(wù)器戳晌,進(jìn)行消費(fèi)者的請求分發(fā),springcloud支持?jǐn)嗦菲鳎cgit完美集成配置文件支持版本控制痴柔,事物總線實(shí)現(xiàn)配置文件的更新與服務(wù)自動裝配等等一系列的微服務(wù)架構(gòu)要素沦偎。
模型定義:dubbo將一個(gè)接口定義為一個(gè)服務(wù),SpringCloud將一個(gè)應(yīng)用定義為一個(gè)服務(wù)
6.REST和RPC對比
1.RPC主要的缺陷是服務(wù)提供方和調(diào)用方式之間的依賴太強(qiáng),需要對每一個(gè)微服務(wù)進(jìn)行接口的定義豪嚎,并通過持續(xù)繼承發(fā)布搔驼,嚴(yán)格版本控制才不會出現(xiàn)沖突。
2.REST是輕量級的接口侈询,服務(wù)的提供和調(diào)用不存在代碼之間的耦合舌涨,只需要一個(gè)約定進(jìn)行規(guī)范。
說說Eureka的自我保護(hù)機(jī)制扔字?
當(dāng)一個(gè)服務(wù)未按時(shí)進(jìn)行心跳續(xù)約時(shí)囊嘉,在生產(chǎn)環(huán)境下,因?yàn)榫W(wǎng)絡(luò)延遲等原因革为,此時(shí)就把服務(wù)剔除列表并不妥當(dāng)扭粱,因?yàn)榉?wù)可能沒有宕機(jī)。 Eureka就會把當(dāng)前實(shí)例的注冊信息保護(hù)起來震檩,不予剔除琢蛤。生產(chǎn)環(huán)境下這很有效,保證了大多數(shù)服務(wù)依然可用抛虏。但是有可能會造成一些掛掉的服務(wù)被剔除有延遲博其。
Eureka和ZooKeeper的區(qū)別?
1嘉蕾、ZooKeeper中的節(jié)點(diǎn)服務(wù)掛了就要選舉贺奠,在選舉期間注冊服務(wù)癱瘓,雖然服務(wù)最終會恢復(fù)错忱,但是選舉期間不可用的儡率, 選舉就是該微服務(wù)做了集群,必須有一臺主其他的都是從以清。
2儿普、Eureka各個(gè)節(jié)點(diǎn)是平等關(guān)系,服務(wù)器掛了沒關(guān)系掷倔,只要有一臺Eureka就可以保證服務(wù)可用眉孩,數(shù)據(jù)都是最新的。 如果查詢到的數(shù)據(jù)并不是最新的勒葱,就是因?yàn)镋ureka的自我保護(hù)模式導(dǎo)致的浪汪。
3、Eureka本質(zhì)上是一個(gè)工程凛虽,而ZooKeeper只是一個(gè)進(jìn)程死遭。
4、Eureka可以很好的應(yīng)對因網(wǎng)絡(luò)故障導(dǎo)致部分節(jié)點(diǎn)失去聯(lián)系的情況凯旋,而不會像ZooKeeper 一樣使得整個(gè)注冊系統(tǒng)癱瘓呀潭。
5钉迷、ZooKeeper保證的是CP,Eureka保證的是AP
CAP解釋:
C:一致性Consistency (取舍:強(qiáng)一致性钠署、單調(diào)一致性糠聪、會話一致性、最終一致性谐鼎、弱一致性)
A:可用性 Availability
P:分區(qū)容錯性Partition tolerance
7.負(fù)載均衡的意義
通俗易懂的理解:
集群:是把一個(gè)的事情交給多個(gè)人去做舰蟆,假如要做1000個(gè)產(chǎn)品給一個(gè)人做要10天,叫10個(gè)人做就是一天该面;
負(fù)載均衡:用來控制集群夭苗,優(yōu)化資源使用,最大化吞吐量隔缀,最小化響應(yīng)時(shí)間并避免任何單一資源的過載题造,可以使多個(gè)組件達(dá)到負(fù)載平衡。
在SpringCloud里面可以使用ribbon來實(shí)現(xiàn)負(fù)載均衡(feign默認(rèn)集成了ribbon)猾瘸。
常見的幾種Ribbon的負(fù)載均衡策略
輪詢 :將所有的請求均勻分配
權(quán)重 :對性能較好的后端服務(wù)器設(shè)置較高的權(quán)重界赔,承擔(dān)更多的鏈接負(fù)載。
隨機(jī)Random:將請求隨機(jī)分配
hash:通過ip url等信息計(jì)算hash值牵触,相同的請求會請求到同一個(gè)后端服務(wù)器中
8.什么是Hystrix
在分布式系統(tǒng)淮悼,我們一定會依賴各種服務(wù),那么這些個(gè)服務(wù)一定會出現(xiàn)失敗的情況揽思,就會導(dǎo)致雪崩袜腥,Hystrix就是這樣一個(gè)保證服務(wù)健壯性的工具,防雪崩利器钉汗,它具有服務(wù)降級羹令,服務(wù)熔斷,服務(wù)隔離损痰,監(jiān)控等一些防止雪崩的技術(shù)福侈。
Hystrix有四種防雪崩方式:
服務(wù)降級:接口調(diào)用失敗就調(diào)用本地的方法返回一個(gè)空
服務(wù)熔斷:接口調(diào)用失敗就會進(jìn)入調(diào)用接口提前定義好的一個(gè)熔斷的方法,返回錯誤信息
服務(wù)隔離:隔離服務(wù)之間相互影響
服務(wù)監(jiān)控:在服務(wù)發(fā)生調(diào)用時(shí),會將每秒請求數(shù)卢未、成功請求數(shù)等運(yùn)行指標(biāo)記錄下來肪凛。
9.什么是服務(wù)熔斷和服務(wù)降級
服務(wù)熔斷:
熔斷機(jī)制是應(yīng)對雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制。
當(dāng)某個(gè)微服務(wù)不可用或者響應(yīng)時(shí)間太長時(shí)辽社,會進(jìn)行服務(wù)降級伟墙,進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用,快速返回“錯誤”的響應(yīng)信息滴铅。當(dāng)檢測到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后恢復(fù)調(diào)用鏈路远荠。
在SpringCloud框架里熔斷機(jī)制通過Hystrix實(shí)現(xiàn),Hystrix會監(jiān)控微服務(wù)間調(diào)用的狀況失息,當(dāng)失敗的調(diào)用到一定閾值譬淳,缺省是5秒內(nèi)調(diào)用20次,如果失敗盹兢,就會啟動熔斷機(jī)制邻梆。
服務(wù)降級:
服務(wù)降級,一般是從整體負(fù)荷考慮绎秒。就是當(dāng)某個(gè)服務(wù)熔斷之后浦妄,服務(wù)器將不再被調(diào)用,此時(shí)客戶端可以自己準(zhǔn)備一個(gè)本地的fallback回調(diào)见芹,返回一個(gè)缺省值剂娄。
10.什么是服務(wù)雪崩效應(yīng)?
雪崩效應(yīng)是在大型互聯(lián)網(wǎng)項(xiàng)目中,當(dāng)某個(gè)服務(wù)發(fā)生宕機(jī)時(shí)玄呛,調(diào)用這個(gè)服務(wù)的其他服務(wù)也會發(fā)生宕機(jī)阅懦,大型項(xiàng)目的微服務(wù)之間的調(diào)用是互通的,這樣就會將服務(wù)的不可用逐步擴(kuò)大到各個(gè)其他服務(wù)中徘铝,從而使整個(gè)項(xiàng)目的服務(wù)宕機(jī)崩潰耳胎。
11.什么是feigin
feign是用來處理我們服務(wù)與服務(wù)之間調(diào)用的,它整合了ribbon惕它,具有負(fù)載均衡的能力怕午,同時(shí)也整合了Hystrix,具有熔斷的能力
12.Ribbon和Feign的區(qū)別
1.Ribbon都是調(diào)用其他服務(wù)的淹魄,但方式不同郁惜。
2.啟動類注解不同,Ribbon是@RibbonClient甲锡,feign的是@EnableFeignClients
3.服務(wù)指定的位置不同兆蕉,Ribbon是在@RibbonClient注解上聲明,F(xiàn)eign則是在定義抽象方法的接口中使用@FeignClient聲明搔体。
4.調(diào)用方式不同恨樟,Ribbon需要自己構(gòu)建http請求,模擬http請求然后使用RestTemplate發(fā)送給其他服務(wù)疚俱,步驟相當(dāng)繁瑣劝术。Feign需要將調(diào)用的方法定義成抽象方法即可。
13.什么是SpringCloud Bus
spring cloud bus 將分布式的節(jié)點(diǎn)用輕量的消息代理連接起來呆奕,它可以用于廣播配置文件的更改或者服務(wù)直接的通訊养晋,也可用于監(jiān)控。
如果修改了配置文件梁钾,發(fā)送一次請求绳泉,所有的客戶端便會重新讀取配置文件。
14.springcloud斷路器
當(dāng)一個(gè)服務(wù)調(diào)用另一個(gè)服務(wù)由于網(wǎng)絡(luò)原因或自身原因出現(xiàn)問題姆泻,調(diào)用者就會等待被調(diào)用者的響應(yīng) 當(dāng)更多的服務(wù)請求到這些資源導(dǎo)致更多的請求等待零酪,發(fā)生連鎖效應(yīng)(雪崩效應(yīng))冒嫡。底層服務(wù)出現(xiàn)故障可能導(dǎo)致用戶級聯(lián)故障。當(dāng)調(diào)用特定服務(wù)達(dá)到一定閾值時(shí)(Hystrix中的默認(rèn)值為5秒內(nèi)的20次故障)四苇,電路打開孝凌,不進(jìn)行通話。在開路的情況下月腋,可以使用備用的方法進(jìn)行處理蟀架。
斷路器有完全打開狀態(tài):一段時(shí)間內(nèi) 達(dá)到一定的次數(shù)無法調(diào)用 并且多次監(jiān)測沒有恢復(fù)的跡象 斷路器完全打開 那么下次請求就不會請求到該服務(wù)
半開:短時(shí)間內(nèi) 有恢復(fù)跡象 斷路器會將部分請求發(fā)給該服務(wù),正常調(diào)用時(shí) 斷路器關(guān)閉
關(guān)閉:當(dāng)服務(wù)一直處于正常狀態(tài) 能正常調(diào)用
15.什么是SpringCloud Config
在分布式系統(tǒng)中榆骚,由于服務(wù)數(shù)量巨多片拍,為了方便服務(wù)配置文件統(tǒng)一管理,實(shí)時(shí)更新妓肢,所以需要分布式配置中心組件捌省。在Spring Cloud中,有分布式配置中心組件spring cloud config 职恳,它支持配置服務(wù)放在配置服務(wù)的內(nèi)存中(即本地)所禀,也支持放在遠(yuǎn)程Git倉庫中。在spring cloud config 組件中放钦,分兩個(gè)角色色徘,一是config server,二是config client操禀。
16.什么是zuul?
zuul是SpringCloud提供的路由方案褂策,他會根據(jù)請求的路徑不同,網(wǎng)關(guān)會定位到指定的微服務(wù)颓屑,并代理請求到不同的微服務(wù)接口斤寂,他對外隱蔽了微服務(wù)的真正接口地址。
zuul的工作流程?
在Spring Cloud Netflix中揪惦,Zuul巧妙的整合了Eureka來實(shí)現(xiàn)面向服務(wù)的路由遍搞。
實(shí)際上,API網(wǎng)關(guān)將自己注冊到Eureka服務(wù)注冊中心上器腋,也會從注冊中心獲取所有服務(wù)以及它們的實(shí)例清單溪猿。在Eureka的幫助下,API網(wǎng)關(guān)已經(jīng)維護(hù)了系統(tǒng)中所有serviceId與實(shí)例地址的映射關(guān)系纫塌。當(dāng)有外部請求到達(dá)API網(wǎng)關(guān)的時(shí)候诊县,根據(jù)請求的URL找到最匹配的path,API網(wǎng)關(guān)就可以知道要將該請求"路由"到哪個(gè)具體的serviceId上去措左。 最終通過Ribbon的負(fù)載均衡策略實(shí)現(xiàn)請求的路由依痊。
17.什么是SpringCloud Gateway
Spring Cloud Gateway是Spring Cloud官方推出的第二代網(wǎng)關(guān)框架,取代Zuul網(wǎng)關(guān)怎披。網(wǎng)關(guān)作為流量的胸嘁,在微服務(wù)系統(tǒng)中有著非常作用瓶摆,網(wǎng)關(guān)常見的功能有路由轉(zhuǎn)發(fā)、權(quán)限校驗(yàn)缴渊、限流控制等作用赏壹。