如何將 Spring Cloud Netflix 框架集成到現有 API 中

sad10a 8年前發布 | 20K 次閱讀 API 分布式/云計算/大數據 Spring Cloud

當前, RESTful API 可能已經在你所在的組織中達到了某種 程度的 成功。當越來越多的微服務或API涌現出來時,API間的依賴也隨之增長,對服務的要求也更多的落在了提供盡可能穩定的API或微服務。通常,這個過程以多實例 運行 及某種形式的負載均衡展開,以滿足需求。

Netflix (OSS) Spring Cloud項目

隨著 Netflix's (OSS) Spring Cloud 項目的流行和成功,或許可以考慮將它集成到那些以任務為關鍵的API里。 Netflix的項目建立在 Spring Boot 框架之上,提供了如下組件:

  • Eureka用于Spring管理下的bean服務發現

  • Zuul處理路由服務,被視為請求的”守門員“

  • Ribbon用于動態路由和負載均衡

  • Hystrix提供了 斷路器功能,以處理無響應的API調用

  • Turbine提供了 關于 Hystrix的全部可用斷路器的 信息

同時推薦使用 Spring Cloud Config ,它把應用配置集中到了一個Git倉庫。

第一步:使用Spring Boot

如果你的API或微服務是在Spring Boot的基礎上構建的,那么你的當前準備已就緒,可以直接進入下節。然而,你的服務很可能并沒有在Spring Boot上 運行 ,如果是這樣,你需要采取一些措施,才能使用Netflix提供給社區的OSS工具。

對于初學者,請參考當前Spring Boot文檔中的 將已有項目轉換到Spring Boot 章節。文中對轉換的過程提供了一些注意事項和建議(文章還指出,將非web應用,如API服務,轉換到Spring Boot會更容易一些)。此時需要將創建ApplicationContext的代碼替換為調用SpringApplication的代碼。Application類需要繼承SpringBootServletInitializer,然后啟用Spring Boot自動配置:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends
SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(
    SpringApplicationBuilder application) {
        return application;
    }
}

可以添加如下的main方法,以啟動應用:

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

對于已有的Servlet應用,如果用的是3.0以上的版本,轉換工作會簡單很多,尤其是用了Spring Servlet初始化工具支持類的。

對于更復雜的應用,需要先進行分析,以決定最佳實踐是否是重新開始一個Spring Boot應用,然后將原有類和方法遷移到這個新應用中。

當你可以啟動Spring Boot應用,并且也驗證過API之后,就可以引入Netflix的組件了。

創建Eureka和Zuul服務器

要添加的第一個服務器是Eureka服務器,它將用于處理服務發現。 Eureka服務器是一個標準的Spring Boot應用程序,使用簡單的main()方法:

@SpringBootApplication
@EnableEurekaServer 
@EnableDiscoveryClient
public class EurekaApplication {
    public static void main(String[] args) { 
        SpringApplication.run(
           EurekaApplication.class, args);
    } 
 }

Zuul服務器將充當網守,或者最終為您的微服務連接主服務器。這里,使用以下main()方法創建另一個標準的Spring Boot應用程序實例:

@SpringBootApplication 
@Controller
@EnableZuulProxy
public class ZuulApplication {
    public static void main(String[] args) { 
        new SpringApplicationBuilder(
            ZuulApplication.class) 
            .web(true).run(args);
    }
}

此時,Zuul服務器已啟動,正在運行,并準備好處理使用Eureka注冊的請求。 默認情況下,功能區服務也將運行,作為負載平衡器,客戶端通過Zuul訪問該服務。

更新微服務/API

為了用Eureka注冊服務, 需要把@EnableDiscoveryClient注解加到應用程序的類中, 如下面的例子:

@SpringBootApplication
@EnableDiscoveryClient
public class Application {
    public static void main(String[] args) { 
        SpringApplication.run(Application.class, args);
    } 
}

當服務啟動時, 會開啟Eureka注冊, 這樣就可以通過Zuul網關服務器訪問Eureka。這時候,你可以引進服務的多個實例。這些實例會通過Zuul服務器中的Ribbon進行自動注冊和加載.

添加 Hystrix 和 Turbine 到 Mix 中

這時,客戶端可以通過Zuul服務來訪問你的服務。從監查的角度來看, 添加Hystrix和引入Eureka 及Zuul服務器一樣容易——只需啟動基礎Spring Boot應用,然后使用@EnableHystrixDashboard注解。

@SpringBootApplication
@Controller
@EnableHystrixDashboard
public class HystrixDashboardApplication extends 
SpringBootServletInitializer {
   public static void main(String[] args) { 
       new SpringgApplicationBuilder(
           HystrixDashboardApplication.class) 
           .web(true).run(args);
   } 
}

設置Turbine,添加@EnableTurbineAmqp注解到其他基礎Spring Boot應用:

@SpringBootApplication 
@EnableTurbineAmqp 
@EnableDiscoveryClient
public class TurbineApplication {
    public static void main(String[] args) { 
        new SpringApplicationBuilder(
            TurbineApplication.class).run(args);
    } 
}

增加"斷路器"功能

Netflix Hystrix 為此服務的使用者提供了斷路器功能。如果服務器停止響應,Hystrix 能夠把 API 調用重定向到此服務的內部方法中去。這樣,應用程序就能處理服務不響應的情況。

Hystrix 擁有以下功能:它能在此后的每次調用都打開回路并且“快速失敗”(忽略當前的服務調用只使用內部的方法),這種狀況將持續,直到服務變得可用為止。

Hystrix 產品提供了一個看板,能提供被監測的服務的動態列表。

在上面的 Hystrix 看板圖中,能看到 getMovie 這個 API 調用當前沒有響應,導致回路一直處于打開狀態,從而會一直調用已經配置好的回調方法。

為了在程序中使用"斷路器"功能,你需要在 Spring 啟動程序中添加使用 @EnableCircuitBreaker 注釋標簽。從那里,可以使用 @HystrixCommand() 注釋標簽,示例如下:

@HystrixCommand(fallbackMethod = "baseResults")
public ResponseEntity<List<Result>> getResults(Long id) {
    ...
}

public ResponseEntity<List<Result>> getBaseResults(Long 
id) {
    ... 
}

在上面的代碼示例中,當服務調用 getResults() 方法遇到服務超時的錯誤時候,getBaseResults() 方法就會被調用直到回路被關閉—— 一旦失敗的服務問題重新聯機,就會發生這種情況 。

挑戰

到了這一步,你的核心應用程序或API將作為一個擁有單個或多個實例的Spring Boot應用運行。 這些實例在Eureka服務中注冊,并為Zuul網關的請求提供服務,其中也包括用于負載平衡的Ribbon 。當一項服務停止響應時,由于網絡和服務的超時設定,Hystrix斷路器會打開并提供可用的后降方法。Netflix的Spring Cloud項目功能也相當不錯,但它也面臨著一些挑戰。

最大的挑戰是對開發者的影響,他們可能已經習慣于一種單一的應用程序服務實例運行。而現在,開發者不得不確保額外的兩個服務(Eureka和Zuul)運行——這就增加了本地開發的工作復雜度。

當然,依賴另一個通過Eureka傳達的服務也會讓工作變得復雜——這可能會使本地運行受限。在這種情況下,開發者或許會需要用另一個名字在Eureka上注冊一個當地服務器實例—— 當它與集中式配置服務一起使用時可能存在挑戰。

展望未來

本文的目的是回顧 Netfix Spring Cloud 項目包含的組件。因為 考慮到生產環境 ,此文故意省略了多個Zuul 和 Eureka 實例。此外,由于類似的原因,我沒有深入Spring 配置的細節,RabbitMQ 的使用,Hystrix 和 Turbine 的功能。

如果您的 API 或者微服務已經達到這一步,那么,由 Netflix 的 Spring Cloud 項目提供的特性和功能將使它成為不二之選,我強烈建議您為 解決方案多 花些時間,以 評估使用的開源軟件。盡管將您的服務轉換為 Spring Boot需要時間和精力,但是從長期收益來看,這短時間內的付出是值得的。

 

來自:https://www.oschina.net/translate/integration-the-spring-cloud-netflix-framework-int

 

 本文由用戶 sad10a 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!