Spring Возврат загрузочного привода DOWN
Когда я получаю доступ к конечной точке /health
из моего приложения загрузки Spring (1.2.4.RELEASE), он возвращает статус DOWN
:
{
status: "DOWN"
}
Существуют ли стартовые проекты или библиотеки, которые, как известно, перезаписывают статус? Есть ли другая причина (помимо написания пользовательской), почему она вернет DOWN
?
Ответы
Ответ 1
В свойствах Spring установите endpoints.health.sensitive = false
. Конечная точка /health
затем вернет список различных индикаторов работоспособности, и вы сможете отлаживать оттуда.
Для рабочей среды вы должны включить защиту вокруг конечной точки /health
.
Edit
Как указал Винсент ниже, вам также понадобится management.security.enabled = false
, если конечная точка работоспособности будет защищена, что по умолчанию используется в более поздних версиях Spring Boot.
Общей проблемой, которую я видел с помощью Spring Boot из коробки, является то, что она автоматически настраивает Solr, и без дополнительной настройки конечная точка /health
указывает, что Solr DOWN
. Легкий способ исправить это - отключить автокорреляцию Solr в приложении Application.java с помощью этой аннотации:
@SpringBootApplication(exclude={SolrAutoConfiguration.class})
Ответ 2
в моем случае мне понадобилось и эти свойства, чтобы получить более подробную информацию:
endpoints.health.sensitive: false
management.security.enabled: false
В противном случае все, что я получал, было статусом DOWN.
У меня возникла проблема с соединением RabbitMQ: мое приложение еще не использует его, но мы начали подключать какой-то код, связанный с ним. Приложение работает нормально, но мы получили статус здоровья DOWN, который был довольно озадачивающим: Spring Загрузка в журналах удивительно бесшумна, так как при запуске ошибка не отображается (мне, вероятно, придется изменить мою конфигурацию, чтобы сделать ее более подробной )
Ответ 3
Если URL-адрес работоспособности показывает "ВНИЗ" или HTTP 503 - ошибка недоступна службе, попробуйте добавить свойство ниже в application.properties
URL - http://localhost: 8080/привод/здоровье
management.endpoint.health.show-details=always
Теперь URL должен показывать больше, чем просто ВНИЗ. Если хост Solr недоступен, игнорируйте проверку Solr, используя приведенное ниже исключение:
@SpringBootApplication(exclude = { SolrAutoConfiguration.class })
Теперь здоровье должно подняться. Проверка работоспособности в основном DataSourceHealthIndicator, DiskSpaceHealthIndicator, CassandraHealthIndicator
внутреннюю проверку предварительно определенной проверки работоспособности (пример - DataSourceHealthIndicator, DiskSpaceHealthIndicator, CassandraHealthIndicator
и т.д.).
Если один из индикаторов работоспособности не работает, работоспособность будет ухудшаться, и вы сможете увидеть ошибку как ответ после добавления свойства, упомянутого выше, в application.properties.
Ответ 4
У меня была та же проблема с Springboot 2.1.0, где/привод/здоровье вернулся
{
status: "DOWN"
}
даже если приложение было.
Добавление
management.health.defaults.enabled=false
в файле свойств исправлена проблема.
Ответ 5
Ты, наверное, парень, использующий Consul 1.0. Существует известная проблема в Spring Could Consul 1.1.0 или около того с Consul 1.0. См. Это https://github.com/spring-cloud/spring-cloud-consul/issues/365, и это - https://github.com/hashicorp/consul/issues/3635
Вам нужно будет перейти на Spring Could Consul 1.3.0.RELEASE.
Ответ 6
По этой ссылке: https://github.com/indrabasak/spring-consul-example/blob/master/client/README.md, мы должны строго использовать указанные ниже свойства, чтобы избежать ошибки ниже.
management.security.enabled=false
management.health.consul.enabled=false
![enter image description here]()
Ответ 7
Я добавил эти 2 свойства
endpoints.health.sensitive = false
management.security.enabled = false
Не использовать статус по-прежнему ниже application.properties
, как показано ниже
server.port=8098
server.host=localhost
spring.application.name=school-service
spring.cloud.consul.host=http://dockerhost
spring.cloud.consul.port=8500
endpoints.health.sensitive=false
management.security.enabled=false
spring.cloud.consul.enabled=true
spring.cloud.consul.discovery.enabled=true
spring.cloud.consul.discovery.register=true
endpoints.restart.enabled= true
endpoints.shutdown.enabled=true
Любые просьбы?
Статус возвращается как всегда
{"status":"DOWN","diskSpace":{"status":"UP","total":241207078912,"free":63632199680,"threshold":10485760},"refreshScope":{"status":"UP"},"consul":{"status":"DOWN","services":{"consul":[],"school-service":[],"student-service":[]},"error":"java.lang.IllegalArgumentException: Value must not be null"},"hystrix":{"status":"UP"}}
Мой pom.xml находится ниже
<?xml version="1.0" encoding="UTF-8"?>
http://maven.apache.org/xsd/maven-4.0.0.xsd" > 4.0.0
<groupId>com.example.howtodoinjava</groupId>
<artifactId>spring-cloud-consul-school</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-cloud-consul-school</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Camden.SR7</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Ответ 8
Я получил это исправлено с помощью кода ниже.
Написал контроллер, который принимает отображение "/private/health" (вместо него можно использовать /health).
import io.swagger.annotations.Api;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping
@Api(value = "Heath Service Health", description = "Heath Service Health")
public class HeathController {
@GetMapping(value = "/private/health")
@ResponseStatus(HttpStatus.OK)
HealthStatusDto healthCheck() {
return HealthStatusDto.builder().status("UP").build();
}
}
Ниже класс не является обязательным. Вместо возврата HealthStatusDto в вышеприведенном контроллере вы можете вернуть любое другое сообщение в виде строки.
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@Data
@AllArgsConstructor
@Builder
public final class HealthStatusDto {
private final String status;
}
Добавьте ниже конфиг в application.yml
# actuator
# Disable Spring security
management:
security:
enabled: false
# Disable actuators
endpoints:
actuator:
enabled: false
enabled: false
Надеюсь это поможет
Ответ 9
Я построил фильтр для регистрации реакции на состояние здоровья при сбое.
package br.gov.go.sspj.k9.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class BadHealthCheckLogFilter implements Filter {
private @Autowired HealthMvcEndpoint hme;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (req.getRequestURI().endsWith("/health") && res.getStatus() != 200)
log.error(hme.invoke(req, null).toString());
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
Ответ 10
Если вы только что добавили конечную точку, и она не проверена, может быть, что-то из проверок по умолчанию не работает, см. ссылку link, чтобы увидеть, что проверено по умолчанию. в моем случае я забыл запустить эластичный, поэтому проверка работоспособности показала "вниз", поскольку Рашми указал, что вы можете отключить настройки по умолчанию management.health.defaults.enabled=false
, но лучше найти реальную причину, почему