前言
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用 Spring Boot 的開發風格做到一鍵啟動和部署。Spring Cloud 並沒有重復制造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過 Spring Boot 風格進行再封裝屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。
小編分享的這份Java后端開發面試總結包含了JavaOOP、Java集合容器、Java異常、並發編程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL數據庫、消息中間件MQ、Dubbo、Linux、ZooKeeper、 分布式&數據結構與算法等26個專題技術點,都是小編在各個大廠總結出來的面試真題,已經有很多粉絲靠這份PDF拿下眾多大廠的offer,今天在這里總結分享給到大家!【已完結】
完整版Java面試題地址:2021最新面試題合集集錦。
一、 什么是微服務架構
1. 什么是微服務架構
微服務架構就是將單體的應用程序分成多個應用程序,這多個應用程序就成為微服務,每個微服務運行在自己的進程中,並使用輕量級的機制通信。這些服務圍繞業務能力來划分,並通過自動化部署機制來獨立部署。這些服務可以使用不同的編程語言,不同數據庫,以保證最低限度的集中式管理。
2. 為什么需要學習Spring Cloud
- 首先springcloud基於spingboot的優雅簡潔,可還記得我們被無數xml支配的恐懼?可還記得 springmvc,mybatis錯綜復雜的配置,有了spingboot,這些東西都不需要了,spingboot好處不 再贅訴,springcloud就基於SpringBoot把市場上優秀的服務框架組合起來,通過Spring Boot風格進行再封裝屏蔽掉了復雜的配置和實現原理
- 什么叫做開箱即用?即使是當年的黃金搭檔dubbo+zookeeper下載配置起來也是頗費心神的!而springcloud完成這些只需要一個jar的依賴就可以了!
- springcloud大多數子模塊都是直擊痛點,像zuul解決的跨域,fegin解決的負載均衡,hystrix的熔斷機制等等等等
3. Spring Cloud 是什么
- Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、智能路由、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。
- Spring Cloud並沒有重復制造輪子,它只是將各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。
4. SpringCloud的優缺點
優點:
1.耦合度比較低。不會影響其他模塊的開發。
2.減輕團隊的成本,可以並行開發,不用關注其他人怎么開發,先關注自己的開發。
3.配置比較簡單,基本用注解就能實現,不用使用過多的配置文件。
4.微服務跨平台的,可以用任何一種語言開發。
5.每個微服務可以有自己的獨立的數據庫也有用公共的數據庫。
6.直接寫后端的代碼,不用關注前端怎么開發,直接寫自己的后端代碼即可,然后暴露接口,通過組件進行服務通信。
缺點:
1.部署比較麻煩,給運維工程師帶來一定的麻煩。
2.針對數據的管理比麻煩,因為微服務可以每個微服務使用一個數據庫。
3.系統集成測試比較麻煩
4.性能的監控比較麻煩。【最好開發一個大屏監控系統】
- 總的來說優點大過於缺點,目前看來Spring Cloud是一套非常完善的分布式框架,目前很多企業開始用微服務、Spring Cloud的優勢是顯而易見的。因此對於想研究微服務架構的同學來說,學習Spring Cloud是一個不錯的選擇。
5. SpringBoot和SpringCloud的區別?
- SpringBoot專注於快速方便的開發單個個體微服務。
- SpringCloud是關注全局的微服務協調整理治理框架,它將SpringBoot開發的一個個單體微服務整合並管理起來,
- 為各個微服務之間提供,配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分布式會話等等集成服務
- SpringBoot可以離開SpringCloud獨立使用開發項目, 但是SpringCloud離不開SpringBoot ,屬於依賴的關系
- SpringBoot專注於快速、方便的開發單個微服務個體,SpringCloud關注全局的服務治理框架。
6. Spring Cloud和SpringBoot版本對應關系
7. SpringCloud由什么組成
- 這就有很多了,我講幾個開發中最重要的
- Spring Cloud Eureka:服務注冊與發現
- Spring Cloud Zuul:服務網關
- Spring Cloud Ribbon:客戶端負載均衡
- Spring Cloud Feign:聲明性的Web服務客戶端
- Spring Cloud Hystrix:斷路器
- Spring Cloud Confifig:分布式統一配置管理
- 等20幾個框架,開源一直在更新
8. 使用 Spring Boot 開發分布式微服務時,我們面臨什么問題
- (1)與分布式系統相關的復雜性-這種開銷包括網絡問題,延遲開銷,帶寬問題,安全問題。
- (2)服務發現-服務發現工具管理群集中的流程和服務如何查找和互相交談。它涉及一個服務目錄,在該目錄中注冊服務,然后能夠查找並連接到該目錄中的服務。
- (3)冗余-分布式系統中的冗余問題。
- (4)負載平衡 --負載平衡改善跨多個計算資源的工作負荷,諸如計算機,計算機集群,網絡鏈路,中央處理單元,或磁盤驅動器的分布。
- (5)性能-問題 由於各種運營開銷導致的性能問題。
9. Spring Cloud 和dubbo區別?
- (1)服務調用方式:dubbo是RPC springcloud Rest Api
- (2)注冊中心:dubbo 是zookeeper springcloud是eureka,也可以是zookeeper
- (3)服務網關,dubbo本身沒有實現,只能通過其他第三方技術整合,springcloud有Zuul路由網關,作為路由服務器,進行消費者的請求分發,springcloud支持斷路器,與git完美集成配置文件支持版本控制,事物總線實現配置文件的更新與服務自動裝配等等一系列的微服務架構要素。
二、Eureka
10. 服務注冊和發現是什么意思?Spring Cloud 如何實現?
11. 什么是Eureka
- Eureka作為SpringCloud的服務注冊功能服務器,他是服務注冊中心,系統中的其他服務使用Eureka的客戶端將其連接到Eureka Service中,並且保持心跳,這樣工作人員可以通過EurekaService來監控各個微服務是否運行正常。
12. Eureka怎么實現高可用
- 集群吧,注冊多台Eureka,然后把SpringCloud服務互相注冊,客戶端從Eureka獲取信息時,按照Eureka的順序來訪問。
13. 什么是Eureka的自我保護模式,
- 默認情況下,如果Eureka Service在一定時間內沒有接收到某個微服務的心跳,Eureka Service會進入自我保護模式,在該模式下Eureka Service會保護服務注冊表中的信息,不在刪除注冊表中的數據,當網絡故障恢復后,Eureka Servic 節點會自動退出自我保護模式
14. DiscoveryClient的作用
- 可以從注冊中心中根據服務別名獲取注冊的服務器信息。
15. Eureka和ZooKeeper都可以提供服務注冊與發現的功能,請說說兩個的區別
- ZooKeeper中的節點服務掛了就要選舉 在選舉期間注冊服務癱瘓,雖然服務最終會恢復,但是選舉期間不可用的, 選舉就是改微服務做了集群,必須有一台主其他的都是從
- Eureka各個節點是平等關系,服務器掛了沒關系,只要有一台Eureka就可以保證服務可用,數據都是最新的。 如果查詢到的數據並不是最新的,就是因為Eureka的自我保護模式導致的
- Eureka本質上是一個工程,而ZooKeeper只是一個進程
- Eureka可以很好的應對因網絡故障導致部分節點失去聯系的情況,而不會像ZooKeeper 一樣使得整個注冊系統癱瘓
- ZooKeeper保證的是CP,Eureka保證的是AP
CAP: C:一致性>Consistency; 取舍:(強一致性、單調一致性、會話一致性、最終一致性、弱一致性) A:可用性>Availability; P:分區容錯性>Partition tolerance;
三、Zuul
16. 什么是網關?
- 網關相當於一個網絡服務架構的入口,所有網絡請求必須通過網關轉發到具體的服務。
17. 網關的作用是什么
- 統一管理微服務請求,權限控制、負載均衡、路由轉發、監控、安全控制黑名單和白名單等
18. 什么是Spring Cloud Zuul(服務網關)
19. 網關與過濾器有什么區別
- 網關是對所有服務的請求進行分析過濾,過濾器是對單個服務而言。
20. 常用網關框架有那些?
- Nginx、Zuul、Gateway
21. Zuul與Nginx有什么區別?
- Zuul是java語言實現的,主要為java服務提供網關服務,尤其在微服務架構中可以更加靈活的對網關進行操作。Nginx是使用C語言實現,性能高於Zuul,但是實現自定義操作需要熟悉lua語言,對程序員要求較高,可以使用Nginx做Zuul集群。
22. 既然Nginx可以實現網關?為什么還需要使用Zuul框架
- Zuul是SpringCloud集成的網關,使用Java語言編寫,可以對SpringCloud架構提供更靈活的服務。
23. 如何設計一套API接口
- 考慮到API接口的分類可以將API接口分為開發API接口和內網API接口,內網API接口用於局域網,為內部服務器提供服務。開放API接口用於對外部合作單位提供接口調用,需要遵循Oauth2.0權限認證協議。同時還需要考慮安全性、冪等性等問題。
24. ZuulFilter常用有那些方法
- Run():過濾器的具體業務邏輯
- shouldFilter():判斷過濾器是否有效
- fifilterOrder():過濾器執行順序
- fifilterType():過濾器攔截位置
25. 如何實現動態Zuul網關路由轉發
- 通過path配置攔截請求,通過ServiceId到配置中心獲取轉發的服務列表,Zuul內部使用Ribbon實現本地負載均衡和轉發。
26. Zuul網關如何搭建集群
- 使用Nginx的upstream設置Zuul服務集群,通過location攔截請求並轉發到upstream,默認使用輪詢機制對Zuul集群發送請求。
四、Ribbon
27. 負載平衡的意義什么?
28. Ribbon是什么?
29. Nginx與Ribbon的區別
30. Ribbon底層實現原理
- Ribbon使用discoveryClient從注冊中心讀取目標服務信息,對同一接口請求進行計數,使用%取余算法獲取目標服務集群索引,返回獲取到的目標服務信息。
@LoadBalanced注解的作用
- 開啟客戶端負載均衡。
五、Hystrix
31. 什么是斷路器
32. 什么是 Hystrix?
33. 談談服務雪崩效應
34. 在微服務中,如何保護服務?
35. 服務雪崩效應產生的原因
- 因為Tomcat默認情況下只有一個線程池來維護客戶端發送的所有的請求,這時候某一接口在某一時刻被大量訪問就會占據tomcat線程池中的所有線程,其他請求處於等待狀態,無法連接到服務接口。
36. 談談服務降級、熔斷、服務隔離
37. 服務降級底層是如何實現的?
- Hystrix實現服務降級的功能是通過重寫HystrixCommand中的getFallback()方法,當Hystrix的run方法或construct執行發生錯誤時轉而執行getFallback()方法。
六、Feign
38. 什么是Feign?
- Feign 是一個聲明web服務客戶端,這使得編寫web服務客戶端更容易
- 他將我們需要調用的服務方法定義成抽象方法保存在本地就可以了,不需要自己構建Http請求了,直接調用接口就行了,不過要注意,調用方法要和本地抽象方法的簽名完全一致。
39. SpringCloud有幾種調用接口方式
- Feign
- RestTemplate
40. Ribbon和Feign調用服務的區別
七、Bus
41. 什么是 Spring Cloud Bus?
八、Config
42. 什么是Spring Cloud Config?
43. 分布式配置中心有那些框架?
- Apollo、zookeeper、springcloud confifig。
44. 分布式配置中心的作用?
- 動態變更項目配置信息而不必重新部署項目。
45. SpringCloud Config 可以實現實時刷新嗎?
- springcloud confifig實時刷新采用SpringCloud Bus消息總線。
九、Gateway
46. 什么是Spring Cloud Gateway?
十、 SpringCloud主要項目
47. SpringCloud主要項目
- Spring Cloud的子項目,大致可分成兩類,一類是對現有成熟框架"Spring Boot化"的封裝和抽象,也是數量最多的項目;第二類是開發了一部分分布式系統的基礎設施的實現,如Spring CloudStream扮演的就是kafka, ActiveMQ這樣的角色。
Spring Cloud Config
Spring Cloud Netflix(重點,這些組件用的最多)
Spring Cloud Bus
Spring Cloud Consul
Spring Cloud Security
Spring Cloud Sleuth
Spring Cloud Stream
- 輕量級事件驅動微服務框架,可以使用簡單的聲明式模型來發送及接收消息,主要實現為Apache Kafka及RabbitMQ。
Spring Cloud Task
- Spring Cloud Task的目標是為Spring Boot應用程序提供創建短運行期微服務的功能。在Spring Cloud Task中,我們可以靈活地動態運行任何任務,按需分配資源並在任務完成后檢索結果。 Tasks是Spring Cloud Data Flow中的一個基礎項目,允許用戶將幾乎任何Spring Boot應用程序作為一個短期任務執行。
Spring Cloud Zookeeper
- SpringCloud支持三種注冊方式Eureka, Consul(go語言編寫),zookeeper
- Spring Cloud Zookeeper是基於Apache Zookeeper的服務治理組件。
Spring Cloud Gateway
Spring Cloud OpenFeign
- Feign是一個聲明性的Web服務客戶端。它使編寫Web服務客戶端變得更容易。要使用Feign,我們可以將調用的服務方法定義成抽象方法保存在本地添加一點點注解就可以了,不需要自己構建Http請求了,直接調用接口就行了,不過要注意,調用方法要和本地抽象方法的簽名完全一致。