繁体   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