簡體   English   中英

Spring 引導:如果 DataSource 為 DOWN,則在 ResponseEntity 中返回 503 HttpStatus 的最佳方式

[英]Spring Boot: Best way to return 503 HttpStatus in ResponseEntity if the DataSource is DOWN

我正在使用Spring Boot 2.2.4.RELEASE我有一個 REST api,暴露了幾個端點。 如果數據庫已關閉,我想向調用者返回503

如果配置了DataSource等,我可以使用Spring Boot免費提供的DataSourceHealthIndicator ,如下所示:

 import org.springframework.boot.actuate.health.Status; @Autowired private DataSourceHealthIndicator d; @PostMapping(value = "/{id}") public ResponseEntity<jsonResponse> someMethod()( @PathVariable String id, @Valid @RequestBody SomeDto someDto) { //some code if(Status.DOWN.getCode().equals(d.getHealth(false).getStatus().getCode())) { return new ResponseEntity<>(jsonResponse, HttpStatus.SERVICE_UNAVAILABLE); }

有沒有更好的方法來做到這一點,因為我相信每次調用端點時它都會觸及數據庫,因此可能是一種昂貴的做法。

如果您預計會有大量請求,您可以考慮一個單獨的線程(數據庫健康狀態),它每 X 秒 ping 一次數據庫。 這樣,傳入的 HTTP 請求如果您知道它不可用,則不需要命中 DB。

如果您的容量不大,但最好嘗試連接並處理不可用的數據庫情況,這樣您確實需要額外的線程,並且一旦數據庫再次可訪問,請求就會恢復工作(同時使用線程根據您配置的時間間隔,您可能會有輕微的延遲)。

DataSource 通常會為您驗證連接並在無法獲得連接時拋出異常,因此您可以為拋出的特定異常類型創建自定義錯誤處理程序,並使用它返回帶有 503 的自定義響應實體。

唯一需要注意的是異常是SQLException ,它可能是與連接無關的任意數量的問題。 您的錯誤處理程序需要足夠聰明才能理解SQLException中的哪些錯誤代碼真正意味着不可用。

如果您想依賴 Spring 引導解決方案,那么我建議 Spring 緩存https://spring.io/guides/gs/caching/

添加 Maven 依賴項<artifactId>spring-boot-starter-cache</artifactId> ,在 SpringBoot 應用程序 class 中使用@EnableCaching啟用緩存,然后定義哪些方法應該緩存結果。
此方法只會在第一次調用期間訪問數據庫,所有其他調用都依賴於緩存的值。

 @Cacheable("records") public Record getByName(String name) { return getRecordRepository().findByName(name); }

如果使用 Spring 本機(內存中)緩存,您需要在某個時候驅逐對象以確保您不會保存過時的數據(除非它是只讀的 object 永遠不會改變,這可能不是一個非常常見的用例)。

在您的場景中(如果我理解正確),您可以有一個線程,然后每 x 秒檢查一次數據庫,如果健康,您可以使用專用方法驅逐緩存:

 @CacheEvict(allEntries = true, cacheNames = { "records"}) public void evictAllRecords() { // evict all records every 10 minutes }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM