說自己熟悉 Spring Cloud 這些面試題你會(huì)嗎

問題一:什么是Spring Cloud?

Spring cloud流應(yīng)用程序啟動(dòng)器是基于Spring Boot的Spring集成應(yīng)用程序,提供與外部系統(tǒng)的集成。Spring cloud Task,一個(gè)生命周期短暫的微服務(wù)框架,用于快速構(gòu)建執(zhí)行有限數(shù)據(jù)處理的應(yīng)用程序。

問題二:使用Spring Cloud有什么優(yōu)勢?

使用Spring Boot開發(fā)分布式微服務(wù)時(shí),我們面臨以下問題

  1. 與分布式系統(tǒng)相關(guān)的復(fù)雜性-這種開銷包括網(wǎng)絡(luò)問題,延遲開銷,帶寬問題,安全問題。
  2. 服務(wù)發(fā)現(xiàn)-服務(wù)發(fā)現(xiàn)工具管理群集中的流程和服務(wù)如何查找和互相交談。它涉及一個(gè)服務(wù)目錄,在該目錄中注冊服務(wù),然后能夠查找并連接到該目錄中的服務(wù)。
  3. 冗余-分布式系統(tǒng)中的冗余問題。
  4. 負(fù)載平衡 --負(fù)載平衡改善跨多個(gè)計(jì)算資源的工作負(fù)荷,諸如計(jì)算機(jī),計(jì)算機(jī)集群,網(wǎng)絡(luò)鏈路,中央處理單元,或磁盤驅(qū)動(dòng)器的分布。
  5. 性能-問題 由于各種運(yùn)營開銷導(dǎo)致的性能問題。
  6. 部署復(fù)雜性-Devops技能的要求。

問題三:服務(wù)注冊和發(fā)現(xiàn)是什么意思?Spring Cloud如何實(shí)現(xiàn)?

當(dāng)我們開始一個(gè)項(xiàng)目時(shí),我們通常在屬性文件中進(jìn)行所有的配置。隨著越來越多的服務(wù)開發(fā)和部署,添加和修改這些屬性變得更加復(fù)雜。有些服務(wù)可能會(huì)下降,而某些位置可能會(huì)發(fā)生變化。手動(dòng)更改屬性可能會(huì)產(chǎn)生問題。 Eureka服務(wù)注冊和發(fā)現(xiàn)可以在這種情況下提供幫助。由于所有服務(wù)都在Eureka服務(wù)器上注冊并通過調(diào)用Eureka服務(wù)器完成查找,因此無需處理服務(wù)地點(diǎn)的任何更改和處理。

問題四:負(fù)載平衡的意義什么?

在計(jì)算中,負(fù)載平衡可以改善跨計(jì)算機(jī),計(jì)算機(jī)集群,網(wǎng)絡(luò)鏈接,中央處理單元或磁盤驅(qū)動(dòng)器等多種計(jì)算資源的工作負(fù)載分布。負(fù)載平衡旨在優(yōu)化資源使用,最大化吞吐量,最小化響應(yīng)時(shí)間并避免任何單一資源的過載。使用多個(gè)組件進(jìn)行負(fù)載平衡而不是單個(gè)組件可能會(huì)通過冗余來提高可靠性和可用性。負(fù)載平衡通常涉及專用軟件或硬件,例如多層交換機(jī)或域名系統(tǒng)服務(wù)器進(jìn)程。

問題五:什么是Hystrix?它如何實(shí)現(xiàn)容錯(cuò)?

Hystrix是一個(gè)延遲和容錯(cuò)庫,旨在隔離遠(yuǎn)程系統(tǒng),服務(wù)和第三方庫的訪問點(diǎn),當(dāng)出現(xiàn)故障是不可避免的故障時(shí),停止級(jí)聯(lián)故障并在復(fù)雜的分布式系統(tǒng)中實(shí)現(xiàn)彈性。

通常對于使用微服務(wù)架構(gòu)開發(fā)的系統(tǒng),涉及到許多微服務(wù)。這些微服務(wù)彼此協(xié)作。

思考以下微服務(wù)

假設(shè)如果上圖中的微服務(wù)9失敗了,那么使用傳統(tǒng)方法我們將傳播一個(gè)異常。但這仍然會(huì)導(dǎo)致整個(gè)系統(tǒng)崩潰。

隨著微服務(wù)數(shù)量的增加,這個(gè)問題變得更加復(fù)雜。微服務(wù)的數(shù)量可以高達(dá)1000.這是hystrix出現(xiàn)的地方 我們將使用Hystrix在這種情況下的Fallback方法功能。我們有兩個(gè)服務(wù)employee-consumer使用由employee-consumer公開的服務(wù)。

簡化圖如下所示

現(xiàn)在假設(shè)由于某種原因,employee-producer公開的服務(wù)會(huì)拋出異常。我們在這種情況下使用Hystrix定義了一個(gè)回退方法。這種后備方法應(yīng)該具有與公開服務(wù)相同的返回類型。如果暴露服務(wù)中出現(xiàn)異常,則回退方法將返回一些值。

問題六:什么是Hystrix斷路器?我們需要它嗎?

由于某些原因,employee-consumer公開服務(wù)會(huì)引發(fā)異常。在這種情況下使用Hystrix我們定義了一個(gè)回退方法。如果在公開服務(wù)中發(fā)生異常,則回退方法返回一些默認(rèn)值。

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

問題七:什么是Netflix Feign?它的優(yōu)點(diǎn)是什么?

Feign是受到Retrofit,JAXRS-2.0和WebSocket啟發(fā)的java客戶端聯(lián)編程序。Feign的第一個(gè)目標(biāo)是將約束分母的復(fù)雜性統(tǒng)一到http apis,而不考慮其穩(wěn)定性。在employee-consumer的例子中,我們使用了employee-producer使用REST模板公開的REST服務(wù)。

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

  1. 使用功能區(qū)進(jìn)行負(fù)載平衡。
  2. 獲取服務(wù)實(shí)例,然后獲取基本URL。
  3. 利用REST模板來使用服務(wù)。 前面的代碼如下
@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這樣的例外的機(jī)會(huì),并不是最優(yōu)的。我們將看到如何使用Netflix Feign使呼叫變得更加輕松和清潔。如果Netflix Ribbon依賴關(guān)系也在類路徑中,那么Feign默認(rèn)也會(huì)負(fù)責(zé)負(fù)載平衡。

問題八:什么是Spring Cloud Bus?我們需要它嗎?

考慮以下情況:我們有多個(gè)應(yīng)用程序使用Spring Cloud Config讀取屬性,而Spring Cloud Config從GIT讀取這些屬性。

下面的例子中多個(gè)員工生產(chǎn)者模塊從Employee Config Module獲取Eureka注冊的財(cái)產(chǎn)。

如果假設(shè)GIT中的Eureka注冊屬性更改為指向另一臺(tái)Eureka服務(wù)器,會(huì)發(fā)生什么情況。在這種情況下,我們將不得不重新啟動(dòng)服務(wù)以獲取更新的屬性。

還有另一種使用執(zhí)行器端點(diǎn)/刷新的方式。但是我們將不得不為每個(gè)模塊單獨(dú)調(diào)用這個(gè)url。例如,如果Employee Producer1部署在端口8080上,則調(diào)用 http:// localhost:8080 / refresh。同樣對于Employee Producer2 http:// localhost:8081 / refresh等等。這又很麻煩。這就是Spring Cloud Bus發(fā)揮作用的地方。

Spring Cloud Bus提供了跨多個(gè)實(shí)例刷新配置的功能。因此,在上面的示例中,如果我們刷新Employee Producer1,則會(huì)自動(dòng)刷新所有其他必需的模塊。如果我們有多個(gè)微服務(wù)啟動(dòng)并運(yùn)行,這特別有用。這是通過將所有微服務(wù)連接到單個(gè)消息代理來實(shí)現(xiàn)的。無論何時(shí)刷新實(shí)例,此事件都會(huì)訂閱到偵聽此代理的所有微服務(wù),并且它們也會(huì)刷新。可以通過使用端點(diǎn)/總線/刷新來實(shí)現(xiàn)對任何單個(gè)實(shí)例的刷新。

如果對本文的內(nèi)容有疑問,請?jiān)谙旅娴脑u(píng)論系統(tǒng)中留言,謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容