天天看點

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

NOTE:本部落格示範的代碼可以去github下載下傳:https://github.com/aharddreamer/chendong.git

上節我們示範了簡單的将微服務釋出Eureka與互相之間的調用,還示範了Eureka的叢集及負載均衡功能。這節我們要學習Eureka更進階一點的功能—微服務執行個體的健康自檢。

在預設情況下,Eureka用戶端(微服務提供者或調用者)會每隔30秒發送一次心跳給Eureka伺服器,告訴伺服器自己是否是存活狀态,但是實際情況可能會這樣:用戶端出現了部分異常,服務已經不可用了,但是還在正常的向伺服器發送心跳,因為很顯然,即使某個接口不能用了整個微服務還并沒有挂掉。比如資料庫連接配接中斷 或者依賴的上遊系統挂了等等。

那麼,我們就需要一個健康自檢機制,更加智能的處理這種問題。剛好 Eureka提供了這麼一種功能—健康檢查控制器。

本節示範的項目結構 (沒有建過項目的同學請看我上一節部落格):

eureka-server

first-service-provider

first-service-invoker

修改first-service-provider 項目的POM,我們要加入下面依賴:

<dependency>

   <groupId>org.springframework.boot</groupId>

   <artifactId>spring-boot-starter-actuator</artifactId>

   <version>1.5.3.RELEASE</version>

</dependency>

加好之後,啟動first-service-provider試試。我在啟動的時候報了一個jackson包未找到的錯誤,于是我又加入下面的依賴:

   <groupId>com.fasterxml.jackson.core</groupId>

   <artifactId>jackson-core</artifactId>

   <version>2.9.8</version>

   <artifactId>jackson-databind</artifactId>

PS: POM加完依賴之後,如果你用的IDE是Intellij IDEA,那麼修改POM後右下角會出現一個彈出框,請點選Import Changes,這樣依賴就會自動下載下傳了。

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

如果是eclipse,修改完POM之後,請選中POM 右鍵->update maven project.

依次啟動eureka-server和first-service-provider.

啟動完之後,在浏覽器輸入: http://localhost:8080/health

可以看到浏覽器傳回如下:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

說明該REST服務向外展示目前應用的狀态為UP (服務正常)。

接下來我們要試試actuator自帶的健康自檢功能。

在first-service-provider裡面建立一個Controller,我們要在這裡面寫一個測試的接口:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

定義了一個變量,通路的時候通過控制這個變量來表示資料庫的連接配接狀态。

True表示目前資料庫連接配接良好

False表示目前資料庫連接配接中斷

建立一個類,這個類實作了HealthIndicator接口,講實作它的一個health方法,這個方法是用來建構目前微服務狀态的。我們要做的就是當資料庫連接配接中斷(dbConnectionIsOk=false)的時候,來調整目前微服務的狀态為DOWN。

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

好了,重新啟動first-service-provider試試,然後通路http://localhost:8080/health 接口看看。會發現開始目前微服務狀态為DOWN:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

然後通過測試接口,修改狀态為true:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

再通路health接口試試:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

可以看到服務已經起來了。

光這樣的話隻有服務提供者自己知道目前健康狀态,我們還需要将之告訴伺服器,然後在Eureka伺服器上注冊的其他微服務将拿不到這些“生病”的微服務。

建立一個健康檢查處理器,處理器會将健康狀态儲存在記憶體,一旦狀态發生改變将報告給伺服器,如果狀态不正常,其他微服務也就拿不到它了。

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

NOTE: 注意都不要忘了加@Component注解哦,要加入到Spring的容器托管,不然不會起作用的。

改好之後,再啟動first-service-provider,啟動的過程中可以看到控制台列印的“資料庫連接配接異常”資訊,這是因為dbConnectionIsOk變量的初始值是false。啟動完了之後通路Eureka Server看看:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

可以看到目前first-service-provider是DOWN的,被紅色标記出來了。

我們通過測試接口改下狀态:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

咦!為啥還是DOWN的?

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

嚯嚯,是因為傳狀态給伺服器的動作是定時執行的,并不是實時執行,預設是30秒鐘一次,是以等待30秒鐘再看看:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

可以發現,它已經UP了。

那麼我們怎麼修改這個預設時間呢?可以再application.properties裡面加入這個屬性:

eureka.client.instance-info-replication-interval-seconds=10

這樣就能将時間限制為10秒了。如果是application.yml檔案,那就是這樣的:

eureka.client.instanceInfoReplicationIntervalSeconds: 10

自己動手試試吧!

接下來,示範一下微服務查詢。

這次我們要修改的是first-service-invoker(調用者) 的代碼來看看健康自檢的效果。

在first-service-invoker裡面加一個測試接口,代碼如下:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

啟動first-service-invoker, 在浏覽器輸入:http://localhost:9000/testHealth 就可以看到各個服務的狀态了

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

我來美化一下:

三、Spring Cloud 之旅 -- Eureka 服務執行個體的健康自檢

網絡上志同道合,我們一起學習網絡安全,一起進步,QQ群:694839022