SofaBoot簡介及程序搭建

SOFABoot 是螞蟻金服開源的基於 Spring Boot 的研發框架,它在 Spring Boot 的基礎上,提供了諸如 Readiness Check,類隔離,日誌空間隔離等等能力。在增強了 Spring Boot 的同時,SOFABoot 提供了讓用戶可以在 Spring Boot 中非常方便地使用 SOFAStack 相關中間件的能力。

一、背景

Spring Boot 是一個非常優秀的開源框架,可以非常方便地就構建出一個基於 Spring 的應用程序,但是在使用過程中,還是會遇到一些問題:

  • Spring Boot 提供了一個基礎的健康檢查的能力,中間件和應用都可以擴展來實現自己的健康檢查邏輯。但是 Spring Boot 的健康檢查只有 Liveness Check 的能力,缺少 Readiness Check 的能力,這樣會有比較致命的問題。當一個微服務應用啓動的時候,必須要先保證啓動後應用是健康的,纔可以將上游的流量放進來(來自於 RPC,網關,定時任務等等流量),否則就可能會導致一定時間內大量的錯誤發生。
  • Spring Boot 雖然通過依賴管理(Dependency Management)的方式最大程度的保證了 Spring Boot 管理的 JAR 包之間的兼容性,但是不可避免的,當引入一些其他的 JAR 包的時候,還是可能會遇到衝突,而且很多時候這種衝突解決起來並不是這麼容易,一個例子是當衝突的包是序列化相關的類庫時,比如說 Hessian,如果應用中的一個組件需要使用 Hessian 3,而另一個則必須要使用 Hessian 4,由於 Hessian 3 和 Hessian 4 之間的不兼容性,並且序列化還涉及到微服務中的上下游服務,要把 Hessian 統一到一個版本絕非易事。
  • 在超大規模微服務運維的場景下,運維能力的平臺化是一定要解決的問題,而監控又是其中非常主要的一個點,針對於日誌監控這種情況,Spring Boot 並沒有提供任何解決方案。大部分的開源組件,具體要打印哪些日誌,打印到什麼路徑,什麼文件下面,都是由應用的使用者來決定,這樣會導致每一個應用的日誌配置都各式各樣,每一個應用都需要去監控系統中配置自己應用的日誌監控,導致關鍵的監控的實施成本特別高。

爲了解決以上的問題,又因爲 SOFAStack 中的諸多中間件本身就需要集成 Spring Boot,所以螞蟻金服基於 Spring Boot 開發並開源了 SOFABoot,來解決以上的問題,也方便使用者在 Spring Boot 中方便地去使用 SOFAStack 中間件。

二、功能簡介

爲了解決 Spring Boot 在實施大規模微服務架構時候的問題,SOFABoot 提供了以下的能力:

2.1 增強 Spring Boot 的健康檢查能力

針對 Spring Boot 缺少 Readiness Check 能力的情況,SOFABoot 增加了 Spring Boot 現有的健康檢查的能力,提供了 Readiness Check 的能力。利用 Readiness Check 的能力,SOFAStack 下各種中間件只有在 Readiness Check 通過之後,纔將流量引入到應用的實例中,比如 RPC,只有在 Readiness Check 通過之後,纔會向服務註冊中心註冊,後面來自上游應用的流量纔會進入。

除了中間件可以利用 Readiness Check 的事件來控制流量的進入之外,PAAS 系統也可以通過訪問 http://localhost:8080/health/readiness 來獲取應用的 Readiness Check 的狀況,用來控制例如負載均衡設備等等的流量。

2.2 提供類隔離的能力

爲了解決 Spring Boot 下的類依賴衝突的問題,SOFABoot 基於 SOFAArk 提供了 Spring Boot 上的類隔離的能力,在一個 SOFABoot 的系統中,只要引入 SOFAArk 相關的依賴,就可以將 SOFAStack 的中間件相關的類和應用相關的類的 ClassLoader 進行隔離,防止出現類衝突。當然,用戶也可以基於 SOFAArk,將其他的中間件、第三方的依賴和應用的類進行隔離。

2.3 日誌空間隔離能力

爲了統一大規模微服務場景下的中間件日誌的打印,SOFABoot 提供了日誌空間隔離的能力給各個 SOFAStack 的中間件,各個 SOFAStack 的中間件採用日誌空間隔離的能力之後,自動就會將本身的日誌和應用的普通日誌隔離開來,並且打印的日誌的路徑也是相對固定,非常方便進行統一地監控。

2.4 SOFAStack 中間件的集成管理

基於 Spring Boot 的自動配置能力,SOFABoot 提供了 SOFAStack 中間件統一易用的編程接口以及 Spring Boot 的 Starter,方便在 Spring Boot 環境下使用 SOFAStack 中間件,每一個 SOFAStack 中間件都是獨立可插拔的組件,節約開發時間,和後期維護的成本。

下滿我們創建一個 Spring Boot 的工程,引入 SOFABoot 基礎依賴,並且引入 SOFABoot 的健康檢查擴展能力,演示如何快速上手 SOFABoot。

環境準備

要使用 SOFABoot,需要先準備好基礎環境,SOFABoot 依賴以下環境:

  • JDK7 或 JDK8
  • 需要採用 Apache Maven 2.2.5 或者以上的版本來編譯

創建工程

SOFABoot 是直接構建在 Spring Boot 之上,因此可以使用 Spring Boot 的工程生成工具 來生成,在本文檔中,我們需要添加一個 Web 的依賴,以便最後在瀏覽器中查看效果。

引入 SOFABoot

在創建好一個 Spring Boot 的工程之後,接下來就需要引入 SOFABoot 的依賴,首先,需要將上文中生成的 Spring Boot 工程的 zip 包解壓後,修改 maven 項目的配置文件 pom.xml,將

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>${spring.boot.version}</version>
    <relativePath/> 
</parent>

替換爲:

<parent>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>sofaboot-dependencies</artifactId>
    <version>2.3.1</version>
</parent>

 

然後,添加一個 SOFABoot 健康檢查擴展能力的依賴:

<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>healthcheck-sofa-boot-starter</artifactId>
</dependency>

 

最後,在工程的 application.properties 文件下添加一個 SOFABoot 必須要使用的參數,包括spring.application.name 用於標示當前應用的名稱;logging path 用於指定日誌的輸出目錄。

#Application Name
spring.application.name=SOFABoot Demo
# logging path
logging.path=./logs

運行

可以將工程導入到 IDE 中運行生成的工程裏面中的 main 方法(一般上在 XXXApplication 這個類中)啓動應用,也可以直接在該工程的根目錄下運行 mvnw spring-boot:run,將會在控制檯中看到啓動打印的日誌:

2018-04-05 21:36:26.572  INFO ---- Initializing ProtocolHandler ["http-nio-8080"]
2018-04-05 21:36:26.587  INFO ---- Starting ProtocolHandler [http-nio-8080]
2018-04-05 21:36:26.608  INFO ---- Using a shared selector for servlet write/read
2018-04-05 21:36:26.659  INFO ---- Tomcat started on port(s): 8080 (http)

可以通過在瀏覽器中輸入 http://localhost:8080/sofaboot/versions 來查看當前 SOFABoot 中使用 Maven 插件生成的版本信息彙總,結果類似如下:

[
  {
    GroupId: "com.alipay.sofa",
    Doc-Url: "https://github.com/alipay/sofa-boot",
    ArtifactId: "infra-sofa-boot-starter",
    Built-Time: "2018-04-05T20:55:26+0800",
    Commit-Time: "2018-04-05T20:54:26+0800",
    Commit-Id: "049bf890bb468aafe6a3e07b77df45c831076996",
    Version: "2.3.1"
  }
]

 

可以通過在瀏覽器中輸入 http://localhost:8080/health/readiness 查看應用 Readiness Check 的狀況,類似如下:

{
  status: "UP",
  sofaBootComponentHealthCheckInfo: {
    status: "UP"
  },
  springContextHealthCheckInfo: {
    status: "UP"
  },
  DiskSpace: {
    status: "UP",
    total: 250140434432,
    free: 22845308928,
    threshold: 10485760
  }
}

 

status: "UP" 表示應用 Readiness Check 健康的。可以通過在瀏覽器中輸入 http://localhost:8080/health 來查看應用的運行時健康狀態(可能會隨着時間發生變化)。

查看日誌

在上面的 application.properties 裏面,我們配置的日誌打印目錄是 ./logs 即當前應用的根目錄(我們可以根據自己的實踐需要配置),在當前工程的根目錄下可以看到類似如下結構的日誌文件:

./logs
├── health-check
│   ├── sofaboot-common-default.log
│   └── sofaboot-common-error.log
├── infra
│   ├── common-default.log
│   └── common-error.log
└── spring.log

如果應用啓動失敗或者健康檢查返回失敗,可以通過相應的日誌文件找到錯誤的原因,有些需要關注 common-error.log 日誌。

測試

我們知道,SpringBoot 官方提供了和 JUnit4 集成的 SpringRunner, 用於集成測試用例的編寫; 在 SOFABoot 中,依然可以使用原生的 SpringRunner, 但是推薦使用 SOFABoot 自帶的 SofaBootRunner 以及 SofaJUnit4Runner 編寫集成測試和單元測試;應用需要額外引入如下 Starter:

<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>test-sofa-boot-starter</artifactId>
</dependency>

需要注意的是,如果需要使用 SOFABoot 的類隔離的能力,則必須需要引入上述的依賴,並且使用 SofaBootRunner 和 SofaJUnit4Runner 來測試。

本文轉載自--https://www.xttblog.com/?p=2677

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