java面試題之-springcloud

問題一:什麼是Spring Cloud?

Spring cloud流應用程序啓動器是基於Spring Boot的Spring集成應用程序,提供與外部系統的集成。Spring cloud Task,一個生命週期短暫的微服務框架,用於快速構建執行有限數據處理的應用程序。

問題二:使用Spring Cloud有什麼優勢?

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

  1. 與分佈式系統相關的複雜性-這種開銷包括網絡問題,延遲開銷,帶寬問題,安全問題。
  2. 服務發現-服務發現工具管理羣集中的流程和服務如何查找和互相交談。它涉及一個服務目錄,在該目錄中註冊服務,然後能夠查找並連接到該目錄中的服務。
  3. 冗餘-分佈式系統中的冗餘問題。
  4. 負載平衡 --負載平衡改善跨多個計算資源的工作負荷,諸如計算機,計算機集羣,網絡鏈路,中央處理單元,或磁盤驅動器的分佈。
  5. 性能-問題 由於各種運營開銷導致的性能問題。
  6. 部署複雜性-Devops技能的要求。

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

當我們開始一個項目時,我們通常在屬性文件中進行所有的配置。隨着越來越多的服務開發和部署,添加和修改這些屬性變得更加複雜。有些服務可能會下降,而某些位置可能會發生變化。手動更改屬性可能會產生問題。 Eureka服務註冊和發現可以在這種情況下提供幫助。由於所有服務都在Eureka服務器上註冊並通過調用Eureka服務器完成查找,因此無需處理服務地點的任何更改和處理。

問題四:負載平衡的意義什麼?

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

問題五:什麼是Hystrix?它如何實現容錯?

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

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

思考以下微服務

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

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

簡化圖如下所示

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

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

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

如果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註冊的財產。

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章